特定のWHERE句を使用してカスタム投稿タイプの投稿を選択するための独自のSQL文字列があります。表示されているページに応じて適切な投稿を返すためにoffsetとlimitを使用しました。それはうまくいっています。
さて、私はprevious_posts_link()
とnext_posts_link()
関数を機能させたいです。どちらもget_posts_nav_link
を使用するglobal $wp_query
から呼び出されます。
global $wp_query
を自分のSQL文字列、$wpdb->get_results
の結果、またはその他のものに再割り当てする方法はありますか?そのため、ネイティブのprevious_posts_link()
関数とnext_posts_link()
WP関数は機能します。
そうでなければ、どうやってprevとnext postのリンク機能を再現できますか?
私は本当にどんな助けとアドバイスにでも感謝します!私はこれで完全に立ち往生しています。
ありがとう:)
注: / previous_posts_link()
がすべてのページで正しく機能していることに気付いたのですが、no idea why
とこの場合、なぜnext_posts_link
が機能しないのか:S
これがコードです:
$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
<div class="navigation">
<div class="previous panel"><?php previous_posts_link('« newer') ?></div>
<div class="next panel"><?php next_posts_link('older »') ?></div>
</div>
}
さて、私は最後にそこに着きました。私はWP_Query
クラスを使うことができませんでした。私自身のかなり大きくて複雑なSQLを本当に必要としていたからです。これが私が持ってしまったものです:
functions.php
では、WPページネーションロジックに必要な値を数えるためのカスタムSQLとロジックがあります。
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;
}
それから私のテンプレートファイルで私は持っているでしょう:
<?php
$vacancies_current = vacancies_current();
/*followed by a standart loop to display your results */
?>
<div class="navigation">
<div class="previous panel"><?php previous_posts_link('« previous vacancies',$max_num_pages) ?></div>
<div class="next panel"><?php next_posts_link('more vacancies »',$max_num_pages) ?></div>
</div>
トリックはprevious_posts_link()
とnext_posts_link
に$max_num_pages
値を供給すること、そして明らかにそれを正しく計算することにありました。
これはとてもうまくいきます。それが誰かに役立つことを願っています:)
ダーシャ
Custom Queries - を見てください。これにより、wp_queryの呼び出しを多くの興味深い便利な方法で変更でき、結果を自分のグローバルなクエリーオブジェクトにプッシュバックできます。
Anuの答えを拡大する。あなたのカスタムSQLクエリに頼る代わりに、 WP_Queryクラス を使用し、WordPressにすべての重いSQLリフティングを処理させることができます。これは確かにあなたのナビゲーション問題を解決するでしょう。
_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; ?>
<div class="navigation">
<div class="previous panel"><?php previous_posts_link('« newer') ?></div>
<div class="next panel"><?php next_posts_link('older »') ?></div>
</div>