Paginierung mit benutzerdefinierter SQL-Abfrage

Ich habe meine eigene SQL-Zeichenfolge, um benutzerdefinierte Beitragstyp-Posts mit spezifischer WHERE-Klausel auszuwählen. Ich habe den Offset und das Limit verwendet, um entsprechende Beiträge abhängig von einer angezeigten Seite zurückzugeben. Das funktioniert gut.

Nun möchte ich die functionen previous_posts_link() und next_posts_link() arbeiten lassen. Beide werden von get_posts_nav_link der global $wp_query .

Gibt es eine Möglichkeit, global $wp_query mit meinen SQL-String oder $wpdb->get_results Ergebnisse oder etwas anderes $wpdb->get_results ? Also würden die nativen functionen previous_posts_link() und next_posts_link() WP funktionieren.

Wenn nicht, wie kann ich die functionen für die vorherige und die nächste Post-Verknüpfung reproduzieren?

Ich würde wirklich jede Hilfe und Beratung schätzen! Ich bin total dabei.
Vielen Dank 🙂

HINWEIS: Ich habe gerade bemerkt, dass previous_posts_link() auf allen Seiten korrekt funktioniert, aber no idea why und in diesem Fall, warum next_posts_link nicht funktioniert: S

Hier ist der Code:

 $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $post_per_page = intval(get_query_var('posts_per_page')); $offset = ($paged - 1)*$post_per_page; $sql = " SELECT SQL_CALC_FOUND_ROWS wp_posts.*, wp_postmeta.* FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) WHERE 1=1 AND wp_posts.post_type = 'movie' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND ((wp_postmeta.meta_key = '_expiry_date' AND CAST(wp_postmeta.meta_value AS DATE) >= '".$current_date."') OR (mt1.meta_key = '_expiry_date' AND CAST(mt1.meta_value AS CHAR) = '')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT ".$offset.", ".$post_per_page; $movies_all_current = $wpdb->get_results( $sql, OBJECT); if($movies_all_current) { global $post; //loop foreach( $movies_all_current as $key=>$post ) { setup_postdata($post); //display each post //... } //end foreach ?> //navigation  } 

Solutions Collecting From Web of "Paginierung mit benutzerdefinierter SQL-Abfrage"

Ok, ich bin am Ende angekommen. Ich konnte die WP_Query class nicht verwenden, da ich wirklich mein eigenes ziemlich großes und komplexes SQL benötigte. Hier ist, was ich am Ende hatte:

In functions.php ich meine eigene SQL und Logik zum Zählen der Werte, die für die WP Paginierungslogik benötigt werden:

 function vacancies_current( ){ global $wpdb, $paged, $max_num_pages, $current_date; $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $post_per_page = intval(get_query_var('posts_per_page')); $offset = ($paged - 1)*$post_per_page; /* Custom sql here. I left out the important bits and deleted the body as it will be specific when you have your own. */ $sql = " SELECT SQL_CALC_FOUND_ROWS {$wpdb->posts}.* FROM {$wpdb->posts} .... GROUP BY {$wpdb->posts}.ID ORDER BY {$wpdb->posts}.post_date DESC LIMIT ".$offset.", ".$post_per_page."; "; $sql_result = $wpdb->get_results( $sql, OBJECT); /* Determine the total of results found to calculate the max_num_pages for next_posts_link navigation */ $sql_posts_total = $wpdb->get_var( "SELECT FOUND_ROWS();" ); $max_num_pages = ceil($sql_posts_total / $post_per_page); return $sql_result; } 

Dann hätte ich in meiner Vorlagendatei:

 < ?php $vacancies_current = vacancies_current(); /*followed by a standart loop to display your results */ ?>  

Der Trick bestand darin, previous_posts_link() und next_posts_link den Wert von $max_num_pages und ihn offensichtlich korrekt zu berechnen.

Das funktioniert sehr gut. Hoffe es wird jemandem helfen 🙂

Dascha

Sehen Sie sich die benutzerdefinierten Abfragen an, mit denen Sie den Aufruf von wp_query auf viele interessante und nützliche Weise ändern und die Ergebnisse in Ihr globales Abfrageobjekt zurückübertragen können.

Erweitern Sie Anus Antwort. Statt sich auf Ihre benutzerdefinierte SQL-Abfrage zu verlassen, könnten Sie die WP_Query-class verwenden und WordPress alle schweren SQL-Abfragen behandeln lassen. Dies würde sicherlich Ihr Navigationsproblem lösen.

Beispielabfrage für einen Filmposttyp innerhalb Ihres _expiry_date meta_key:

 $today = getdate(); $args = array( 'post_type' => 'movie', 'meta_query' => array( 'meta_key' => '_expiry_date', 'meta_value' => $today, 'meta_compare' => '< ' ), 'posts_per_page' => -1, 'order' => 'DESC' ); $movie_query = new WP_Query( $args ); while ( $movie_query->have_posts() ) : $movie_query->the_post(); // Do stuff endwhile; ?>  
 < ?php global $wpdb, $paged; query_posts($query_string . '&posts_per_page=9'); $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $author = isset($_GET['author_name']) ? get_userdatabylogin($author_name) : get_userdata(intval($author)); query_posts($query_string . '&posts_per_page=9'); $args = array( 'post_type' => 'post', 'meta_query' => array( 'meta_key' => 'autor', 'post_status' => 'publish', 'meta_value' => $author->id, ), 'paged' => $paged, 'posts_per_page' => 9, 'order' => 'DESC' ); $postsQuery = new WP_Query( $args ); ?> 

Vorlage:

 

Články od < ?php echo $author->display_name; ?>

    < ?php while ( $postsQuery->have_posts() ) : $postsQuery->the_post(); ?>
  • < ?php the_post_thumbnail(array(260, 259)); ?> < ?php $class = ''; if (in_category('fashion')) { $class = "link-fashion"; } else if (in_category('beauty')) { $class = "link-beauty"; } else if (in_category('gourmet')) { $class = "link-gourmet"; } else if (in_category('lifestyle')) { $class = "link-lifestyle"; } else if (in_category('about-us')) { $class = "link-about"; } ?>

    < ?php // short_title('...', 25); echo get_the_title(); ?>

    < ?php the_excerpt(); ?>
  • < ?php endwhile; ?>
< ?php wp_pagenavi(); ?>