Chèn một thuật ngữ vào phân loại tùy chỉnh


9

Tạo phân loại tùy chỉnh này sẽ kiểm soát bố cục trên các bài đăng đơn lẻ, về cơ bản tôi muốn thêm hai tùy chọn, Bố cục 1 và Bố cục 2.

// Register Custom Taxonomy
function custom_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Layout', 'Taxonomy General Name', 'text_domain' ),
        'singular_name'              => _x( 'Layout', 'Taxonomy Singular Name', 'text_domain' ),
        'menu_name'                  => __( 'Taxonomy', 'text_domain' ),
        'all_items'                  => __( 'All Items', 'text_domain' ),
        'parent_item'                => __( 'Parent Item', 'text_domain' ),
        'parent_item_colon'          => __( 'Parent Item:', 'text_domain' ),
        'new_item_name'              => __( 'New Item Name', 'text_domain' ),
        'add_new_item'               => __( 'Add New Item', 'text_domain' ),
        'edit_item'                  => __( 'Edit Item', 'text_domain' ),
        'update_item'                => __( 'Update Item', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
        'search_items'               => __( 'Search Items', 'text_domain' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'text_domain' ),
        'choose_from_most_used'      => __( 'Choose from the most used items', 'text_domain' ),
        'not_found'                  => __( 'Not Found', 'text_domain' ),
    );
    $capabilities = array(
        'manage_terms' => 'foobar',
        'edit_terms'   => 'foobar',
        'delete_terms' => 'foobar',
        'assign_terms' => 'foobar' 
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => false,
        'show_in_nav_menus'          => false,
        'show_tagcloud'              => false,
        'capabilities'               => $capabilities,
    );
    register_taxonomy( 'Layout', array( 'post' ), $args );

}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

Khả năng được đặt thành giá trị không hợp lệ để ngăn các thuật ngữ được chỉnh sửa, nhưng tôi không thể làm cho wp_insert_term hoạt động.

Thêm hai thuật ngữ vào phân loại tùy chỉnh của tôi không thể quá khó, phải không?

Sử dụng điều này để chèn một thuật ngữ không hoạt động, mặc dù nếu tôi thay đổi tên phân loại tùy chỉnh của mình thành 'thể loại', tức là WP mặc định nó hoạt động tốt. Đưa cái gì?

function example_insert_category() {
    $parent_term = term_exists( 'layout' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
    wp_insert_term(
        'Example Category',
        'layout',
        array(
          'description' => 'This is an example category created with wp_insert_term.',
          'slug'        => 'example-category'
        )
    );
}
add_action( 'after_setup_theme', 'example_insert_category' );

Như đã hứa, tôi đã đăng mã lên plugin. Hy vọng điều này sẽ giúp :-)
Pieter Goosen

Câu trả lời:


11

CHỈNH SỬA 2

Như đã hứa, đây là mã cho plugin.

Một thực tế đã biết là các nguyên tắc phân loại tùy chỉnh và các loại bài đăng tùy chỉnh nên đi vào một plugin chứ không phải trong chủ đề của bạn. Tôi đã loại bỏ các phần từ plugin của tôi.

LÀM THẾ NÀO NÓ HOẠT ĐỘNG

Phân loại được đăng ký như bình thường thông qua các plugin. Đối với bất kỳ thông tin liên quan đến điều này, bạn có thể đi và kiểm tra register_taxonomy. Phần mà tôi cần làm nổi bật và những gì có liên quan đến câu hỏi này, là làm thế nào để chèn các thuật ngữ mới.

Để chèn các thuật ngữ thông qua wp_insert_termsnhanh chóng và dễ dàng, nhưng mã này cũng có thể ảnh hưởng đến thời gian tải nếu không được sử dụng đúng cách. Ý tưởng là chạy chức năng đó một lần, và sau đó không bao giờ nữa, gần giống như loại bỏ nó sau lần chạy đầu tiên.

Để thực hiện điều này, bạn sẽ nối chức năng của bạn register_activation_hook. Móc này chạy một lần, đó là khi plugin được kích hoạt, nó sẽ không chạy lại khi làm mới trang. Lần duy nhất nó sẽ kích hoạt lại là khi plugin bị vô hiệu hóa và kích hoạt lại

Vì vậy, trước tiên bạn cần đăng ký phân loại của mình vì bạn không thể gán các thuật ngữ cho phân loại không tồn tại. Khi phân loại của bạn được đăng ký, bạn có thể chèn các điều khoản của bạn. Hãy nhớ rằng, hành động này sẽ chỉ diễn ra một lần và đó là khi plugin được kích hoạt. Nếu bạn cần thêm điều khoản, bạn cần hủy kích hoạt plugin và kích hoạt lại

Trước tiên, bạn cũng muốn kiểm tra xem một thuật ngữ có tồn tại hay không trước khi thử tạo và chèn nó.

Đây là mã plugin

<?php
/**
Plugin Name: Create terms
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Create terms
Version: 1.0
Author: Pieter Goosen
License: GPLv2 or later
*/
class Test_Terms {

    function __construct() {
        register_activation_hook( __FILE__,array( $this,'activate' ) );
        add_action( 'init', array( $this, 'create_cpts_and_taxonomies' ) );
    } 

    function activate() {
        $this->create_cpts_and_taxonomies();
        $this->register_new_terms();
    }

    function create_cpts_and_taxonomies() {

        $args = array( 
            'hierarchical'                      => true,  
            'labels' => array(
                'name'                          => _x('Test Tax', 'taxonomy general name' ),
                'singular_name'                 => _x('Test Tax', 'taxonomy singular name'),
                'search_items'                  => __('Search Test Tax'),
                'popular_items'                 => __('Popular Test Tax'),
                'all_items'                     => __('All Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'edit_item'                     => __('Edit Test Tax'),
                'update_item'                   => __('Update Test Tax'),
                'add_new_item'                  => __('Add New Test Tax'),
                'new_item_name'                 => __('New Test Tax Name'),
                'separate_items_with_commas'    => __('Seperate Test Tax with Commas'),
                'add_or_remove_items'           => __('Add or Remove Test Tax'),
                'choose_from_most_used'         => __('Choose from Most Used Test Tax')
            ),  
            'query_var'                         => true,  
            'rewrite'                           => array('slug' =>'test-tax')        
        );
        register_taxonomy( 'test_tax', array( 'post' ), $args );
    }

    function register_new_terms() {
        $this->taxonomy = 'test_tax';
        $this->terms = array (
            '0' => array (
                'name'          => 'Tester 1',
                'slug'          => 'tester-1',
                'description'   => 'This is a test term one',
            ),
            '1' => array (
                'name'          => 'Tester 2',
                'slug'          => 'tester-2',
                'description'   => 'This is a test term two',
            ),
        );  

        foreach ( $this->terms as $term_key=>$term) {
                wp_insert_term(
                    $term['name'],
                    $this->taxonomy, 
                    array(
                        'description'   => $term['description'],
                        'slug'          => $term['slug'],
                    )
                );
            unset( $term ); 
        }

    }
}
$Test_Terms = new Test_Terms();

CHỈNH SỬA 1

Vấn đề của bạn với các điều khoản chèn là hook của bạn. after_setup_themechạy trước đó init, có nghĩa là bạn đang cố gắng chèn một thuật ngữ vào phân loại chưa được đăng ký.

Tôi sẽ đề nghị bạn di chuyển wp_insert_termchức năng của bạn vào bên trong chức năng init của bạn, ngay bên dướiregister_taxonomy

Bạn cũng nên kiểm tra trước nếu một thuật ngữ tồn tại ( term_exists) trước khi chèn nó

Thí dụ:

// Register Custom Taxonomy
function custom_taxonomy() {

   //CODE TO REGISTER TAXONOMY

   if( !term_exists( 'Example Category', 'layout' ) ) {
       wp_insert_term(
           'Example Category',
           'layout',
           array(
             'description' => 'This is an example category created with wp_insert_term.',
             'slug'        => 'example-category'
           )
       );
   }
}

// Hook into the 'init' action
add_action( 'init', 'custom_taxonomy', 0 );

Xin lưu ý, điều này chưa được kiểm tra

CÂU TRẢ LỜI

Tên phân loại tùy chỉnh (và tên loại bài đăng tùy chỉnh) cần tuân thủ một bộ quy tắc rất cụ thể, nếu không bạn sẽ gặp phải những cạm bẫy mà không có công việc nào xung quanh.

Dưới đây là dòng hướng dẫn khi chọn tên cho phân loại tùy chỉnh (và loại bài đăng tùy chỉnh)

  1. Những điều sau đây không được phép trong tên phân loại tùy chỉnh và tên loại bài đăng tùy chỉnh

    • Chữ in hoa hoặc lạc đà

    • Bất kỳ loại ký tự đặc biệt nào, ngoại trừ dấu gạch dưới ( _)

    • Không gian

    • Hơn 32 ký tự cho các nguyên tắc phân loại và 20 ký tự cho các loại bài đăng

    • Bất kỳ tên dành riêng , và xin lưu ý, điều này áp dụng cho bất kỳ quy ước đặt tên tùy chỉnh nào , không chỉ tên phân loại.

  2. Nếu có nhiều hơn một từ trong tên phân loại, chúng phải được phân tách bằng dấu gạch dưới, không phải dấu gạch nối ( -). Tôi đã được thách thức rằng các dấu gạch ngang là cách để SEO trong URL cho các tên phân loại. Đó là sự thật, đó là lý do tại sao có các quy tắc viết lại để điều chỉnh URL của bạn cho phù hợp. Không bao giờ thay đổi tên phân loại hoặc tên loại bài đăng cho mục đích SEO URL

Ngoài ra, bạn nên loại bỏ khả năng kỳ lạ đó. Nó cũng có thể tạo ra một vấn đề

Nếu điều này không giải quyết được vấn đề của bạn, vui lòng thêm mã mà bạn sử dụng với wp_insert_term

Tài liệu tham khảo:


Sau khi xem xét nguồn, tôi hơi bối rối, vì $taxonomytham số này hoàn toàn không được khử trùng, nếu query_varđối số được đặt thành true. Đó thực sự là điều không thể tin được. Và nếu không, nó sẽ được khử trùng thông qua sanitize_title_with_dashes(), nó sẽ thay thế công cụ bằng dấu gạch ngang khắp nơi. Điều này cũng không thể tin được, vì chúng không nên được sử dụng.
Nicolai

Ngoài thực tế, bạn có thể sử dụng các số như bạn muốn, ở bất cứ đâu, vì vậy, ngay từ đầu cũng vậy, mặc dù bạn có thể đọc ở mọi nơi mà điều này không nên làm. Không thể tìm thấy một lý do nhất định chống lại con số mặc dù. Không giống như dấu gạch ngang, ít nhất là có một tuyên bố »Ngoài ra, nếu loại bài đăng có dấu gạch ngang, bạn sẽ không thể thêm cột vào trang quản trị của loại bài đăng tùy chỉnh (sử dụng hành động 'Manage_ <Tên loại bài đăng tùy chỉnh> _posts_columns') . «Trên trang codex của register_post_type().
Nicolai

1
Wordpress không có sai sót của nó, phải đồng ý. Một số là tội phạm thực tế :-). Tôi nghĩ rằng dấu gạch ngang là một trong những chủ đề được nói nhiều nhất và cũng được sử dụng nhiều nhất trong tên. Thất bại của nó là khá rõ ràng khi bạn bắt đầu nhìn vào hệ thống phân cấp mẫu. Tạo một phân loại với hai từ như phân loại của tôi được phân tách bằng dấu gạch ngang và tạo một mẫu phân loại phân loại phân loại-my-taxonomy.php và bạn sẽ thấy thất bại. Tôi đã đọc điều số ở đâu đó, cần phải kiểm tra lại điều đó một lần nữa mặc dù. Đây là danh sách an toàn mà tôi luôn sử dụng để giữ an toàn và nó đã hoạt động hoàn hảo. Cảm ơn tất cả thông tin của bạn, được đánh giá cao
Pieter Goosen

1
Tôi cũng vậy, nhưng chỉ vì tôi đã học nó từ đầu đúng cách. Khi tôi học được nhiều nhất tôi biết từ WordPress Development và những người thông minh và có kinh nghiệm ở đây. Vì vậy, có rất nhiều sai lầm tôi không bao giờ thực sự mắc phải.
Nicolai

1
Imho nên câu trả lời này được bảo vệ. Chi tiết trong câu trả lời / ví dụ này rất quan trọng và nó thường không được chỉ ra trong Codex.
Charles
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.