การแทรกคำลงในอนุกรมวิธานที่กำหนดเอง


9

ทำ taxonomy แบบกำหนดเองนี้ที่จะควบคุมเลย์เอาต์ในโพสต์เดียวโดยทั่วไปฉันต้องการเพิ่มสองตัวเลือกคือเลย์เอาต์ 1 และเลย์เอาต์ 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 );

ความสามารถถูกตั้งค่าเป็นค่าที่ไม่ถูกต้องเพื่อหยุดการแก้ไขคำ แต่ฉันไม่สามารถทำให้ wp_insert_term ทำงานได้

การเพิ่มสองคำในอนุกรมวิธานที่กำหนดเองของฉันไม่สามารถทำได้ยากใช่ไหม

การใช้สิ่งนี้เพื่อแทรกคำไม่ทำงานแม้ว่าฉันจะเปลี่ยนชื่ออนุกรมวิธานที่กำหนดเองเป็น 'หมวดหมู่' นั่นคือค่าเริ่มต้น WP มันใช้ได้ดี สิ่งที่ช่วยให้?

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

ตามที่สัญญาไว้ฉันโพสต์รหัสไปยังปลั๊กอิน หวังว่านี่จะช่วย :-)
Pieter Goosen

คำตอบ:


12

แก้ไข 2

ตามที่สัญญาไว้นี่คือรหัสสำหรับปลั๊กอิน

เป็นความจริงที่รู้จักกันว่า taxonomies ที่กำหนดเองและประเภทโพสต์ที่กำหนดเองควรเข้าไปในปลั๊กอินและไม่ได้อยู่ในธีมของคุณ ฉันถอดชิ้นส่วนจากปลั๊กอินของฉันแล้ว

มันทำงานอย่างไร

อนุกรมวิธานมีการลงทะเบียนตามปกติผ่านปลั๊กอิน สำหรับข้อมูลใด ๆ register_taxonomyเกี่ยวกับเรื่องนี้คุณสามารถไปและตรวจสอบ ส่วนที่ฉันต้องการเน้นและสิ่งที่เกี่ยวข้องกับคำถามนี้คือวิธีแทรกคำศัพท์ใหม่

ในการแทรกคำศัพท์wp_insert_termsต่าง ๆ นั้นรวดเร็วและง่ายดาย แต่รหัสนี้อาจทำให้เวลาในการโหลดลดลงหากไม่ได้ใช้อย่างถูกต้อง แนวคิดคือการเรียกใช้ฟังก์ชั่นนั้นครั้งแล้วไม่เคยอีกครั้งเกือบจะเหมือนการลบมันหลังจากการทำงานครั้งแรก

register_activation_hookเพื่อให้บรรลุนี้คุณจะไปขอฟังก์ชั่นของคุณไป เบ็ดนี้จะทำงานครั้งเดียวนั่นคือเมื่อเปิดใช้งานปลั๊กอินมันจะไม่ทำงานอีกครั้งในการรีเฟรชหน้า ครั้งเดียวที่มันจะทำงานอีกครั้งคือเมื่อปลั๊กอินถูกปิดใช้งานและเปิดใช้งานอีกครั้ง

ดังนั้นก่อนอื่นคุณต้องลงทะเบียน taxonomy ของคุณเนื่องจากคุณไม่สามารถกำหนดเงื่อนไขให้กับ taxonomy ที่ไม่มีอยู่ เมื่อ taxonomy ของคุณลงทะเบียนคุณสามารถแทรกคำศัพท์ของคุณ โปรดจำไว้ว่าการกระทำนี้จะเกิดขึ้นเพียงครั้งเดียวเท่านั้นและนั่นคือเมื่อเปิดใช้งานปลั๊กอิน หากคุณต้องการเพิ่มคำศัพท์คุณต้องปิดการใช้งานปลั๊กอินและเปิดใช้งานอีกครั้ง

คุณต้องการตรวจสอบก่อนว่าคำนั้นมีอยู่ก่อนที่จะพยายามสร้างและแทรกหรือไม่

นี่คือรหัสปลั๊กอิน

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

แก้ไข 1

ปัญหาของคุณในการใส่คำศัพท์คือเบ็ดของคุณ after_setup_themeทำงานก่อนinitซึ่งหมายความว่าคุณกำลังพยายามแทรกคำในอนุกรมวิธานที่ยังไม่ได้ลงทะเบียน

ฉันอยากจะแนะนำให้คุณย้ายwp_insert_termฟังก์ชั่นของคุณไปไว้ภายในฟังก์ชั่นเริ่มต้นของคุณด้านล่างregister_taxonomy

นอกจากนี้ยังแนะนำให้ตรวจสอบก่อนว่าคำนั้นมีอยู่ ( term_exists) ก่อนที่จะแทรกหรือไม่

ตัวอย่าง:

// 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 );

โปรดทราบว่านี่ยังไม่ได้ทดสอบ

คำตอบเดิม

ชื่ออนุกรมวิธานที่กำหนดเอง (และชื่อประเภทโพสต์ที่กำหนดเอง) ต้องเป็นไปตามกฎที่เฉพาะเจาะจงมิฉะนั้นคุณจะพบกับข้อผิดพลาดที่ไม่มีวิธีแก้ไข

นี่คือเส้นบอกแนวเมื่อเลือกชื่อสำหรับ taxonomies ที่กำหนดเอง (และประเภทโพสต์ที่กำหนดเอง)

  1. ไม่อนุญาตให้ใช้ข้อมูลต่อไปนี้ในชื่ออนุกรมวิธานที่กำหนดเองและชื่อประเภทโพสต์ที่กำหนดเอง

    • อักษรตัวใหญ่หรืออูฐ

    • อักขระพิเศษชนิดใดก็ได้ยกเว้นขีดล่าง ( _)

    • ช่องว่าง

    • มากกว่า 32 ตัวอักษรสำหรับ taxonomies และ 20 สำหรับประเภทโพสต์

    • ชื่อที่สงวนไว้ใด ๆและโปรดทราบว่าสิ่งนี้มีไว้สำหรับการตั้งชื่อแบบกำหนดเองใด ๆไม่ใช่เฉพาะชื่ออนุกรมวิธาน

  2. หากมีมากกว่าหนึ่งคำในชื่ออนุกรมวิธานพวกเขาจะต้องคั่นด้วยเครื่องหมายขีดล่างไม่ใช่เครื่องหมายขีดกลาง ( -) ฉันถูกท้าทายว่ายัติภังค์เป็นวิธีที่จะใช้สำหรับ SEO ใน URL สำหรับชื่ออนุกรมวิธาน มันเป็นความจริงนั่นคือเหตุผลที่มีกฎการเขียนซ้ำเพื่อปรับ URL ของคุณตาม ห้ามเปลี่ยนชื่ออนุกรมวิธานหรือชื่อประเภทการโพสต์เพื่อวัตถุประสงค์ SEO

นอกจากนี้คุณควรลบความสามารถแปลก ๆ มันอาจสร้างปัญหาด้วย

หากวิธีนี้ไม่ช่วยแก้ปัญหาของคุณโปรดเพิ่มรหัสที่คุณใช้ด้วย wp_insert_term

อ้างอิง:


หลังจากมองเข้าไปในแหล่งที่มาของฉันบิตนิ่งงันเพราะ$taxonomyพารามิเตอร์ไม่ได้รับการปรุงแต่งที่ทุกคนถ้าอาร์กิวเมนต์ได้รับการตั้งค่าให้query_var trueจริง ๆ แล้วไม่น่าเชื่อเลย และไม่เช่นนั้นมันจะถูกทำให้บริสุทธิ์ผ่านทางsanitize_title_with_dashes()ซึ่งจะเปลี่ยนสิ่งต่าง ๆ ด้วยเครื่องหมายขีดกลางทั่วสถานที่ ซึ่งไม่น่าเชื่อเช่นกันเนื่องจากไม่ควรใช้
Nicolai

นอกเหนือจากความจริงแล้วคุณสามารถใช้ตัวเลขตามที่คุณต้องการได้ทุกที่ดังนั้นในตอนแรกด้วยแม้ว่าคุณจะสามารถอ่านได้ทุกที่ว่าสิ่งนี้ไม่ควรทำ ไม่สามารถหาเหตุผลที่ชัดเจนเกี่ยวกับตัวเลขได้ ซึ่งแตกต่างจากเครื่องหมายขีดคั่นอย่างน้อยก็มีคำสั่ง»นอกจากนี้หากประเภทโพสต์มีเครื่องหมายขีดกลางคุณจะไม่สามารถเพิ่มคอลัมน์ในหน้าผู้ดูแลระบบของโพสต์แบบกำหนดเอง (ใช้การกระทำ 'manage_ <ชื่อประเภทโพสต์ที่กำหนดเอง> _posts_columns . register_post_type()«บนหน้าของ
นิโคไล

1
Wordpress มีข้อบกพร่องต้องยอมรับ บางส่วนเป็นอาชญากรรมจริง :-) ฉันคิดว่าเครื่องหมายขีดคั่นเป็นหนึ่งในหัวข้อที่ถูกพูดถึงมากที่สุดและใช้มากที่สุดในชื่อ ความล้มเหลวค่อนข้างชัดเจนเมื่อคุณเริ่มดูลำดับชั้นของแม่แบบ สร้าง taxonomy ด้วยสองคำเช่น my-taxonomy คั่นด้วยเครื่องหมายขีดกลางและสร้างเทมเพลต taxonomy taxonomy-my-taxonomy.php และคุณจะเห็นความล้มเหลว ฉันได้อ่านจำนวนสิ่งที่ต้องตรวจสอบอีกครั้งว่า นี่คือรายการที่พักปลอดภัยที่ฉันมักใช้เพื่อพักอย่างปลอดภัยและทำงานได้อย่างสมบูรณ์ ขอบคุณสำหรับข้อมูลทั้งหมดของคุณชื่นชม
Pieter Goosen

1
เช่นเดียวกับฉัน แต่เพียงเพราะฉันเรียนรู้จากจุดเริ่มต้นทางที่ถูกต้อง ตามที่ฉันได้เรียนรู้มากที่สุดที่ฉันรู้จักจากการพัฒนา WordPressและผู้คนที่ฉลาดและมีประสบการณ์ที่นี่ ดังนั้นจึงมีข้อผิดพลาดมากมายที่ฉันไม่เคยทำเอง
นิโคไล

1
คำตอบนี้ควรได้รับการปกป้อง Imho รายละเอียดในคำตอบ / ตัวอย่างนี้มีความสำคัญมากและมักไม่ได้ชี้ให้เห็นอย่างเพียงพอใน Codex
ชาร์ลส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.