web-dev-qa-db-ja.com

Loopの投稿間に(特定のカテゴリからの)投稿を挿入する

WordPressループ内の投稿の間に(特定のカテゴリからの)投稿を追加したい( 'Sponsors'など)。例:

P P P S
P P S P
P S P P

どうすればこれを達成できますか?私はコーディングの初心者なので、自分でループを変更するのに十分なことはわかりません。解決策を提供できるループコーディング忍者はありますか。

以下が私の現在のループです。投稿を価格で、またはランダムな順序で並べ替えるために使用されます。

index.php

<?php while (have_posts() ) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<?php  the_excerpt(); the_meta ();
endwhile; 

previous_posts_link();
next_posts_link();
?>

functions.php

function my_custom_query($query){
 if ( $query->is_home() && $query->is_main_query() ) {

  $sort= $_GET['sort'];

  if($sort == "A"){
   $query->set( 'orderby', 'Rand' );
   $query->set( 'posts_per_page', '2' );
  }

  if($sort == "B"){
   $query->set( 'meta_key', 'price' );
   $query->set( 'orderby', 'meta_value_num' );
   $query->set( 'order', 'DESC' );
   $query->set( 'posts_per_page', '2' );
  }
}
}

add_action( 'pre_get_posts', 'my_custom_query' );

編集:更新

Birgireのプラグインは動きます!当初、私は自分のテーマでプラグインを動かすのに問題がありました。問題は、index.phpのループ内で使用するこのコード部分です(カスタムフィールドを表示するために呼び出すために使用します)。

<?php
    global $wp_query;
    $postid = $wp_query->post->ID;
    echo get_post_meta($postid, 'price', true);
    wp_reset_query();
?>
6
leko

自動スポンサー投稿インジェクター:

これが 私の答え に基づく1つのアイデアです。 Xの通常の投稿ごとにY個のカスタム投稿を表示する方法は?

私はそれをもう少し便利にした ここGithub上で しかし、それはもっともっと洗練されるかもしれません(将来の作業)。

SponsorPostsInjectorクラスは、フィルタthe_postloop_startおよびloop_endを使用してSponsor投稿をテーマに自動的に挿入するのに役立ちます。

プラグインをアクティブにし、次の例をfunctions.phpファイルに追加して注入を開始します。

/**
 * Inject a sponsor post after the first post on the home page,
 * and then again for every third post within the main query.
 */

add_action( 'wp', 'my_sponsor_injections' );

function my_sponsor_injections()
{
    if( ! class_exists( 'SponsorPostsInjector' ) ) return;

    // We want the sponsor posts injections only on the home page:
    if( ! is_home()  ) return;

    // Setup the injection:
    $injector = new SponsorPostsInjector( 
        array(
            'items_before_each_inject' => 3,
            'items_per_inject'         => 1,
            'template_part'            => 'content-sponsor',
        ) 
    );

    // Setup the injection query:
    $injector->query(
        array(
            'post_type'  => 'sponsor',
            'tax_query'  => array( 
                array(
                   'taxonomy' => 'country',
                    'terms'   => 'sweden',    
                    'field'   => 'slug', 
                )
            )
        )
    );

    // Inject:
    $injector->inject();
}

ここで、注入されたスポンサー投稿のレイアウトを制御するために、現在のテーマディレクトリにcontent-sponsor.phpテンプレートファイルを作成しました。

これは、これもページネーションの面倒を見るべきだという考えです。

あなたはうまくいけばあなたのニーズに合わせてこれを調整することができます。

6
birgire