手动下单安排

时间:2015-09-07 08:43:47

标签: php wordpress wp-query

我的目标是允许基于用户后端输入的精确,粘性,仅限首页,定位帖子。所有其他WP行为应保持默认值。

  • 首页显示9个帖子
  • 用户可以在首页上选择帖子的位置(关闭,1-9)
  • 只有一个帖子可以有一个指定的位置,帖子有 选择最新的发布日期,其他具有相同定位的发布日期 被忽略并仍然是常规订单流的一部分

为了重新安排我的帖子,我运行第二个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。

  • 您可以在首页及更高版本上看到两次定位的帖子 一页分页。

可能的解决方案

  1. 我需要在第一次尝试时找到正确构建查询的方法。 我无法通过pre_get_posts过滤器了解如何实现这一目标。 使用&#34; menu_order&#34;像一些插件不是一个选项。按日期排序是必需的。

  2. 找一个返回ENTIRE WP_Query Posts数组的钩子,我就是这个 只需使用array_splice重新排列。

0 个答案:

没有答案