web-dev-qa-db-ja.com

オフセットを設定するときに特定のクエリを選択する方法

ワードプレスで私はそのようにオフセットを設定する機能を追加しました:

add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

    if ( ! $query->is_home() ) {
        return;
    }

    $offset = 1;
    $ppp = 3;

    if ( $query->is_paged ) {
        $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
        $query->set('offset', $page_offset );
    }
    else {
        $query->set('offset',$offset);
    }
}

この関数が行うことは、最初の投稿が表示されないように1のオフセットを追加することです。これは完璧に動作します。

しかし、もちろん '!query-> is_home'を使えば、私のウェブサイト上のすべてのクエリから最初の投稿を毎回削除することになります。

私がする必要があるのは、この関数を1つのクエリだけに適用することです。

だから私の質問は:どのように私は特定のクエリを選択することができます、私はそれが他の方法でそれを行う必要がある可能性さえ可能ですか?

______________________私のために働いた解決策__________________________

私は私のテンプレートページ 'page-blog.php'のループの 'offset'パラメータを次のようにページ分割を壊すことなく設定することができました(functions.php):

add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

        if ( !is_page_template( 'page-blog.php' )  ) {
        return ;
    }

    $offset = 1;
    $ppp = 3;

    if ( $query->is_paged() ) {
        $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
        $query->set('offset', $page_offset );
    }
    else {
        $query->set('offset',$offset);
    }
}

そのため、ページ内のそのページのすべてのループにoffsetパラメータを適用します。ページングされたクエリにのみ適用するには、ページングされず、オフセットを必要としないクエリにパラメータ 'posts_per_page' => -1 'を追加する必要がありました。だから私の場合はこれでした:

$featured_item = array(
    'post_type'=> 'post',
    'status' => 'publish',
    'posts_per_page'=> -1
);

get_posts($featured_item);

このソリューションでは、最新の投稿を個別に表示し、もちろんすべての投稿をページ区切りとオフセットで表示することができました。たぶん誰かがそれを使うでしょう。

たくさんs_h_dumのおかげで、私はあなたの助けに永遠に感謝しています!

1
Noob17

1つの単一クエリのみを実行したい場合は、引数配列を介してoffset引数を渡すだけです。

$offset = 1;
$ppp = 3;

if ( $query->is_paged ) {
    $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
}

blog_items = array(
    'post_type'=> 'post',
    'paged' => $paged,
    'posts_per_page'=> $ppp,
    'status' => 'publish',
    'offset' => $offset
);

$blogposts = get_posts($blog_items);

しかし、ページ付けしようとしているので、それでもまだ問題があるかもしれません。いくつかの引数だけでなく、すべての引数をpre_get_postsでプッシュするほうがうまくいくかもしれません。

// in functions.php
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

    if (is_main_query() || is_page_template( 'page-blog.php' ) ) {

      $offset = 1;
      $ppp = 3;

      if ( $query->is_paged ) {
          $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
          $query->set('offset', $page_offset );
      }
      else {
          $query->set('offset',$offset);
      }

      $query->set('post_type','post');
      $query->set('paged',$paged);
      $query->set('posts_per_page',3);
      $query->set('status','publish');

    }
}

その後、ページテンプレート内の通常のループが機能するはずです。

if(have_posts()) {
  while(have_posts()) {
    the_post();

  }
}

アクションを削除するにはremove_action('pre_get_posts', 'myprefix_query_offset', 1 );を使用してください。

2
s_ha_dum