このリンク は問題を解決しますが、これはメインのクエリ専用です。カスタムクエリを使用している場合はどうなりますか?どのようにあなたは 以下の答え を修正することができます:
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);
}
}
}
私たちは次のことを試すことができると思います:(注:これはテストされていませんが、理論上は動作しますが、テストされていないためバグがある可能性があります)
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_query
を2
に設定し、$query->get( 'custom_query' )
の値が2
であるかどうかをチェックできます(if ( $query->get( 'custom_query' ) === 2 ) {
など)
あなたのコードをコピーし、新しいパラメータチェックを追加しました。あなたのコードを操作したり、何も変更したりしていません。
関数を作成する代わりに、カスタムクエリでループを編集しました。私の例は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();
?>