Inserindo termos em uma taxonomia hierárquica

17

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. O nível superior contém tipos de versão, como DVD, blu-ray. O nível abaixo disso são regiões, ie. Região 1, Região 2, etc. Portanto, a Hierarquia que eu quero é: DVD - Região 0 - Região 1 - Região 2 - 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 referida 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 são exibidos. Eu tenho que tentar várias coisas até que isso força o WordPress a reconhecer os termos do subnível. Alguém já se deparou com isso ou pode recomendar uma maneira melhor?

EDIT: Notou outra coisa: tentei excluir os termos do banco de dados, desativar e reativar o plug-in que declara os termos. Os dois termos pai aparecem na página de termos, mas os termos filhos não. Os termos filhos 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 os termos filhos são exibidos. insira a descrição da imagem aqui

Manny Fleurmond
fonte
Depois de fazer algumas pesquisas, parece que isso pode ter algo a ver com os termos cache. Não tenho certeza se ou como posso limpar o cache de forma consistente para atualizá-lo.
Manny Fleurmond

Respostas:

25

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

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

Veja a função _get_term_hierarchy ().

scribu
fonte
Tive a sensação de que era um problema de cache. Devo inserir isso antes ou depois de inserir cada criança?
Manny Fleurmond
2
Faz uma atualização extra, mas colocar o código delete_option depois de inserir todos os termos filhos faz o truque. Obrigado, scribu. Valeu a pena os pontos de repetição que desisti. Esperemos que esta ajuda os outros com problemas semelhantes
Manny Fleurmond
Obrigado! Passei apenas 4 horas nisso. Assim que cheguei à ideia de fazer uma diferença do banco de dados antes e depois de adicionar um termo através da GUI do administrador, vi a opção e sabia o que o Google viria aqui.
Por Wiklander
6

Meus 2 centavos - estou construindo uma extensão para o plug-in WooCommerce que permite o gerenciamento de categoria / produto de catálogo por meio de um arquivo CSV carregado. Corri para esse mesmo problema ao gerar as categorias. A solução para limpar as categorias em cache do WooCommerce foi ligar delete_option("product_cat_children");após o loop que cria as categorias e subcategorias. Espero que isso ajude alguém!

BWDesign
fonte
2

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

Suas instruções de inserções estão esperando uma matriz quando fazem referência a chaves.

Por exemplo.

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

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

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

return $result;

para..

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

Se estou certo e esse é o problema, isso deve corrigi-lo, embora eu não chame isso de uma correção elegante.

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

t31os
fonte
Desculpe pelo atraso na resposta. Obrigado por capturar isso, mas acho que não resolveu o problema que tive.
Manny Fleurmond
1

Obrigado. Esta pergunta 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 fazê-lo novamente depois de adicionar as categorias de segundo nível para permitir que o wordpress limpe tudo e permita que os testes de unidade sejam aprovados. Isso soluciona a necessidade de um "carregamento de segunda página / atualização extra" referido em outra resposta aqui.

Steve
fonte
1

minha solução:

(talvez fosse 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();
T.Todua
fonte
Por favor, explique sua resposta e também publique o código.
#