Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wp export is not exporting term meta data #42

Open
sudar opened this issue Jul 26, 2018 · 4 comments
Open

wp export is not exporting term meta data #42

sudar opened this issue Jul 26, 2018 · 4 comments

Comments

@sudar
Copy link

sudar commented Jul 26, 2018

The wp export command is not exporting term meta data.

But the WXR file created directly from wp-admin ui (Tools -> Export) includes the term meta data.

Steps to reproduce

  • Add term meta data to a specific term using either the update_term_meta or add_term_meta function
  • Verify that this data is present in wp_termmeta table
  • Export the contents of the site by running the wp export command
  • The exported WXR file will not have this term meta data. This can be confirmed by doing a grep for wp:termmeta
  • Alternatively export from wp-admin ui by going to Tools -> Export
  • The exported WXR file will contain the term meta data. This can be confirmed by doing a grep for wp:termmeta
@LittleSnake42
Copy link

Up please ;)

I'm gonna try to quick fix it for now.

WP does it in includes/export.php on line 312

Here's the code :

/**
	 * Output term meta XML tags for a given term object.
	 *
	 * @since 4.6.0
	 *
	 * @param WP_Term $term Term object.
	 */
	function wxr_term_meta( $term ) {
		global $wpdb;

		$termmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id ) );

		foreach ( $termmeta as $meta ) {
			/**
			 * Filters whether to selectively skip term meta used for WXR exports.
			 *
			 * Returning a truthy value to the filter will skip the current meta
			 * object from being exported.
			 *
			 * @since 4.6.0
			 *
			 * @param bool   $skip     Whether to skip the current piece of term meta. Default false.
			 * @param string $meta_key Current meta key.
			 * @param object $meta     Current meta object.
			 */
			if ( ! apply_filters( 'wxr_export_skip_termmeta', false, $meta->meta_key, $meta ) ) {
				printf( "\t\t<wp:termmeta>\n\t\t\t<wp:meta_key>%s</wp:meta_key>\n\t\t\t<wp:meta_value>%s</wp:meta_value>\n\t\t</wp:termmeta>\n", wxr_cdata( $meta->meta_key ), wxr_cdata( $meta->meta_value ) );
			}
		}
	}

@LittleSnake42
Copy link

LittleSnake42 commented Jun 5, 2019

Edit.
I added the following function (same as comment_meta()) :

protected function term_meta($term)
	{
		global $wpdb;
		$termmeta = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->termmeta WHERE term_id = %d", $term->term_id));
		if (!$termmeta) {
			return new Oxymel();
		}
		$oxymel = new WP_Export_Oxymel_Snake();
		foreach ($termmeta as $meta) {
			$oxymel->tag('wp:termmeta')->contains
				->tag('wp:meta_key', $meta->meta_key)
				->tag('wp:meta_value')->contains->cdata($meta->meta_value)->end
				->end;
		}
		return $oxymel;
	}

And it is called here :

->oxymel($this->term_meta($term));


	protected function terms($terms)
	{
		$oxymel = new WP_Export_Oxymel_Snake();
		foreach ($terms as $term) {
			$term->parent_slug = $term->parent ? $terms[$term->parent]->slug : '';
			$oxymel->tag('wp:term')->contains
				->tag('wp:term_id', $term->term_id)
				->tag('wp:term_taxonomy', $term->taxonomy)
				->tag('wp:term_slug', $term->slug)
				->oxymel($this->term_meta($term));

			if ('nav_menu' !== $term->taxonomy) {
				$oxymel
					->tag('wp:term_parent', $term->parent_slug);
			}

			$oxymel
				->optional_cdata('wp:term_name', $term->name)
				->optional_cdata('wp:term_description', $term->description)
				->end;
		}
		return $oxymel->to_string();
	}

@Kerfred
Copy link

Kerfred commented Jun 13, 2024

I take this issue.

@Kerfred
Copy link

Kerfred commented Jun 13, 2024

I have done the test manually with success.
I have also tested successfully the import of the exported XML file.

The command composer behat doesn't work on my computer. It always returns this error ERROR 1045 (28000): Access denied for user 'wp_cli_test'@'localhost' (using password: YES)
So I could not run the automatic tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants