계층 적 분류 체계에 용어 삽입


17

용어를 삽입하는 데 실제로 몇 가지 문제가 있습니다. 시나리오는 다음과 같습니다. 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);

분명히 계층 적입니다. 최상위 레벨에는 DVD, blu-ray와 같은 릴리스 유형이 포함됩니다. 그 아래 수준은 지역입니다. 지역 1, 지역 2 등 내가 원하는 계층은 다음과 같습니다. DVD-지역 0-지역 1-지역 2-지역 3-지역 4-지역 5-지역 6 Blu-Ray- -지역 A-지역 B-지역 C

클래스에 insert_term이라는 함수를 만들어서 용어가 있는지 확인한 다음 존재하지 않는 경우 삽입합니다.

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;
        }       
}

그런 다음 해당 함수를 호출하여 용어를 삽입합니다.

    $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']));

내가 겪고있는 문제는 데이터베이스에 용어가 입력되었지만 분류 페이지에 표시되지 않는다는 것입니다. 기껏해야 최상위 용어가 나타납니다. WordPress에서 하위 수준 용어를 인식하게 할 때까지 다양한 작업을 시도해야합니다. 누구든지 이것에 부딪 치거나 더 나은 방법을 추천 할 수 있습니까?

편집 : 다른 것을 알아 냈습니다 : 데이터베이스에서 용어를 삭제 한 다음 용어를 선언하는 플러그인을 비활성화하고 다시 활성화하려고했습니다. 두 개의 상위 용어가 용어 페이지에 표시되지만 하위 용어는 표시되지 않습니다. 하위 용어 DO는 새 용어를 만들려는 "부모"드롭 다운 메뉴에 나타납니다. 부모가 자식 용어 중 하나 인 용어를 추가하고 페이지를 새로 고치면 자식 용어가 표시됩니다. 여기에 이미지 설명을 입력하십시오


약간의 연구를 한 후에는 캐시라는 용어로 무언가를해야 할 것 같습니다. 캐시를 업데이트하기 위해 캐시를 일관성있게 정리할 수 있는지 여부 또는 방법을 잘 모르겠습니다.
매니 Fleurmond

답변:


25

계층이 캐시되어 제대로 무효화되지 않았습니다. 이것은 WP 3.1에서 아직 해결되지 않은 버그입니다.

해결 방법은 delete_option("{$taxonomy}_children");직접 전화 하는 것입니다.

_get_term_hierarchy () 함수를 참조하십시오.


캐싱 문제라는 느낌이 들었습니다. 각 어린이를 삽입하기 전후에 이것을 삽입해야합니까?
매니 Fleurmond

2
추가 새로 고침을 수행하지만 모든 하위 용어를 삽입 한 후 delete_option 코드를 배치하면 트릭이 수행됩니다. 고마워, 스리 부 이것은 내가 포기한 담당자의 가치가 있습니다. 잘하면 이것은 비슷한 문제를 가진 다른 사람들을 도울 것입니다
Manny Fleurmond

감사! 방금 이것에 4 시간을 보냈습니다. 관리 GUI를 통해 용어를 추가하기 전후에 db의 차이를 생각하자마자 옵션을 보았고 Google이 여기에 올 내용을 알았습니다.
Per Wiklander

6

내 2 센트-업로드 된 CSV 파일을 통해 카탈로그 카테고리 / 제품 관리를 허용하는 WooCommerce 플러그인 용 확장을 구축 중입니다. 카테고리를 생성 할 때 동일한 문제가 발생했습니다. 캐시 된 WooCommerce 카테고리를 지우는 솔루션 delete_option("product_cat_children");은 카테고리와 하위 카테고리를 작성하는 루프 를 호출하는 것입니다. 이것이 다른 누군가를 돕기를 바랍니다!


2

term_exists($term, $taxonomy, $parent)호출시 분류 체계가 설정된 경우 객체를 다시받을 수 있습니다 . 게시 한 샘플 코드에 설정되어 있으므로 문제라고 가정합니다.

insert 문은 키를 참조 할 때 배열을 기대합니다.

예 :

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

.. 그러나 실제로 객체를 다시 가져올 수 있습니다 term_exists.

이것이 문제인지 판단하는 빠른 방법은이 줄을 업데이트하는 것입니다.

return $result;

에..

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

내가 옳고 그게 문제라면, 그것을 고쳐야하지만 우아한 수정 이라고는하지 않습니다.

잘만되면 그것은 당신이 찾고있는 답변 / 도움입니다 .. :)


늦은 답변 죄송합니다. 이해해 주셔서 감사하지만 그게 내가 가진 문제를 해결했다고 생각하지 않습니다.
매니 Fleurmond

1

감사. 이 질문은 많은 도움이되었습니다. 나는 단위 테스트로 어려움을 겪고 있었고 내가해야한다는 것을 알았습니다.

delete_option('veda_release_type');
wp_cache_flush();

최상위 레벨 카테고리를 추가 한 후 두 번째 레벨 카테고리를 추가 한 후 워드 프레스로 모든 항목을 지우고 단위 테스트를 통과하도록 다시 수행하십시오. 이것은 다른 답변에서 언급 된 "두 번째 페이지로드 / 추가 새로 고침"의 필요성을 해결합니다.


1

내 해결책 :

(캐시 레코드를 정리해야 할 수도 있습니다.)

$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();

코드를 게시하고 답변을 설명하십시오.
s_ha_dum

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.