カスタム分類への用語の挿入


9

単一の投稿のレイアウトを制御するこのカスタム分類法を作成しました。基本的に、レイアウト1とレイアウト2の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を機能させることができません。

カスタム分類法に2つの用語を追加するのはそれほど難しいことではないでしょうか。

これを使用して用語を挿入することはできませんが、カスタム分類名を「category」に変更した場合、つまり、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

回答:


11

編集2

約束どおり、ここにプラグインのコードがあります。

カスタム分類とカスタム投稿タイプは、テーマではなくプラグインに入れる必要があることは既知の事実です。プラグインからパーツを削除しました。

使い方

分類はプラグインを介して通常どおり登録されます。これに関する情報については、チェックアウトしてくださいregister_taxonomy。私が強調する必要があった部分とこの質問に関連するものは、新しい用語を挿入する方法です。

用語を挿入するのwp_insert_termsはすばやく簡単ですが、このコードを正しく使用しないと、ロード時間が長くなる可能性があります。アイデアは、その関数を1回実行し、その後は二度と実行しないことです。ほとんどの場合、最初の実行後にその関数を削除します。

これを行うには、関数をにフックしますregister_activation_hook。このフックは1回実行されます。つまり、プラグインがアクティブ化されると、ページの更新時に再実行されません。プラグインが非アクティブ化され、再度アクティブ化されたときのみ、再び起動します

したがって、存在しない分類法に用語を割り当てることはできないため、最初に分類法を登録する必要があります。分類法が登録されたら、用語を挿入できます。このアクションは1回だけ行われることに注意してください。これは、プラグインがアクティブ化されたときです。用語を追加する必要がある場合は、プラグインを非アクティブにして再度アクティブにする必要があります

また、用語を作成して挿入する前に、用語が存在するかどうかを最初に確認する必要もあります。

ここにプラグインコードがあります

<?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関数をinit関数のすぐ下に移動することをお勧めします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 );

これはテストされていないことに注意してください

元の回答

カスタム分類名(およびカスタム投稿タイプ名)は、非常に具体的な一連のルールに準拠する必要があります。準拠していない場合、回避策がない落とし穴に遭遇します。

カスタム分類法(およびカスタム投稿タイプ)の名前を選択する際のガイドラインは次のとおりです

  1. 以下は、カスタム分類名とカスタム投稿タイプ名で許可されていません

    • 大文字またはキャメルケース

    • アンダースコア(_)を除くすべてのタイプの特殊文字

    • スペース

    • 分類には32文字以上、投稿タイプには20文字以上

    • 任意の予約名、およびくださいノートでは、これがために行くの任意のカスタム命名規則だけでなく、分類名。

  2. 分類名に複数の単語がある場合は、ハイフン()ではなくアンダースコアで区切る必要があります-。ハイフンは、分類名のURLでSEOを使用するための方法であることに疑問を感じました。それは本当です、それがあなたのURLをそれに応じて調整するための書き換えルールがある理由です。URL SEOの目的で分類名または投稿タイプ名を変更しないでください

また、その奇妙な機能を削除する必要があります。それはまた問題を引き起こすかもしれません

これで問題が解決しない場合は、使用するコードを追加してください wp_insert_term

参照:


ソースを調べた後$taxonomyquery_var引数がに設定されてtrueいる場合、パラメーターが完全にサニタイズされないため、私は少し困惑しています。それは実際には信じられないことです。そしてそれ以外の場合、それはを介してサニタイズされますsanitize_title_with_dashes()。これにより、名目上、場所全体がダッシュに置き換えられます。それらは使用されるべきではないので、これも信じられないほどです。
Nicolai

事実は別として、あなたは好きなように、どこでも数字を使うことができます。それで、最初からもそうする必要があります。しかし、数字に対する明確な理由を見つけることができませんでした。ダッシュとは異なり、少なくともステートメントがあります»また、投稿タイプにダッシュが含まれている場合、カスタム投稿タイプの管理ページに列を追加できません( 'manage_ <カスタム投稿タイプ名> _posts_columns'アクションを使用) 。«のコーデックスページregister_post_type()
Nicolai

1
Wordpressには欠点があり、同意する必要があります。一部は実際の犯罪です:-)。ダッシュは最もよく使われる主題の1つであり、名前で最もよく使用されると思います。テンプレート階層を調べ始めると、その失敗は非常に明白です。ダッシュで区切られたmy-taxonomyのような2つの単語を含む分類法を作成し、分類法テンプレートtaxonomy-my-taxonomy.phpを作成すると、エラーが表示されます。私はどこかで数字のことを読んだので、それをもう一度再確認する必要があります。これは私が常に安全を確保するために使用する安全なリストであり、完全に機能しています。すべての情報をありがとう、感謝
Pieter Goosen 2014年

1
私もそうですが、最初から正しい方法で学んだからです。私が知っていることのほとんどをWordPress開発とここにいる賢く経験豊富な人々から学んだ。だから私が実際に自分で犯したことのない多くの間違いがあります。
Nicolai

1
イモはこの答えを守るべきだ。この回答/例の詳細は非常に重要であり、コーデックスで十分に指摘されていないことがよくあります。
Charles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.