我的目标是允许基于用户后端输入的精确,粘性,仅限首页,定位帖子。所有其他WP行为应保持默认值。
为了重新安排我的帖子,我运行第二个WP_Query来收集通过自定义元字段分配给他们的位置的所有帖子。元字段显示管理帖子页面上的选项1-9,但对应于数组的索引号,就像WP_Query对象发布数组一样。
function get_positioned_posts() {
$positioned_posts = get_posts( array (
'meta_query' => array(
array(
'key' => 'post_position',
'value' => array('0','1','2','3','4','5','6','7','8'),
'compare' => 'IN',
),
),
));
return $positioned_posts;
}
随后我获得MAIN posts数组,循环遍历它并在索引号与locate_post值匹配时插入一个定位的帖子。
function mns_post_position( $posts) {
if ( is_home() && is_main_query() && ! is_admin() && ! is_search() && ! is_archive()) {
$positioned_posts = get_positioned_posts();
$positioned_post_ids = wp_list_pluck( $positioned_posts, 'ID' );
$num_posts = count( $positioned_posts );
// Find the positioned posts
for ($i = 0; $i < $num_posts; $i++) {
if ( in_array( $positioned_posts[$i]->ID, $positioned_post_ids ) ) {
$positioned_post = $positioned_posts[$i];
// Remove post from current position
array_splice( $posts, 4, 1 );
// Get post position and put it in the posts array
$position = intval(get_post_meta( $positioned_post->ID, 'post_position', true ));
array_splice($posts, $position, 0, array($positioned_post));
}
}
}
return $posts;
}
add_action('the_posts', 'mns_post_position', 1 );
这很好用,但它只适用于主页而不适用于分页页面。 &#34; the_posts&#34; 操作仅获取当前的X(9)帖子,而不是整个WP Query帖子数组。这会导致不必要的行为:
如果定位帖子,首页上可以有超过9个帖子 来自页面&gt; 2。
您可以在首页及更高版本上看到两次定位的帖子 一页分页。
可能的解决方案
我需要在第一次尝试时找到正确构建查询的方法。
我无法通过pre_get_posts
过滤器了解如何实现这一目标。
使用&#34; menu_order&#34;像一些插件不是一个选项。按日期排序是必需的。
找一个返回ENTIRE WP_Query Posts数组的钩子,我就是这个
只需使用array_splice
重新排列。