2016-04-01 4 views
1

背景

私はクラス内にカスタムの投稿タイプとカスタム分類を登録します。 WPの管理者の中で、私は両方の投稿の種類を見ると、私は分類を参照してください。WordPress:get_terms()がカスタム分類を参照できないのはなぜですか?クラスの中に登録されていますか?

簡体コード:

class Custom_Post_Type { 

    function __construct($init_data) { 

     if (is_admin()) { 

      add_action('init', array($this, 'create_ctp')); 
      add_action('admin_head', array($this, 'create_ctp_icons')); 
      add_action('save_post', array($this, 'save_ctp_custom_metadata'), 1, 2); 

     } 

    } 

    function create_ctp_taxonomy() { 
      register_taxonomy(
       $post_type.'_type', 
       $post_type, 
       array(
        'labels' => array(
         'name' => $taxonomy_label, 
         'add_new_item' => 'Add New '.$taxonomy_label 
        ), 
        'public' => true, 
        'show_ui' => true, 
        'show_tagcloud' => true, 
        'hierarchical' => true, 
        'show_in_nav_menus' => true, 
        'show_admin_column' => true 
       ) 
      ); 

      register_post_type($post_type_slug, 
       array(
        'labels' => array(), 
        'public' => true, 
        'has_archive' => false, 
        'supports' => $this->supports, 
        'register_meta_box_cb' => array($this, 'create_ctp_custom_metaboxes'), 
        'taxonomies' => array($taxonomy_slug), 
       ) 
      ); 
    } 

} 

繰り返しますが、これは管理エリア内で動作します。私は投稿を追加することができ、分類法がわかり、用語を追加することができます。


問題

フロントエンドには、get_taxonomies()は、新しいカスタム分類を見ていない、とget_terms()は、その中に用語が表示されません。

私はregister_taxonomyのいくつかの例を試しました。クラスの外で使ったとき、フロントエンドに表示されます。しかし、私が内部のcreate_ctp_taxonomy関数にサンプルを移したところ、それらは突然get_taxonomiesに見えなくなりました。

これはなぜ起こりますか?


編集

私は別のもので遊んでてきたと私はここでの問題はinitアクションのタイミングだと思います。アクションを追加するのではなく、__construct関数からsetup関数の方向を呼び出すと、処理が開始されます。例:

class Custom_Post_Type { 

    function __construct($init_data) { 

     if (is_admin()) { 

      //add_action('init', array($this, 'create_ctp')); 
      add_action('admin_head', array($this, 'create_ctp_icons')); 
      add_action('save_post', array($this, 'save_ctp_custom_metadata'), 1, 2); 
     } 

     $this->create_cpt(); 

    } 

} 

これを実行すると、私はinitを使用してスキップします。しかし、これは標準的な慣習に違反しているようです。このように誰かが知っている欠点はありますか?

+0

上記のコードがありませんが、$ post_typeは$ this-> post_typeの関数probで定義されていませんか? – David

+0

例の簡略化されたコードです。実際のコードでは '$ this-> slug.'と書かれています。 –

+0

そうではないので、クラスオブジェクトはどこに作成しますか? – David

答えて

1

ない問題

1)問題は、競合状態ではないにつながることができます。

is_admin()のような条件は、functions.phpから実行するとそのまま動作します。これはウェブ上のいくつかの情報と矛盾しますが、WordPress 4.4ではこれらが機能します。

2)直接ゼロの変化があったの登録を呼び出すに切り替え__construct()

からadd_action()ではなく、直接からの登録を呼び出します。私は私を動かしたとき

  • $this->create_ctp()

  • add_action('init', array($this, 'create_ctp'));

3. CTP

対登録分類の)順序:明確にするためには、違いはありませんCTPの前にタクソノミーを登録すると、行動の変化はゼロになりました。


問題私は管理者dashiconを追加したとき、私はラップする前の追加のだis_admin()の条件付きチェックを、使用していた

。これが私のCTPがバックエンドに出現した理由ですが、正面には出現しませんでした。

私は単純化した例から削除しました。そこで、私が投稿したコードを見てもわからない方法はありませんでした。

私がする必要があったのは、is_admin()のチェックを外すことでした。それは愚かな間違いですが、実際には問題ではないことについての情報を見つけるのに便利です。

1

カスタム投稿タイプにタクソノミを登録する際に注意する必要があることがいくつかあります。

  1. 最初にタクソノミを登録してください。これはちょっとわかりにくいようですが、タクソノミーは投稿タイプに登録されているので、投稿タイプが作成される前に存在する必要があります。
  2. また、register_post_type関数のtaxonomies引数を使用して、タクソノミを投稿タイプに登録する必要があります。

例:ポストタイプを登録する場合は、必ず タクソノミの引数を使用して分類法を登録docs

から

register_post_type('cpt_name',array(
     'taxonomies'=>array(
       'taxomony_name1', 
       'taxomony_name2') 
     ,other_arguments...) 
); 

。そうしないと、 parse_queryやpre_get_postsなどのフィルタを使用している場合、タクソノミーと投稿タイプ は接続されていると認識されません。これは、予期しない結果と 障害

+0

調査した後、これらの変更のいずれも影響を与えません。ドキュメントは両方を示唆していますが、私が変更を加えたとき、彼らは何もしませんでした。私は正しい方法を反映するために私の質問のコードを更新しました。なぜなら、それらを正しく注文することの欠点がないからです。 –

+0

私はあなたがそれをソートしてうれしいです:) – andrew

関連する問題