Memasukkan istilah ke dalam taksonomi khusus

9

Membuat taksonomi khusus ini yang akan mengontrol tata letak pada posting tunggal, pada dasarnya saya ingin menambahkan dua opsi, Layout 1 dan Layout 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 );

Kemampuan diatur ke nilai yang tidak valid untuk menghentikan istilah diedit, tetapi saya tidak bisa membuat wp_insert_term berfungsi.

Menambahkan dua istilah ke taksonomi khusus saya tidak mungkin terlalu sulit, bukan?

Menggunakan ini untuk memasukkan istilah tidak berfungsi, meskipun jika saya mengubah nama taksonomi saya menjadi 'kategori', yaitu WP default berfungsi dengan baik. Apa yang menyebabkannya?

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' );
andy
sumber
Seperti yang dijanjikan, saya memposting kode ke plugin. Semoga ini bisa membantu :-)
Pieter Goosen

Jawaban:

11

EDIT 2

Seperti yang dijanjikan, ini adalah kode untuk plugin.

Adalah fakta yang diketahui bahwa taksonomi khusus dan jenis pos khusus harus dimasukkan ke dalam plugin, dan bukan di tema Anda. Saya telah menghapus bagian dari plugin saya.

BAGAIMANA ITU BEKERJA

Taksonomi didaftarkan sebagai normal melalui plugin. Untuk info tentang ini, Anda dapat pergi dan memeriksa register_taxonomy. Bagian yang perlu saya soroti dan apa yang relevan dengan pertanyaan ini, adalah bagaimana memasukkan istilah baru.

Untuk memasukkan istilah melalui wp_insert_termscepat dan mudah, tetapi kode ini juga bisa melukai waktu pemuatan jika tidak digunakan dengan benar. Idenya adalah menjalankan fungsi itu sekali, dan kemudian tidak pernah lagi, hampir seperti menghapusnya setelah menjalankan pertama.

Untuk mencapai ini, Anda akan menghubungkan fungsi Anda register_activation_hook. Pengait ini berjalan sekali, saat plugin diaktifkan, itu tidak akan dijalankan kembali di halaman refresh. Satu-satunya waktu akan menyala lagi adalah ketika plugin dinonaktifkan dan diaktifkan kembali

Jadi, pertama-tama Anda harus mendaftarkan taksonomi Anda karena Anda tidak dapat menetapkan persyaratan untuk taksonomi yang tidak ada. Setelah taksonomi Anda didaftarkan, Anda dapat memasukkan persyaratan Anda. Ingat, tindakan ini hanya akan dilakukan sekali, dan saat itulah plugin diaktifkan. Jika Anda perlu menambahkan istilah, Anda perlu menonaktifkan plugin dan mengaktifkannya lagi

Anda ingin juga memeriksa dulu apakah ada istilah sebelum mencoba membuat dan menyisipkannya.

Ini adalah kode 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();

EDIT 1

Masalah Anda dengan memasukkan istilah adalah hook Anda. after_setup_themeberjalan sebelumnya init, artinya Anda mencoba memasukkan istilah ke taksonomi yang belum terdaftar.

Saya menyarankan agar Anda memindahkan wp_insert_termfungsi Anda ke dalam fungsi init Anda, tepat di bawahregister_taxonomy

Sebaiknya periksa dulu apakah ada istilah ( term_exists) sebelum memasukkannya

Contoh:

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

Harap dicatat, ini belum diuji

JAWABAN ASLI

Nama taksonomi khusus (dan nama jenis pos kustom) harus mematuhi sekumpulan aturan yang sangat spesifik, jika tidak, Anda akan menemukan jebakan yang tidak ada gunanya.

Berikut ini adalah garis panduan ketika memilih nama untuk taksonomi khusus (dan jenis pos khusus)

  1. Yang berikut ini tidak diperbolehkan dalam nama taksonomi khusus dan nama jenis pos kustom

    • Huruf kapital atau camelcase

    • Semua tipe karakter khusus, kecuali garis bawah ( _)

    • Spasi

    • Lebih dari 32 karakter untuk taksonomi dan 20 untuk jenis posting

    • Setiap nama pendiam , dan tolong catatan, ini berlaku untuk setiap kustom konvensi penamaan, bukan hanya nama-nama taksonomi.

  2. Jika ada lebih dari satu kata dalam nama taksonomi, mereka harus dipisahkan oleh garis bawah, bukan tanda hubung ( -). Saya telah ditantang bahwa tanda hubung adalah cara untuk pergi untuk SEO di URL untuk nama taksonomi. Memang benar, itulah sebabnya ada aturan penulisan ulang untuk menyesuaikan URL Anda. Jangan pernah mengubah nama taksonomi atau nama jenis posting untuk keperluan SEO URL

Juga, Anda harus menghapus kemampuan aneh itu. Mungkin juga menimbulkan masalah

Jika ini tidak menyelesaikan masalah Anda, harap tambahkan kode yang Anda gunakan wp_insert_term

Referensi:

Pieter Goosen
sumber
Setelah melihat ke sumbernya saya agak bingung, karena $taxonomyparameternya tidak dibersihkan sama sekali, jika query_varargumen diatur ke true. Sebenarnya cukup sulit dipercaya. Dan jika tidak, akan disanitasi melalui sanitize_title_with_dashes(), yang akan, nomen es omen, mengganti barang-barang dengan tanda hubung di semua tempat. Yang juga tidak bisa dipercaya, karena tidak boleh digunakan.
Nicolai
Selain dari fakta, Anda dapat menggunakan angka yang Anda suka, di mana saja, jadi pada awalnya juga, meskipun Anda dapat membaca di mana-mana bahwa ini tidak boleh dilakukan. Tidak dapat menemukan alasan yang pasti terhadap angka. Tidak seperti untuk tanda hubung, setidaknya ada pernyataan »Juga, jika jenis posting berisi tanda hubung Anda tidak akan dapat menambahkan kolom ke halaman admin jenis posting kustom (menggunakan tindakan 'kelola_ <Nama Jenis Kiriman Kustom> Tindakan _posts_columns') «Di halaman naskah kuno register_post_type().
Nicolai
1
Wordpress memang memiliki kekurangannya, harus setuju. Beberapa adalah kejahatan aktual :-). Saya pikir strip adalah salah satu topik yang paling banyak dibicarakan dan juga paling banyak digunakan dalam nama. Kegagalannya cukup jelas ketika Anda mulai melihat hierarki templat. Buat taksonomi dengan dua kata seperti taksonomi saya dipisahkan oleh tanda hubung, dan buat taksonomi templat taksonomi-my-taxonomy.php dan Anda akan melihat kegagalan. Saya telah membaca hal nomor di suatu tempat, perlu memeriksa kembali itu lagi. Ini adalah daftar aman yang selalu saya gunakan untuk tetap aman, dan itu telah bekerja dengan sempurna. Terima kasih atas semua info Anda, dihargai
Pieter Goosen
1
Seperti halnya saya, tetapi hanya karena saya mempelajarinya dari awal dengan cara yang benar. Seperti yang saya pelajari paling banyak saya ketahui dari Pengembangan WordPress dan orang-orang pintar dan berpengalaman di sini. Jadi ada banyak kesalahan yang sebenarnya tidak pernah saya lakukan sendiri.
Nicolai
1
Saya harus jawaban ini dilindungi. Rincian dalam jawaban / contoh ini sangat penting dan tidak cukup sering ditunjukkan dalam Codex.
Charles