WordPress Paginate $ wpdb-> get_results

8

Aufgrund einer komplexen Multisite-Konfiguration habe ich eine Abfrage, die die Beiträge von zwei Blogs kombiniert, und ich möchte die Ergebnisse paginieren . Ich bin für jede Hilfe dankbar. Ich habe meine Anfrage gepostet.

            $latestposts = $wpdb->get_results(

            "
            (SELECT * FROM net_5_posts
            INNER JOIN net_5_term_relationships ON net_5_posts.ID=net_5_term_relationships.object_id  
            WHERE post_type = 'post' 
            AND post_status = 'publish' 
            AND term_taxonomy_id = '151' 
            )

            UNION ALL

            (SELECT * FROM net_7_posts
            INNER JOIN net_7_term_relationships ON net_7_posts.ID=net_7_term_relationships.object_id  
            WHERE post_type = 'post' 
            AND post_status = 'publish' 
            AND term_taxonomy_id = '20' 
            )

            ORDER BY post_date
            DESC LIMIT 5",'ARRAY_A');

            foreach ($latestposts as $latestpost) {

            $da_id = $latestpost['ID'];
            $da_title = $latestpost['post_title'];
            $da_content = strip_tags($latestpost['post_content']);
            $da_content = limit_words($da_content,55);
            $da_link = $latestpost['guid'];
            $da_date = $latestpost['post_date'];
            $da_date = date('F j, Y', strtotime($da_date));

            echo '
            <div class="ldapost">
            <h2 class="lheader"><a href="'.$da_link.'">'.$da_title.'</a></h2>
            <span class="ldate">'.$da_date.'</span>
            <span class="lcontent">'.$da_content.'…</span><br>
            <a class="button btnright" href="'.$da_link.'">Continue Reading</a>
            </div>
            ';

            }
uknowit2
quelle

Antworten:

13

Aktualisieren

Ich habe dies getestet und es funktioniert auf meiner Website. Ein paar Dinge:

  • Ersetzen Sie meine $querydurch Ihre
  • global $wpdb (gemäß Ihrem Kommentar zu globalen Variablen), da es außerhalb des Geltungsbereichs liegt!
  • get_results() Gibt ein Objekt zurück, wenn nichts anderes angegeben ist (der zweite Parameter ist der Rückgabetyp).
  • Ich habe dies in ein Plugin eingefügt, aber Sie können den Code extrahieren und in Ihr Thema einfügen oder ihn einfach einfügen functions.php.

Hier ist die Funktion:

function test_function() {

    global $wpdb;

    $query = "
        (SELECT * FROM wp_18_posts
        INNER JOIN wp_18_term_relationships ON wp_18_posts.ID=wp_18_term_relationships.object_id  
        WHERE post_type = 'post' 
        AND post_status = 'publish' 
        AND term_taxonomy_id = '2')

        UNION ALL

        (SELECT * FROM wp_17_posts
        INNER JOIN wp_17_term_relationships ON wp_17_posts.ID=wp_17_term_relationships.object_id  
        WHERE post_type = 'post' 
        AND post_status = 'publish' 
        AND term_taxonomy_id = '2')";

    $total_query = "SELECT COUNT(1) FROM (${query}) AS combined_table";
    $total = $wpdb->get_var( $total_query );
    $items_per_page = 1;
    $page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
    $offset = ( $page * $items_per_page ) - $items_per_page;
    $latestposts = $wpdb->get_results( $query . " ORDER BY post_date LIMIT ${offset}, ${items_per_page}" );

    foreach ($latestposts as $latestpost) {
        $da_id = $latestpost->ID;
        $da_title = $latestpost->post_title;
        $da_content = strip_tags($latestpost->post_content);
        $da_content = wp_trim_words($da_content, 55);
        $da_link = $latestpost->guid;
        $da_date = $latestpost->post_date;
        $da_date = date('F j, Y', strtotime($da_date));

        echo '
        <div class="ldapost">
        <h2 class="lheader"><a href="'.$da_link.'">'.$da_title.'</a></h2>
        <span class="ldate">'.$da_date.'</span>
        <span class="lcontent">'.$da_content.'…</span><br>
        <a class="button btnright" href="'.$da_link.'">Continue Reading</a>
        </div>
        ';
    }

    echo paginate_links( array(
        'base' => add_query_arg( 'cpage', '%#%' ),
        'format' => '',
        'prev_text' => __('&laquo;'),
        'next_text' => __('&raquo;'),
        'total' => ceil($total / $items_per_page),
        'current' => $page
    ));
}

Ursprünglicher Beitrag

Die Funktion paginate_links ist unabhängig von Ihrer Abfrage. Mit einigen Parametern wie der Gesamtzahl der Elemente und der aktuellen Seite kann die gewünschte Paginierung bereitgestellt werden. Sie müssen also Folgendes berechnen:

  1. Die Gesamtzahl der Elemente
  2. Die aktuelle Seitenzahl, 1-basiert
  3. Der Offset für die MySQL-Limit-Anweisung.

Ich habe so etwas gedacht (ungetestet, sorry!):

$query = "
    (SELECT * FROM net_5_posts
    INNER JOIN net_5_term_relationships ON net_5_posts.ID=net_5_term_relationships.object_id  
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    AND term_taxonomy_id = '151' 
    )

    UNION ALL

    (SELECT * FROM net_7_posts
    INNER JOIN net_7_term_relationships ON net_7_posts.ID=net_7_term_relationships.object_id  
    WHERE post_type = 'post' 
    AND post_status = 'publish' 
    AND term_taxonomy_id = '20' 
    )";

$total = $wpdb->get_var( "SELECT COUNT(1) FROM (${query}) AS combined_table" );
$items_per_page = 5;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $items_per_page ) - $items_per_page;
$latestposts = $wpdb->get_results( $query . " ORDER BY post_date LIMIT ${offset}, ${items_per_page}" );

foreach ($latestposts as $latestpost) {
    // Your code here ...
}

echo paginate_links( array(
    'base' => add_query_arg( 'cpage', '%#%' ),
    'format' => '',
    'prev_text' => __('&laquo;'),
    'next_text' => __('&raquo;'),
    'total' => ceil($total / $items_per_page),
    'current' => $page
));

Verweise:

getWeberForStackExchange
quelle
danke, hmmm konnte das mit meiner abfrage nicht ganz zum arbeiten bringen, mir fehlt vielleicht etwas.
uknowit2
Ich habe meine Antwort aktualisiert, um klarer zu sein, mit einem Pseudocode. Hoffentlich funktioniert das! Wenn nicht, bitte kommentieren! :)
getWeberForStackExchange
1
Hey Weberwithoneb, danke, dass du bei mir geblieben bist. Ich habe die aktualisierte Abfrage ausprobiert, aber es wird ein Leerzeichen angezeigt, keine Fehler, nur keine Ergebnisse. Ich kann bestätigen, dass die Abfrage in meiner Frage funktioniert. Muss ich Globals hinzufügen?
uknowit2
Ok, ich habe meine Antwort mit getestetem Code aktualisiert. Bitte kommentieren Sie mit Fragen!
getWeberForStackExchange
Beeindruckend!! Du bist ein GENIE und ich möchte ein großes Dankeschön sagen !! Funktioniert wie ein Traum !! Danke noch einmal.
uknowit2
1
// This worked great for me so much thanks! I just adapted for what I needed. Right in template file, Sweet!
global $wpdb;
// QUERY HERE TO COUNT TOTAL RECORDS FOR PAGINATION $total = $wpdb->get_var("SELECT COUNT(*)
$post_per_page = 10;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $post_per_page ) - $post_per_page;

// QUERY HERE TO GET OUR RESULTS $results = $wpdb->get_results

// PHP FOR EACH LOOP HERE TO DISPLAY OUR RESULTS
// END OUR FOR EACH LOOP

// PAGINATION HERE IN NICE BOOTSTRAP STYLES
<?php 
echo '<div class="pagination">';
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('&laquo;'),
'next_text' => __('&raquo;'),
'total' => ceil($total / $post_per_page),
'current' => $page,
'type' => 'list'
));
echo '</div>';
?>
cmocha
quelle