web-dev-qa-db-ja.com

apply_filters( 'the_content'、$ content)とdo_shortcode($ content)

テーマオプションまたはカスタムの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のデフォルトのテキストエディタで実行できます。しかし、私はテンプレート固有の使用法のためにそれらのオプションを作成する必要があります、それが私のクライアントが望むものです。

18
тнє Sufi

質問と回答の再検討

時々これらの質問があなたを悩ませて、そして人生の後半であなたを狩ることがあります、そしてこれはそのような質問です。

この質問は私が問題の代替解決策について考えていました。すでに述べたように、カスタムフィールドとメタボックスは、小さなメタデータを格納するためのものであり、ショートコードや関数を実行できるコンテンツを投稿するための拡張機能としては機能しません。また、すでに述べたように、あなたの方法は間違っているので使わないでください

あなたの投稿で私が興味を持ったのは、ユーザー入力からカスタムコンテンツを誤って表示するためにカスタムフィールドとメタボックスを使用したということです。そこで私は座って、これを機能させ、カスタムフィールドデータとメタボックスデータを正しく使用するための可能な方法を考えました

これは私の考えです:

シナリオ:

注:これは必要に応じて変更できます

単一の投稿では、ユーザーは自分のニーズに合わせて投稿の後にカスタムコンテンツを動的に表示することを望んでいます。これは動的なはずです。コンテンツはカスタムクエリである必要があります、そして、彼が望むときはいつでも何を見せるべきか、そして彼が望むものを選ぶ必要があります

考えられる解決策

ショートコードはカスタム項目では実行できないため、ショートコードはここでは機能しません。動的ではなく、ハードコードされているため、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つの別々のものである

オプション1

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()のようなテンプレートタグが使用可能になります。

オプション2

do_shortcode はページエディタ画面バックエンドのテキストエディタの外側のテンプレートファイルのどこかにショートコードを追加するために使用され、基本的にそれらのフックを通してショートコードをフィルタリングします。

正しい使い方は次の通りです

例:テンプレートファイルにギャラリーのショートコードを追加する

echo do_shortcode( '[gallery]' )

編集1

あなたのコメントから、私はそのときショートコードをまったく使用しないでしょう。

もしあなたがテキストエディタでショートコードを追加してテンプレートファイルのdo_shortcode経由で直接(ハードコード)追加しようとしていないのであれば、単に関数をテンプレートに追加したいと思います。

例:

以下のショートコード機能がある場合

function footag_func( $atts ) {
    return "foo = {$atts['foo']}";
}
add_shortcode( 'footag', 'footag_func' );

次のようなテンプレートで直接関数を呼び出すことができます。

echo footag_func();

ショートコードを解析する必要がないため、この方法でははるかに高速です。

編集2

ここで正直に言うと、あなたはあなたの編集からこれを完全に間違ってやっています。それが私があなたの最初の質問を理解できなかった理由です

時々、私は投稿/ページ/カスタム投稿タイプに投稿メタを追加する必要があります、それらがショートコード(スライダー、連絡フォームなど)または単に単純なテキストを追加することができるように。それはテキストファイルです。

ショートコードを機能させるために、私はオプション1を使用します.....

カスタムフィールド are not textフィールドであり、ショートコードを実行するために使用されることは意図されていません。そのため、スライダーや連絡先フォームには使用されません。カスタムフィールドを投稿やページのテキストエディタの代わりに使用しないでください。

前に述べたように、apply_filters('the_content', $content);は生の投稿コンテンツにフォーマットを適用するために使われることを意図しています。

ここには2つの選択肢があります

  • テンプレートファイルで直接do_shortcodeを使用してください。これは、ショートコードを解析する必要がないため、関数を使用する方が速いのでお勧めできません。

  • 特定のページ/投稿にテキストエディタで直接ショートコードを使用する

私はあなたがあなたの構造とあなたが達成したいものを新しく見直すことを真剣にお勧めします。カスタムフィールドテキストエディタではなく、ショートコードやスライダを実行することはできません。

私のおすすめは、カスタムウィジェットや、カスタムフィールドで使用できるシステムを調べることです。

16
Pieter Goosen