テーマオプションまたはカスタムのpostmetaテキスト領域があるとしましょう。今、私は複数のショートコード、一般的なテキスト、画像などを実行したいです。
ベストプラクティスとは何ですか、またその理由は何ですか。
オプション1:
$content = //my text area data;
echo apply_filters('the_content', $content);
オプション2:
$content = //my text area data;
echo do_shortcode($content);
どの方法がベストプラクティスになるのか、またその理由を教えてください。
_編集_
シナリオを詳細に説明しましょう。私は彼らの要求に応じてクライアントのためのテーマを開発します。時々、私は投稿/ページ/カスタム投稿タイプに投稿メタを追加する必要があります、それらがショートコード(スライダー、連絡フォームなど)または単に単純なテキストを追加することができるように。それはテキストファイルです。
ショートコードを機能させるために、 option 1 を使います。今、私は誰かからこれが間違った方法であると聞きました、そして私はdo_shortcode
を使うべきです。しかし、彼らは私にそれが間違った方法である理由の説明をしませんでした。それが私が求めている理由です。
このプロセス全体は、wpのデフォルトのテキストエディタで実行できます。しかし、私はテンプレート固有の使用法のためにそれらのオプションを作成する必要があります、それが私のクライアントが望むものです。
時々これらの質問があなたを悩ませて、そして人生の後半であなたを狩ることがあります、そしてこれはそのような質問です。
この質問は私が問題の代替解決策について考えていました。すでに述べたように、カスタムフィールドとメタボックスは、小さなメタデータを格納するためのものであり、ショートコードや関数を実行できるコンテンツを投稿するための拡張機能としては機能しません。また、すでに述べたように、あなたの方法は間違っているので使わないでください
あなたの投稿で私が興味を持ったのは、ユーザー入力からカスタムコンテンツを誤って表示するためにカスタムフィールドとメタボックスを使用したということです。そこで私は座って、これを機能させ、カスタムフィールドデータとメタボックスデータを正しく使用するための可能な方法を考えました
これは私の考えです:
注:これは必要に応じて変更できます
単一の投稿では、ユーザーは自分のニーズに合わせて投稿の後にカスタムコンテンツを動的に表示することを望んでいます。これは動的なはずです。コンテンツはカスタムクエリである必要があります、そして、彼が望むときはいつでも何を見せるべきか、そして彼が望むものを選ぶ必要があります
ショートコードはカスタム項目では実行できないため、ショートコードはここでは機能しません。動的ではなく、ハードコードされているため、do_shortcode
も機能しません。あなたの質問のように、私たちはカスタムフィールドを利用するつもりです。繰り返しになりますが、カスタムクエリまたはショートコードを実行するためにカスタムフィールドを使用しないでください。
カスタムフィールドを only に使用して、クエリ引数を保存します。それだけです。そこで、私たちがしていることは、custom_query_arguments
というカスタムフィールドを作成することです。あなたのポストエディタ画面に、使用可能なカスタムフィールドが表示されます。
次のステップは、私たちのカスタムクエリー引数を私たちのフィールドに追加することです。たとえば、カテゴリ1から3件の投稿をタイトル順に表示する必要があります。そのため、クエリの引数は次のようになります。(In string format)
'posts_per_page=3&cat=1&orderby=title'
これがカスタムフィールドに入力する必要があることです。入力したら、カスタムフィールドの値を保存します
次はsingle.phpでカスタムクエリを作成します。ここで必要なのは、カスタムフィールドから値を取得する必要があります。これは実際にはクエリ引数であり、投稿を取得するためにそれをWP_Query
の新しいインスタンスにフィードする必要があります。また、カスタムフィールドに実際に値が保存されているかどうかを確認する必要があります。カスタムフィールドが空の場合は何も表示されません。
単一の投稿の直後にsingle.phpでこのようなことを試すことができます。
$args = get_post_meta( get_queried_object_id(), 'custom_query_arguments', true );
// check if the custom field has a value
if( ! empty( $args ) ) {
$q = new WP_Query( $args );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata();
}
}
ユーザーがカスタムクエリを削除したい場合は、単にカスタムフィールドの値を削除し、カスタムフィールドを空白のままにします。同じクエリを表示する必要があるがカテゴリ10と合計5件の投稿から取得する必要がある場合は、元の値を次の値で置き換えることができます。
'posts_per_page=5&cat=10&orderby=title'
このカスタムフィールドとメタボックスに情報を入力するときは、正しい構文と形式を使用することが重要です。構文エラーや誤った情報は、望ましくない出力や致命的なエラーにさえつながるでしょう。あなたのクライアントにそのような情報を知らせることは重要です
私があなたが達成しようとしていることを理解していない、しかし私があなたに言うことができることから、それらは2つの別々のものである
apply_filters('the_content', $content);
は、コンテンツフィルタをフィルタ処理されていない生の投稿コンテンツに適用するために使用されます。通常、これは$post->post_content
の使用に由来します。これらのフィルタはpタグをthe_content()
に追加する有名なフィルタwp_autop
を含みます
apply_filters('the_content', $content);
は通常get_posts
と組み合わせて使用されます。ここではsetup_postdata( $post )
を使用せずにWP_Post
オブジェクトを直接操作します。これにより、the_content()
のようなテンプレートタグが使用可能になります。
do_shortcode
はページエディタ画面バックエンドのテキストエディタの外側のテンプレートファイルのどこかにショートコードを追加するために使用され、基本的にそれらのフックを通してショートコードをフィルタリングします。
正しい使い方は次の通りです
例:テンプレートファイルにギャラリーのショートコードを追加する
echo do_shortcode( '[gallery]' )
あなたのコメントから、私はそのときショートコードをまったく使用しないでしょう。
もしあなたがテキストエディタでショートコードを追加してテンプレートファイルのdo_shortcode
経由で直接(ハードコード)追加しようとしていないのであれば、単に関数をテンプレートに追加したいと思います。
例:
以下のショートコード機能がある場合
function footag_func( $atts ) {
return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );
次のようなテンプレートで直接関数を呼び出すことができます。
echo footag_func();
ショートコードを解析する必要がないため、この方法でははるかに高速です。
ここで正直に言うと、あなたはあなたの編集からこれを完全に間違ってやっています。それが私があなたの最初の質問を理解できなかった理由です
時々、私は投稿/ページ/カスタム投稿タイプに投稿メタを追加する必要があります、それらがショートコード(スライダー、連絡フォームなど)または単に単純なテキストを追加することができるように。それはテキストファイルです。
ショートコードを機能させるために、私はオプション1を使用します.....
カスタムフィールド are not textフィールドであり、ショートコードを実行するために使用されることは意図されていません。そのため、スライダーや連絡先フォームには使用されません。カスタムフィールドを投稿やページのテキストエディタの代わりに使用しないでください。
前に述べたように、apply_filters('the_content', $content);
は生の投稿コンテンツにフォーマットを適用するために使われることを意図しています。
ここには2つの選択肢があります
テンプレートファイルで直接do_shortcode
を使用してください。これは、ショートコードを解析する必要がないため、関数を使用する方が速いのでお勧めできません。
特定のページ/投稿にテキストエディタで直接ショートコードを使用する
私はあなたがあなたの構造とあなたが達成したいものを新しく見直すことを真剣にお勧めします。カスタムフィールド は テキストエディタではなく、ショートコードやスライダを実行することはできません。
私のおすすめは、カスタムウィジェットや、カスタムフィールドで使用できるシステムを調べることです。