Custom Taxonomies not retaining hierarchy while importing from one site to another

On my site I have a Custom Post Type “listing” which has a hierarchial Taxonomy “local”.

The terms in this taxonomy are in the form of States > Cities.

Read More

For example “Washington” is a parent term & Arlington, Auburn, Davenport etc could be it’s child taxonomies.

Now when I export & import this Custom Post Type to another site, my child level taxonomies become top level taxonomies, they no longer retain the hierarchy.

I have used code in functions.php to create these, no plugins. What am I doing wrong?

Related posts

1 comment

  1. I understand your problem and had to work around it as well: wp_insert_term() doesn’t handle parent/children connections.

    You can check this with the following:

    $tax = 'category';
    $terms = get_terms( array( $tax ) );
    
    $children_to_update = array();
    
    foreach ( $terms as $term )
    {
        $checked_term = get_term_by( 'name', $term, $tax );
    
        // ... retrieve parent here ...
    
        if ( ! $checked_term )
        {
            $term_data = wp_insert_term(
                $term,
                $tax,
                array( 'parent' => $parent )
            );
            if (
                is_array( $term_data )
                AND ! is_wp_error( $term_data )
                AND '0' !== $parent
            )
                $children_to_update[ $parent ][] = $term_data['term_id'];
        }
    }
    // inspect result
    var_dump( $children_to_update );
    

    You will see that it stays empty. The reason is simple: There’s an Option that holds this information. You’ll need to update it as well:

    $option = get_option( "{$tax}_children" );
    foreach( $children_to_update as $new_p => $new_c )
    {
        if ( ! array_key_exists( $new_p, $option ) )
        {
            $option[ $new_p ] = $new_c;
        }
        else
        {
            foreach ( $new_c as $c )
            {
                if ( ! in_array( $c, $option[ $new_p ] ) )
                    $option[ $new_p ][] = $c;
            }
        }
    }
    update_option( "{$tax}_children", $option );
    

    At first I didn’t get that the hierarchy didn’t work, but when you look at the taxonomy overview page in the admin UI, then you’ll see that the terms are not aligned like the should (in child/parent lists).

Comments are closed.