wp-cli / export-command

Exports WordPress content to a WXR file.
MIT License
12 stars 27 forks source link

wp export is not exporting term meta data #42

Open sudar opened 6 years ago

sudar commented 6 years ago

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

LittleSnake42 commented 5 years ago

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 commented 5 years ago

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 commented 2 months ago

I take this issue.

Kerfred commented 2 months ago

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.