web-dev-qa-db-ja.com

ベストプラクティスのカスタム関数、変数をエコーする場所

私はいくつかの投稿をクエリするためのカスタム関数を持っています。通常、関数の終わりに変数をエコーするので、関数のループ内で変数をエコーすることは問題ないかと思いました。もしそうなら、どのように適切にその変数に複数の値を格納するには?

以下のコード例を参照してください。

<?php 
function get_some_posts($args) { 
        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();
                //Can i echo variables here?
                get_template_part( 'parts/content-item', get_post_type() );

                //Or should i put it into a variable and if so how? Since the below is not working.
                $to_echo = get_template_part( 'parts/content-item', get_post_type() );
            }

        }
        //And then echo it at the end of the function?
        echo $to_echo;
}
add_action('custom_hook','get_some_posts');
2
RobbTe

一般的に言えば、はい。通常の出力が最後にエコーするのであれば、ループ中のエコーはそれほど変わりません。

function get_some_posts($args) { 
        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            while ( $query->have_posts() ) {

                $query->the_post();
                the_title(); // the_title() is the same as echo get_the_title();
            }

        }
}
add_action('custom_hook','get_some_posts');

上記の出力は、以下の出力と同じになります。

function get_some_posts($args) { 
        $query = new WP_Query( $args );

        if ( $query->have_posts() ) {

            // declare your variable to avoid php output errors
            $to_echo = '';

            while ( $query->have_posts() ) {

                $query->the_post();

                $to_echo .= get_the_title(); // ".=" adds to the current value of the variable.
            }

        }
        //And then echo it at the end of the function?
        echo $to_echo;
}
add_action('custom_hook','get_some_posts');

もちろん、私はあなたの質問のコードから直接作業しています。これはちょっとした文脈が欠けているので、タイトルの間にある種のスペースや改行を適用したいと思うでしょう。

実用的な例として、そしてループでそれをエコーし​​ないないというあなたの質問ですが、これは単なる例としての可能性です:

add_filter( 'the_content', 'get_some_posts' );
function get_some_posts( $content ) { 

    if ( is_single() ) {

        $query = new WP_Query( array( 'post_type' => 'page' ) );

        if ( $query->have_posts() ) {

            // declare your variable to avoid php output errors
            $to_echo = '';

            while ( $query->have_posts() ) {

                $query->the_post();

                $to_echo .= get_the_title() . "<br />";
            }

        }

        $content = $content . "<p>Checkout some pages:</p>" . $to_echo;
    }

    return $content;
}

これはあなたの「理論的」なものを取り、それをメインコンテンツ領域をフィルタリングするWPの「the_content」フィルタに適用するでしょう。最初に投稿が1つであるかどうかを確認し、そうであればページを取得するためのクエリを実行します。それはそれらのページのタイトルをリストに入れ、それにテキストを追加し、そして結果を返す前に(フィルタを通して来る)$ content変数に入ります。

私は実際にはリンクを含めなかったので、それは「現実世界」の例ではありません - タイトルだけで、それはばかげた量の余分なコンテンツになるかもしれないので数に制限がありません。 「どうやって」WP_Queryから結果を取得してそれを返すことができるかというあなたの質問のための例としてここにあります。だから、それは "フィルタ"が何をするのかの例です。それが行動だったら、それは違うだろう。あなたはどちらかをそれをグローバルとして宣言された変数に入れて後でアクション/フィルタでそのグローバルを拾う関数ORでそれをエコーする必要があるでしょう。

1
butlerblog