在Wordpress模板中,我有一个索引文件,它显示了一些博客文章。查询不存在(但我想它可以被覆盖),但博客文章通过 have_posts()、while-loop 等显示。
它也使用一些分页。
我希望博客文章按属于文章作者的元键排序。我找到了解决这个问题的解决方案
$querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->usermeta umeta
WHERE wposts.post_author = umeta.user_id
AND umeta.meta_key = 'wp-last-login'
AND wposts.post_type = 'post'
AND wposts.post_status = 'publish'
ORDER BY umeta.meta_value DESC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);
然后制作一个 foreach 循环。
这工作正常,但它弄乱了分页。
因此,我想帮助找出如何让分页与foreach方法一起使用,或者获得一种对实际代码进行排序的方法,如上所示,但使用have_posts(),while-query等使用的普通查询方法。原始代码(但没有查询)的概述在这里。
<?php if (have_posts()) : ?>
<?php $count = 0; while (have_posts()) : the_post(); $count++; ?>
<!-- Show posts -->
<?php endwhile; ?>
<?php
$next_page = get_next_posts_link(__('Next', 'Destro'));
$prev_pages = get_previous_posts_link(__('Previous', 'Destro'));
if(!empty($next_page) || !empty($prev_pages)) :
?>
<div class="pagination">
<?php if(!function_exists('wp_pagenavi')) : ?>
<div class="al"><?php echo $prev_pages; ?></div>
<div class="ar"><?php echo $next_page; ?></div>
<?php else : wp_pagenavi(); endif; ?>
</div><!-- /pagination -->
<?php endif; ?>
etc...
----编辑-----
我现在尝试这样做,但它似乎不起作用。它入在 have_posts() 之前,循环开始
function joinPostmeta($join) {
global $wp_query, $wpdb;
$join .= "LEFT JOIN $wpdb->usermeta umeta ON $wpdb->posts.post_author = umeta.user_id";
return $join;
}
function wherePostmeta($where) {
global $wp_query, $wpdb;
$where .= "AND umeta.meta_key = 'wp-last-login'";
return $where;
}
function orderbyPostmeta($orderby_statement) {
global $wp_query, $wpdb;
$orderby_statement .= "umeta.meta_value DESC'";
return $orderby_statement;
}
add_filter('posts_join', 'joinPostmeta');
add_filter('posts_where', 'wherePostmeta');
add_filter('posts_orderby', 'orderbyPostmeta');
坚持像普通WordPress循环一样使用WP_Query,但使用posts_join,posts_where和posts_orderby过滤器来更改它生成的查询,以便它像查询中一样针对用户元数据进行查询。
这将允许WP_Query应用其通常的分页规则和其他行为。