web-dev-qa-db-ja.com

ショートコードとget_template_partの組み合わせ

私はWordPressサイトを管理し、通常コンテンツの下に貼り付けるテンプレート部分を作成しました。

    <div class="posts-group">

        <h2>Featured store products</h2>

        <?php $catquery = new WP_Query( 'post_type=product&posts_per_page=4&orderby=Rand' );
        while($catquery->have_posts()) : $catquery->the_post();
        ?>
        <a href="<?php echo get_post_meta($post->ID,'PRODUCT-url', true);?>">
            <article class="post home-post homeproduct">
                    <div class="post-thumbnail-img">
                        <?php the_post_thumbnail('small-thumbnail'); ?>
                    </div>
                    <h2><?php the_title(); ?></h2>              
                    <p></p>
            </article>
        </a>

        <?php endwhile; ?>

</div>

今、私はこれをコンテンツの中に入れることを試みているので、私はショートコードを使うことを考えました

function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');

今私が[products]を投稿するたびに、私はその商品がそこに行くことを期待しています。しかし、上記のコードを試すと、商品のtemplate_partは、ページの一番上、タイトルの真下、実際のコンテンツの直前まで表示されます。

しかし、単にテキストを返すようにショートコードを編集すると、そのテキストはコンテンツの中央に表示されます。

誰が何が起こっているのか理解していますか?そうじゃないから。

3
vlovsky

これを試して

function get_products($atts) {
  ob_start();
  get_template_part('block-products-inline');
  return ob_get_clean();
}
add_shortcode('products', 'get_products');

ちょっと説明

phpはsee print文を実行するとただちにコンテンツを出力します。ここですることは、すべての出力をバッファに保持し、すべてが終了するまで出力を印刷しないことです。

それから我々は最終的な全体の結果(出力)を返しています。これにより、いつ、どこで出力を印刷するかを制御できます。

あなたはそれをvariableに代入して必要なときにそれらを返すことさえできます

  ob_start();
  get_template_part('block-products-inline');
  $output =  ob_get_clean();
  //now you can return the output whenever you want with $output
12
WPTC-Troop