web-dev-qa-db-ja.com

カスタムクエリのページ投稿数にスティック投稿を含む

このリンク は問題を解決しますが、これはメインのクエリ専用です。カスタムクエリを使用している場合はどうなりますか?どのようにあなたは 以下の答え を修正することができます:

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {

    if ($query->is_main_query() && is_home()) { //how can we for specific custom query?

        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
                $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}
2
jkcoding

私たちは次のことを試すことができると思います:(注:これはテストされていませんが、理論上は動作しますが、テストされていないためバグがある可能性があります

add_action('pre_get_posts', 'ad_custom_query');
function ad_custom_query($query) {
    // No other checks should be necessary
    if ( $query->get( 'custom_query' ) === 1 ) ) {
        // set the number of posts per page
        $posts_per_page = 12;
        // get sticky posts array
        $sticky_posts = get_option( 'sticky_posts' );

        // if we have any sticky posts and we are at the first page
        if (is_array($sticky_posts) && !$query->is_paged()) {

            // counnt the number of sticky posts
            $sticky_count = count($sticky_posts);

            // and if the number of sticky posts is less than
            // the number we want to set:
            if ($sticky_count < $posts_per_page) {
            $query->set('posts_per_page', $posts_per_page - $sticky_count);

            // if the number of sticky posts is greater than or equal
            // the number of pages we want to set:
            } else {
                $query->set('posts_per_page', 1);
            }

        // fallback in case we have no sticky posts
        // and we are not on the first page
        } else {
            $query->set('posts_per_page', $posts_per_page);
        }
    }
}

次のカスタムクエリを実行するだけです。

$args = [
    'custom_query' => 1, // Note, this has to be an integer, '1' will not work
    'paged' = > $paged
// I would just add all the other parameters in the pre_get_posts action
];
$q = new WP_Query( $args );

いくつかのメモ:

  • 新しいcustom_queryパラメーターが1に設定されているクエリのみを対象とするため、!is_admin()is_main_query()などのチェックは不要です。

  • カスタムクエリでpre_get_postsアクションを実行しているため、クエリ引数にcustom_queryおよびpagedパラメータを設定するだけです。 pre_get_postsアクションに追加するだけのその他のパラメーター。

  • 異なるパラメーターや値で2番目のクエリを実行する必要がある場合は、単にcustom_query2に設定し、$query->get( 'custom_query' )の値が2であるかどうかをチェックできます(if ( $query->get( 'custom_query' ) === 2 ) {など)

  • あなたのコードをコピーし、新しいパラメータチェックを追加しました。あなたのコードを操作したり、何も変更したりしていません。

1
Pieter Goosen

関数を作成する代わりに、カスタムクエリでループを編集しました。私の例は1つだけ投稿することです。

1つ以上の粘着性がある場合は、最初の粘着性を示すだけならif文を使用しました。

<?php
$sticky_posts = get_option( 'sticky_posts' );
$sticky_count = count($sticky_posts);

if($sticky_count >= 1) {
    $loop = new WP_Query('p=' . $sticky_posts[0]); //show only first sticky
} else {
    $loop = new WP_Query( array( 'post_type' => 'post', 'category__not_in' => 'featured', 'posts_per_page' => 1 ) ); //if none show just the first non-sticky post
}

while ( $loop->have_posts() ) : $loop->the_post();
?>
1
jkcoding