Inserindo termos em uma taxonomia hierárquica

16

Estou realmente tendo alguns problemas com a inserção de termos. Aqui está o meu cenário: Eu tenho uma taxonomia chamada veda_release_type:

//Release Type and Region
        $labels = array(
            'name'=> _x('Release Types/Regions', 'taxonomy general name' ),
            'singular_name' => _x('Release Type/Region', 'taxonomy singular name'),
            'search_items' => __('Search Release Types/Regions'),
            'popular_items' => __('Popular Release Types/Regions'),
            'all_items' => __('All Release Types/Regions'),
            'edit_item' => __('Edit Release Type/Regions'),
            'edit_item' => __('Edit Release Type/Region'),
            'update_item' => __('Update Release Type/Region'),
            'add_new_item' => __('Add New Release Type/Region'),
            'new_item_name' => __('New Release Type/Region Name'),
            'separate_items_with_commas' => __('Seperate Release Types/Regions with Commas'),
            'add_or_remove_items' => __('Add or Remove Release Types/Regions'),
            'choose_from_most_used' => __('Choose from Most Used Release Types/Regions')
        );
        $args = array( 
            'hierarchical' =>true,  
            'labels' => $labels,  
            'query_var' => true,  
            'rewrite' => array('slug' =>'release_type')     
        );
        register_taxonomy('veda_release_type', 'veda_release',$args);

É obviamente hierárquico. Nível superior contém tipos de lançamento ieDVD, blu-ray. O nível abaixo disso é regiões ie. Região 1, Região 2, etc. Então, a Hierarquia que eu quero é: DVD - linha 0 - região 1 - região 2 - região 3 - região 4 - região 5 - região 6 Blu-Ray - região A - região B - região C

Eu criei uma função chamada insert_term na minha classe para verificar se existe um termo e insira-o se não existir:

public function insert_term ($term, $taxonomy, $args = array()) {
        if (isset($args['parent'])) {
            $parent = $args['parent'];
        } else {
            $parent = 0;
        }
        $result = term_exists($term, $taxonomy, $parent);
        if ($result == false || $result == 0) {
            return wp_insert_term($term, $taxonomy, $args);             
        } else {
            return (array) $result;
        }       
}

E então eu chamo a dita função para inserir os termos:

    $dvd = $this->insert_term('DVD','veda_release_type');
    $this->insert_term('Region 0','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 1','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 2','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 3','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 4','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 5','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 6','veda_release_type',array('parent'=>$dvd['term_id']));

    $bd = $this->insert_term('Blu-Ray', 'veda_release_type');
    $this->insert_term('Region A','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region B','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region C','veda_release_type',array('parent'=>$bd['term_id']));

O problema que estou tendo é que, embora os termos sejam inseridos no banco de dados, eles não aparecem na página de taxonomia. No máximo, os termos de nível superior aparecem. Eu tenho que tentar várias coisas até que isso force o WordPress a reconhecer os termos do subnível. Alguém se deparou com isso ou pode recomendar uma maneira melhor?

EDITAR: Notei outra coisa: eu tentei apagar os termos do banco de dados, em seguida, desativar e reativar o plugin que declara os termos. Os dois termos pai aparecem na página de termos, mas os termos filhos não. Os termos filhos DO aparecem no menu suspenso "Pai", onde você deseja criar um novo termo. Quando adiciono um termo cujo pai é um dos termos filhos e atualizo a página, ENTÃO aparecem os termos filhos.

    
por Manny Fleurmond 02.02.2011 / 13:52

6 respostas

25

A hierarquia é armazenada em cache e não é invalidada corretamente. Este é um bug, ainda não resolvido a partir do WP 3.1.

Uma solução alternativa seria chamar delete_option("{$taxonomy}_children"); diretamente.

Veja a função _get_term_hierarchy ().

    
por scribu 09.02.2011 / 00:55
6

Meus 2 centavos - Estou criando uma extensão para o plug-in WooCommerce que permite o gerenciamento de categorias / produtos de catálogo por meio de um arquivo CSV carregado. Eu me deparei com esse mesmo problema ao gerar as categorias. A solução para limpar as categorias do WooCommerce em cache era chamar delete_option("product_cat_children"); após o loop que cria as categorias e subcategorias. Espero que isso ajude alguém!

    
por BWDesign 28.11.2012 / 20:28
2

Você pode estar recebendo um objeto de volta de term_exists($term, $taxonomy, $parent) se a taxonomia estiver definida quando chamada. Está definido no código de amostra que você postou, então estou assumindo que esse é o problema.

Suas instruções inserções estão esperando um array quando elas referenciam as chaves.

Por exemplo.

$bd['term_id']
$dvd['term_id']

.. mas você pode estar recebendo um objeto de volta de term_exists .

Uma maneira rápida de determinar se esse é o problema seria atualizar essa linha.

return $result;

para ..

return is_object( $result ) ? (array) $result : $result;

Se eu estiver certo e esse é o problema, isso deve consertar, embora eu não chame isso de uma solução elegante.

Espero que essa seja a resposta / ajuda que você estava procurando ...:)

    
por t31os 02.02.2011 / 14:43
1

Obrigado. Essa questão ajudou muito. Eu estava lutando com testes de unidade e descobri que tinha que fazer

delete_option('veda_release_type');
wp_cache_flush();

depois de adicionar minhas categorias de nível superior e, em seguida, faça-o novamente depois de adicionar as categorias de segundo nível para permitir que o wordpress limpe tudo e deixe os testes de unidade passarem. Isso funciona em torno da necessidade de uma "segunda carga de página / atualização extra" mencionada em outra resposta aqui.

    
por Steve 25.02.2013 / 02:06
1

minha solução:

(talvez tenha sido necessário limpar os registros de cache ...)

$PARENT_CAT= wp_insert_term('Parent_category_NAME','category',  array('slug'=> 'Parent_category_NAME'));
delete_option("category_children");
wp_cache_flush();

    $child= wp_insert_term('children_category_NAME','category',array( 'slug'=>'children_category_NAME', 'parent' =>$PARENT_CAT['term_id']));
    delete_option("category_children");
    wp_cache_flush();
    
por T.Todua 26.11.2013 / 18:13
0

Apenas uma atualização final: isso foi corrigido no caminho de volta no WP 3.9: enlace

    
por Manny Fleurmond 22.12.2017 / 05:14