web-dev-qa-db-ja.com

私のカスタム投稿タイプテンプレートを無視するWordPress?

WordPressは私のカスタム投稿タイプの投稿すべてを404処理しています。私はここで一歩逃したことがありますか?

次の方法でCPTを設定します。

function custom_post_types() {  
  register_post_type(
    'creativework',
    array(
      'labels' => array(
        'name' => _x('Works', 'post type general name'),
        'singular_name' => _x('Work', 'post type singular name'),
        'add_new' => _x('Add New', 'Work'),
        'add_new_item' => __('Add New Work'),
        'edit_item' => __('Edit Work'),
        'new_item' => __('New Work'),
        'all_items' => __('All Works'),
        'view_item' => __('View Work'),
        'search_items' => __('Search Works'),
        'not_found' =>  __('No Works found'),
        'not_found_in_trash' => __('No Works found in Trash'), 
        'parent_item_colon' => '',
        'menu_name' => __('Works')
      ),
      'public' => true,
      'menu_position' => 5,
      //'rewrite' => array('slug' => 'work'),
      'supports' => array('title', 'editor', 'thumbnail'),
      'has_archive' => 'true'
    )
  );
}

add_action( 'init', 'custom_post_types' );

私はもともと(creative_work)というタイプのアンダースコアを持っていて、スラッグを単に "work"に書き換えることはしませんでしたが、WordPressがテンプレートを見つけるのにどの置換を使うのかわかりませんでした - single-creative_work.phpsingle-creativework.phpsingle-work.phpthemes/roots/(私はベースラインテーマとして ルーツ を使っていました)、

<?php get_template_part('templates/content', 'work'); ?>

しかしthemes/roots/templates/content-work.phpは表示されませんでした。代わりに、themes/roots/page.phpが提供されていたようですか?テストとして手動でpage.phpget_template_part('templates/content', 'work')に編集したとき、それは私が欲しかったテンプレートを使用していましたがそれからそれはwebsite.com/creativework/の下にANYTHINGのホームページを表示していた場所にポストIDか何か間違ったものを持っていました。

起こりうるすべての衝突を排除するために、私は21を優先してRootsを無効にし、CPTを設定するために書いたプラグイン以外のすべてのプラグインを無効にしました(一番上のコード)。 website.com/creativework/website.com/creativework/post-titleの両方がsingle-creativework.phpの下に存在しているにもかかわらず、私がarchive-creativework.phpまたはthemes/twentythirteen(投稿エディタの「View Work」からのパーマリンク、または検索結果)を押すたびに、私はホームページの代わりに404を得ます。

編集:website.com/?creativework=post-title、ただし動作​​します。

私はこれらすべてに絶望的に混乱しています。カスタム投稿タイプのテンプレートを段階的に設定するための正しい、確実な方法は何ですか?理想的には、これをRootsで実行する方法を知りたいのですが、今のところはどのようにしてそれを機能させるのかについてだけで解決します。

1
Hugh Guiney

とった。私はそのように、プラグインの有効化/無効化にflush_rewrite_rules()を使用しようとしました:

function creativeworks_activate() {
  // register taxonomies/post types here
  flush_rewrite_rules();
}

function creativeworks_deactivate() {
  flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'creativeworks_activate' );
register_deactivation_hook( __FILE__, 'creativeworks_deactivate' );

…しかし、それは何もしないようでした。ただし、サイト全体のパーマリンクオプションを任意に変更して保存した場合、書き換えルールは正常にフラッシュされ、私のカスタム投稿タイプテンプレートは再び機能し始めました。

私を正しい方向に向けてくれたMiloに感謝します。

2
Hugh Guiney

私もルーツを使います、そして私は小さな回避策を持っています(本当にきれいではありませんが、私にとってそれは物事を組織化し続けます)。テンプレートディレクトリのルートにはsingle.phpがあります。そこにあなたが置くことができます:

if(is_singular('creativework')){
    get_template_part('templates/creativework', 'header');
    get_template_part('templates/creativework', 'main');
}

それからcreativework-header.phpcreativework-main.phpをtemplatesディレクトリに置きます。私はこの方法を使用しています。なぜなら私はいくつかのカスタム投稿タイプを持っていて、たくさんのsingle-cptname.phpファイルを使う代わりに自分の名前を使うことができるからです。私は実際にsingle.phpのすべての内容を削除し、そこに上記の関数を(そしてそれぞれの投稿タイプについてはさらにいくつかを)入れました。その次に、カスタム投稿タイプごとに複数のテンプレートパーツを含めることができます(いくつかは最大5つまであります)。これで私のものはずっとよく整理されています!

PS、あなたのカスタム投稿タイプの名前はcreativeworkcreative-workではないと確信していますか?

0
eskimo

フロントエンドで問題を引き起こしている可能性があるregister_post_typeの引数にエラーがあります。この議論:

 'has_archive' => 'true'

する必要があります:

 'has_archive' => true

カスタム投稿タイプ(creative_work)の単一テンプレートの正しいファイル名はsingle-creative_work.phpで、はテーマフォルダにあります。たとえば、テーマが "my_theme"の場合、ファイルsingle-creative_work.phpwp-content/themes/my_theme/single-creative_work.phpにあるはずです。 template_include() 関数を使用して、異なる場所からテンプレートファイルを含めることもできます。

あなたが話しているフォルダ構造はWordpressでは普通ではありません(roots/lib/roots/templates/など)。これらのフォルダはプラグインからのものですか?

0
cybmeta