web-dev-qa-db-ja.com

ユーザーが分類メタボックス内に2レベルを超える深さの用語を追加するのを防ぐことはできますか?

私はWordPressで平準化されたチュートリアル構造を作成中で、ユーザーからのコードを必要とせずにフロントエンドを設定するように構築したいと考えています。

これまでのところ、私は 'tut_page'と呼ばれるカスタム分類のメタボックスを持つ 'tut_page'というカスタム投稿タイプを持っていて、分類メタボックスを通して用語を追加することができます。私のregister_taxonomyでは、 'hierarchy'の値はtrueに設定されています。だから私はレベルが欲しい、しかし私は2つ以上の深さが欲しくない。テンプレートに表示する用語のレベル数を選択できることはわかっていますが、分類メタボックスからユーザーが2つのレベルより深い用語を作成できないようにする方法はありますか。

これが、分類を登録するためのfunctions.phpにあるものです。

function create_tutorial_topic() {
    register_taxonomy(
        'tut_group', //name of taxonomy
        'tut_post', //object type e.g. our post type
        array(
                'labels' => array(
                'name' => _x( 'Tutorial Group', 'taxonomy general name' ),
                'singular_name' => _x( 'Tutorial Groups', 'taxonomy singular name' ),
                'search_items' =>  __( 'Search Tutorial Groups' ),
                'all_items' => __( 'All Tutorial Groups' ),
                'parent_item' => __( 'Parent Tutorial Groups' ),
                'parent_item_colon' => __( 'Parent Tutorial Groups:' ),
                'edit_item' => __( 'Edit Tutorial Group' ),
                'update_item' => __( 'Update Tutorial Group' ),
                'add_new_item' => __( 'Add Tutorial Group' ),
                'new_item_name' => __( 'New Tutorial Group' ),
                'menu_name' => __( 'Tutorial Group' ),
            ),
            'rewrite' => array( 'slug' => 'tutorial-group' ),
            'hierarchical' => true, //this is true but I only want two levels deep
        )
    );
}

私は自分自身でできる限り多くのプラグインを使わなくてもこれを構築したいと思います。このサイトを検索してみたところ、階層数ではなく用語数の制限について質問がありました。事前に何かアドバイスをありがとう!

1
RachieVee

残念ながら、これは不可能で、少なくとも安全というわけではありません。

分類法の作成を処理する関数wp_insert_term( $term, $taxonomy, $args = array() )は、いくつかのフィルターとフックを提供しますが、データベースに用語を作成する前の唯一のものは、

$term = apply_filters( 'pre_insert_term', $term, $taxonomy );

ご覧のとおり、用語の作成時に指定された$argsはフィルタに渡されないため、$args['parent']を検索して分類のレベルがいくつあるかを確認する方法はありません。

それをするための醜い方法は、用語が作成された後、アクションcreated_termまたはcreate_termにフックして、そこでそれをチェックすることです。私はこれを自分でしたことは一度もありません、そしてあなたは作成後にその用語を削除する大きな可能性を開くかもしれません、その後エラーを返す可能性はありません。

フィルタpre_insert_termが引数として$argsを受け入れるならば、それは私には問題ありません。

1
fischi