it-swarm.com.de

Fügen Sie für benutzerdefinierte Abfragen die Anzahl der Haftnotizen in die Anzahl der Seiten hinzu

Dieser Link löst das Problem, aber es ist nur für die Hauptabfrage. Was ist, wenn Sie eine benutzerdefinierte Abfrage verwenden? Wie können Sie die Antwort ändern unten:

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

Ich denke, wir können Folgendes versuchen: ( HINWEIS: Dies ist ungetestet, sollte aber theoretisch funktionieren, aber denken Sie daran, es ist ungetestet und kann fehlerhaft sein )

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);
        }
    }
}

Sie können jetzt einfach die folgende benutzerdefinierte Abfrage ausführen

$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 );

EINIGE ANMERKUNGEN:

  • Da wir nur auf Abfragen abzielen, bei denen der neue Parameter custom_query auf 1 gesetzt ist, sollten wir keine Prüfungen wie !is_admin() oder is_main_query() benötigen.

  • Da für unsere benutzerdefinierte Abfrage eine pre_get_posts-Aktion ausgeführt wird, würde ich nur die Parameter custom_query und paged in den Abfrageargumenten festlegen. Alle anderen Parameter würde ich einfach in der Aktion pre_get_posts hinzufügen.

  • Wenn Sie eine zweite Abfrage mit anderen Parametern und/oder Werten ausführen müssen, können Sie einfach custom_query auf 2 setzen und dann einfach einchecken, ob die $query->get( 'custom_query' ) einen Wert von 2 hat, wie if ( $query->get( 'custom_query' ) === 2 ) {

  • Ich habe gerade Ihren Code kopiert und die neue Parameterprüfung hinzugefügt. Ich habe Ihren Code nicht durchgearbeitet oder etwas geändert

1
Pieter Goosen

Anstatt eine Funktion zu erstellen, habe ich die Schleife mit der benutzerdefinierten Abfrage bearbeitet. Mein Beispiel ist für nur einen Beitrag zu zeigen.

Ich habe nur die if-Anweisung verwendet, wenn ein oder mehrere Stickys nur den ersten Sticky anzeigen.

<?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