web-dev-qa-db-ja.com

カスタム投稿タイプにテンプレートを追加する

自分のウェブサイトをカスタム投稿タイプで書き直して整理しやすくし、検索エクスペリエンスを向上させ、一部のページを他の投稿者から隠すことができるようにしましたが、少し問題があります。

私は私の貢献者が見るべきではないいくつかのファイルを含むFilesという名前の投稿タイプを設定しました。基本的に法的ページ、連絡先ページなど。

すべてのページをデフォルトのPages投稿タイプにしたので、ページ属性の各ページにテンプレートを選択できました。今私の新しいカスタムページタイプでは、私はページの順序を選ぶことができるだけで、他には何もできません。それで、私は正当なページ用のテンプレートと連絡先ページ用のテンプレートを持っています。それはすべてのPHPコードを含みます。新しいカスタム投稿タイプでこれらのテンプレートを選択する方法


_編集_

さて、私はsingle-*(post_type_name)*という名前のPHPファイルを設定することによってのみテンプレートを設定することが可能であることを理解しました。しかし、私が言ったように、私は2つの異なるテンプレートを持っています、そしてすぐにもっと多くのテンプレートが来るでしょう。可能性があるはずですね。 WordPressのメーカーは、単一のファイルに対して新しいpost_typeを作成させることはまずありません。

2
Sam

私が理解していることから、2つの選択肢があります。

オプション1:動的解決策 カスタム投稿タイプのカテゴリを作成 - 各カテゴリには独自のテンプレートがあります。

次に、カテゴリに基づいて分割された単一のテンプレートを作成します。 single-postypename.phpと両方のテンプレートに適用したいその他のもので一般的なヘッダーとフッターを使用するという意味ですが、その中で「カテゴリxの場合はコンテンツyテンプレートを使用する」というphpロジックを作成します。 (または部分的、部分的に好きです) "および"カテゴリzの場合はコンテンツzテンプレート(または部分的)を使用する "#:。テンプレートで作業しているのであれば、そのコードを使用しても問題ありませんが、コメントだけでなく例をまとめることもできます。

オプション2:静的解決策 あなたのカスタム投稿タイプの中の各投稿はそれ自身のテンプレートを取得します。

デフォルトとしてsingle-posttypename.phpが必要ですが、その後single-postypename-postslug.phpを作成してprestoすることができます。スラッグが一致する限り、その特定の投稿用のカスタムテンプレートがあります。それはただ何をすべきかを知っているでしょう。

オプション2例:

single-file.php(デフォルトのテンプレートとして)

single-file-legaldocument2.php(yourdomain.ca/file/legaldocument2のカスタムテンプレートとして)

2
Faye

WordPressバージョン4.7 から、カスタムページテンプレートをページとともに他の投稿タイプに割り当てることができます。このトピックに掲載された回答を参照してください。 https://wordpress.stackexchange.com/a/264573/14347

0
Vinod Dalvi

あなたの子供のテーマでこのようなテンプレートファイルを作成してください。

<?php

// Template Name: CPT Template
// Template Post Type: files

ファイルがあなたのカスタム投稿タイプの名前であると仮定します。

WordPressは現在 この機能をサポートしています

0
Dev

single_templateフィルタを使用すると、CPTに必要なテンプレートファイルを使用できますが、テンプレート名を選択して保存するための手段やその他の参照を動的な解決策にするのは、ユーザー次第です。

組み込みのpage投稿タイプはあなたのテーマで有効なテンプレートファイルの全てを読み、そのリストを metaボックス に追加することによってこれを行います。

カスタムフィールド(post meta) に手動でファイル名を保存してから、現在の投稿でそのメタキーをチェックするためのフィルタを追加することで、この動作をすばやく再現できます。これは私の他の答えから上のコメントでリンクされている素早いテストされていない例です -

function wpa_single_cpt_template( $templates = '' ){
    $single = get_queried_object();

    if( 'files' == $single->post_type ){
        $template_name = get_post_meta( $single->ID, 'my_template_file', 'true' );
        if( !empty( $template_name ) ){
            $templates = locate_template( $template_name, false );
        }
    }
    return $templates;
}
add_filter( 'single_template', 'wpa_single_cpt_template' );
0
Milo