Chèn các thuật ngữ trong phân loại phân cấp


17

Tôi thực sự có một vài vấn đề với việc chèn các điều khoản. Đây là kịch bản của tôi: Tôi có một phân loại gọi là 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);

Đó rõ ràng là chữ tượng hình. Cấp cao nhất chứa các loại phát hành egDVD, blu-ray. Các cấp dưới đó là khu vực tức là. Vùng 1, Vùng 2, v.v ... Vì vậy, Phân cấp mà tôi muốn là: DVD --Region 0 --Region 1 --Region 2 --Region 3 --Region 4 --Region 5 --Region 6 Blu-Ray - -Region A --Region B --Region C

Tôi đã tạo một hàm có tên là insert_term trong lớp của mình để kiểm tra xem một thuật ngữ có tồn tại hay không, sau đó chèn nó nếu nó không:

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

Và sau đó tôi gọi hàm đã nói để chèn các điều khoản:

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

Vấn đề tôi gặp phải là mặc dù các thuật ngữ được nhập vào cơ sở dữ liệu, chúng không hiển thị trên trang phân loại. Nhiều nhất, các điều khoản cấp cao nhất hiển thị. Tôi phải thử nhiều thứ khác nhau cho đến khi nó buộc WordPress phải nhận ra các điều khoản cấp dưới. Có ai gặp phải vấn đề này hoặc có thể đề xuất một cách tốt hơn?

EDIT: Thông báo một cái gì đó khác: Tôi đã cố gắng xóa các điều khoản khỏi cơ sở dữ liệu sau đó hủy kích hoạt và kích hoạt lại plugin khai báo các điều khoản. Hai thuật ngữ cha mẹ hiển thị trong trang điều khoản, nhưng các điều khoản con thì không. Các thuật ngữ con DO hiển thị trong menu thả xuống "Phụ huynh" nơi bạn muốn tạo một thuật ngữ mới. Khi tôi thêm một thuật ngữ có cha mẹ là một trong những thuật ngữ con và làm mới trang, THÌ các thuật ngữ con xuất hiện. nhập mô tả hình ảnh ở đây


Sau khi thực hiện một số nghiên cứu, có vẻ như nó có thể phải làm một cái gì đó với các điều khoản bộ đệm. Không chắc chắn nếu hoặc làm thế nào tôi có thể xóa bộ nhớ cache trên cơ sở nhất quán để cập nhật nó.
Manny Fleurmond

Câu trả lời:


25

Hệ thống phân cấp được lưu trữ và nó không bị vô hiệu hóa đúng cách. Đây là một lỗi, vẫn chưa được giải quyết kể từ WP 3.1.

Một cách giải quyết sẽ được gọi delete_option("{$taxonomy}_children");trực tiếp.

Xem hàm _get_term_hierarchy ().


Tôi có cảm giác đó là một vấn đề lưu trữ. Tôi nên chèn cái này trước hay sau khi tôi chèn từng đứa trẻ?
Manny Fleurmond

2
Làm mới thêm nhưng đặt mã xóa_option sau khi chèn tất cả các thuật ngữ con thực hiện thủ thuật. Cảm ơn, scribu. Điều này cũng xứng đáng với điểm rep mà tôi đã từ bỏ. Hy vọng rằng điều này sẽ giúp những người khác có vấn đề tương tự
Manny Fleurmond

Cảm ơn! Tôi chỉ dành 4 giờ cho việc này. Ngay khi tôi nảy ra ý tưởng thực hiện một khác biệt của db trước và sau khi thêm một thuật ngữ thông qua GUI quản trị, tôi đã thấy tùy chọn này và biết những gì Google sẽ đến đây.
Mỗi Wiklander

6

2 xu của tôi - Tôi đang xây dựng tiện ích mở rộng cho plugin WooC Commerce cho phép quản lý danh mục / sản phẩm danh mục thông qua tệp CSV đã tải lên. Tôi gặp vấn đề tương tự khi tạo các thể loại. Giải pháp để xóa các danh mục WooC Commerce được lưu trong bộ nhớ cache là gọi delete_option("product_cat_children");sau vòng lặp tạo các danh mục và danh mục phụ. Hy vọng điều này sẽ giúp người khác!


2

Bạn có thể có thể nhận được một đối tượng trở lại term_exists($term, $taxonomy, $parent)nếu phân loại được đặt khi được gọi. Nó được đặt trong mã mẫu bạn đã đăng, vì vậy tôi cho rằng đó là vấn đề.

Các câu lệnh chèn của bạn đang mong đợi một mảng khi chúng tham chiếu các khóa ..

Ví dụ.

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

..nhưng bạn thực sự có thể nhận được một đối tượng trở lại từ term_exists.

Một cách nhanh chóng để xác định xem đó có phải là vấn đề cập nhật dòng này không.

return $result;

đến..

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

Nếu tôi đúng và đó là vấn đề, điều đó sẽ khắc phục nó, mặc dù tôi sẽ không gọi đó là một sửa chữa thanh lịch.

Hy vọng rằng đó là câu trả lời / sự giúp đỡ mà bạn đang tìm kiếm .. :)


Xin lỗi vì hồi âm muộn. Cảm ơn bạn đã nắm bắt được điều đó nhưng tôi không nghĩ rằng nó đã giải quyết được vấn đề mà tôi gặp phải.
Manny Fleurmond

1

Cảm ơn. Câu hỏi này đã giúp rất nhiều. Tôi đã vật lộn với các bài kiểm tra đơn vị và thấy tôi phải làm

delete_option('veda_release_type');
wp_cache_flush();

sau khi thêm các danh mục cấp cao nhất của tôi và sau đó thực hiện lại sau khi thêm các danh mục cấp thứ hai để cho phép wordpress xóa mọi thứ và để các bài kiểm tra đơn vị vượt qua. Điều này hoạt động xung quanh nhu cầu "tải trang thứ hai / làm mới thêm" được đề cập trong một câu trả lời khác ở đây.


1

giải pháp của tôi:

(có lẽ nó là cần thiết để làm sạch các bản ghi bộ nhớ 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();

Hãy giải thích câu trả lời của bạn cũng như chỉ đăng mã.
s_ha_dum

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.