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


21

テーマオプションまたはカスタムポストメタテキス​​トエリアがあるとします。今、私は複数のショートコード、一般的なテキスト、画像などを実行したい

ベストプラクティスとは何ですか?

オプション1:

$content = //my text area data;
echo apply_filters('the_content', $content);

オプション2:

$content = //my text area data;
echo do_shortcode($content);

どちらがベストプラクティスになるのか、そしてその理由を教えてください。

編集

シナリオについて詳しく説明します。クライアントの要件に合わせてテーマを開発します。場合によっては、投稿/ページ/カスタム投稿タイプに投稿メタを追加して、ショートコード(スライダー、連絡フォームなど)または単なるテキストを追加できるようにする必要があります。提出されたテキストです。

ショートコードを機能させるには、オプション1を使用します。今、私はこれが間違った方法であると誰かから聞いたので、を使用する必要がありますdo_shortcode。しかし、彼らはなぜそれが間違った方法であるかの説明を私に与えませんでした。それが私が尋ねている理由です。

このプロセス全体は、wpのデフォルトのテキストエディターで実行できます。しかし、テンプレート固有の使用のためにこれらのオプションを作成する必要があります。それが私のクライアントの望みです。

回答:


16

質問と回答の再検討

これらの質問が時々あなたを悩ませ、人生の後半で再び追い詰めますが、これはそのような質問の1つです。

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

私があなたの投稿で面白かったのは、カスタムフィールドとメタボックスを使用して、ユーザー入力からのカスタムコンテンツを誤って表示したことです。だから私は座ってこの作業を行い、カスタムフィールドデータとメタボックスデータを正しく使用するための可能な方法を考えました

これは私の考えです:

シナリオ:

注:これは、ニーズに合わせて変更できます。

単一の投稿で、ユーザーは自分のニーズに合わせて、投稿後にカスタムコンテンツを動的に表示したい/要求します。これは動的でなければなりません。コンテンツはカスタムクエリである必要があり、ユーザーは必要なときに表示するものと必要なものを選択する必要があります

可能な解決策:

ショートコードはカスタムフィールドで実行できないため、ここではショートコードは機能しません。do_shortcode動的ではなく、ハードコーディングされているため、どちらも機能しません。ご質問のとおり、カスタムフィールドを使用します。繰り返しますが、カスタムフィールドを使用してカスタムクエリまたはショートコードを実行しないでください

計画:

カスタムフィールドを使用して、クエリ引数のみを保存します。そのため、私たちが行うことは、というカスタムフィールドを作成することcustom_query_argumentsです。投稿エディタ画面に、すぐに使用できるカスタムフィールドが表示されます。

次のステップは、カスタムクエリ引数をフィールドに追加することです。たとえば、カテゴリ1の3つの投稿をタイトルで並べ替える必要があるとします。したがって、クエリ引数は次のようになります。(文字列形式

'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。これは通常、これらのフィルターには、wp_autoppタグを追加する有名なフィルターが含まれますthe_content()

apply_filters('the_content', $content); 通常は、使用せずget_postsWP_Postオブジェクトを直接操作する場所と組み合わせて使用​​されます。setup_postdata( $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 .....を使用します

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

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

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

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

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

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

私の推奨事項は、カスタムウィジェットまたはカスタムフィールドで使用できるシステムを調べることです。


1
説明をありがとう。すでに知っています。しかし、ターゲットがポストメタ/テーマオプションテキストエリアからショートコードのみを出力する場合、どのオプションがより正確になるかを尋ねました。私はoption1を使用してフィルタリングされたコンテンツを取得していますが、それは私の習慣になりました。また、オプション1を使用して、テキストファイルからショートコードを印刷することもできます。だから尋ねていた。
тнєスーフィー

編集を見ました。私はあなたのポイントを得ました。しかし、私のシナリオは異なります。テキストファイル/エリアといくつかのショートコードがあるようです。これで、ユーザーはそのエリアにショートコードを挿入できます。そのため、関数を直接使用することはできません。その部分を動的に保つ必要があります。
тнєスーフィー

そのテキストフィールドである場合、それはバックエンドページエディタ画面と同じです
ピーター・グーセン

投稿メタにすることができます。または、テーマオプションにすることもできます。両方にthe_contentフィルターを使用します。
тнєスーフィー

申し訳ありませんが、それでは意味がありません。カスタムフィールドでショートコードを使用する理由。なぜあなたはまったくショートコードを使用するのでしょうか。
ピーターグーセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.