「Products」という名前のカスタム投稿タイプと「Usage」という分類法があります。「製品」のランディングページで、クライアントがWYSIWYGを介して編集できるカスタムコンテンツを希望します。分類のランディングページについても同様です。私の考えは、偽のページを作成し、ID経由でコンテンツを私のarchive-products.phpおよびtaxonomy-usage.phpテンプレートにプルすることでしたが、それを処理するより良い方法があるかどうか知りたいと思いました。
「Products」という名前のカスタム投稿タイプと「Usage」という分類法があります。「製品」のランディングページで、クライアントがWYSIWYGを介して編集できるカスタムコンテンツを希望します。分類のランディングページについても同様です。私の考えは、偽のページを作成し、ID経由でコンテンツを私のarchive-products.phpおよびtaxonomy-usage.phpテンプレートにプルすることでしたが、それを処理するより良い方法があるかどうか知りたいと思いました。
回答:
最初の解決策は、Settings APIを使用して2つのフィールド「Products Description」と「Usage Description」を作成することです。その後、テンプレートでフィールドが次のように簡単であることを示します。
$options = get_option('my_theme_options');
echo $options['prod_description'];
// echo $options['usage_description'];
ただし、設定APIはWPコアの最良の部分ではありません。おそらく、そのフィールドだけの設定ページを作成しても意味がありません。
もう1つの方法は、ページを(カスタムページテンプレートを使用して)アーカイブとして使用することです。
ページを作成し、「製品アーカイブ」と呼びます
その中に何かを入れてください:
<?php
/*
Template Name: Products Archive
*/
get_header();
if ( have_posts() ) the post();
the_content(); // this will output the page content
$p_query = new WP_Query('post_type=products');
if ( $p_query->have_posts() ) { while( $p_query->have_posts() ) {
$p_query->the_post();
// this will require a 'entry-product.php' where you can put all your product markup
get_template_part('entry', 'product');
} }
wp_reset_postdata();
get_footer();
その後、バックエンドでページを作成し、作成したテンプレートに割り当てます。ページのコンテンツに好きなように書いてください。ページを開くと、ページのコンテンツと製品が表示されます。
分類ページでも同じことができます。ページテンプレートとその中のクエリを変更するだけです。
なんらかの理由でarchive-products.php
製品アーカイブとして使用する必要がある場合は、代わりにカスタムテンプレートを作成しますが、それを使用してページコンテンツを取得するだけです。
テーマにphpファイルを作成し、「page-prod-description.php」という名前を付けます。このファイルには以下のみを入れてください:
<?php
/*
Template Name: Products Description
*/
wp_safe_redirect( home_url() );
exit();
このファイルが行うことは、カスタムページテンプレートを作成することです。そのテンプレートはページに添付できますが、これらのページを直接呼び出すことはできません。これを実行すると、ホームページにリダイレクトされるためです。
次に、バックエンドにログインしてページを作成し、「製品の説明」というタイトルを付けて、作成したページテンプレートを割り当てます。ページにアクセスしようとすると、ホームページhttp://example.com/product-description
にリダイレクトされます。
製品アーカイブテンプレートではarchive-products.php
、そのページに挿入されたコンテンツを次のように使用できます。
$desc = get_pages('meta_key=_wp_page_template&meta_value=page-prod-description.php');
if ( ! empty($desc) ) {
$page = array_shift($desc);
echo apply_filters('the_content', $page->post_content );
}
これで、クライアントはバックエンドにログインして「製品の説明」ページを編集でき、ページコンテンツに書き込まれたすべてがアーカイブページに表示されます。
もちろん、分類アーカイブでも同じことができます。
Sloppy
これを処理する方法です。しかし、残念ながらこれを行うための明確な方法はありません。Wordpressはここでクリーンな方法を提供する必要があります、IMO!
通常のページを作成してから、CPTを出力するための適切なカスタムループを含むカスタムテンプレートを適用できます。または、クライアントがWYSIWYGを介してコンテンツを追加できるオプションページを作成(またはオプションをテーマカスタマイザに追加)し、このコンテンツを適切なアーカイブテンプレートに出力することもできます。
main_query
オブジェクトに影響を与え、アーカイブページで発生するクエリに対する$wp_query
権限post_type
を出力しなくなります。これpre_get_posts
により、アーカイブページの場合と同様に、フィルターの呼び出しが無駄になります。これが主な問題です。Wordpressは、投稿タイプのアーカイブと分類アーカイブのコンテンツを管理する手段も提供する必要があります。