如何将特定的帖子带到WordPress循环的前面?

时间:2015-01-10 作者:yaserso

所以,我有一个WordPress循环。下面的代码是woocommerce产品归档页面的模板页面。下面是我试图找到如何实现的用例:

用户将显示产品存档页面(列出了包装在链接中的产品缩略图)TL;DR: 总而言之,我如何才能转到另一个页面,该页面具有完全相同的帖子,页码完全相同(页面与分页位置相同),但所选帖子位于页面循环的开头,同时保持帖子的顺序仍然相关(如所选帖子之前的帖子仍然在前面,后面的帖子仍然在后面)?

PS: 我不希望使用插件解决方案,也不希望使用客户端解决方案(我希望所有这些都在PHP服务器上完成)。

For example:

我在第页5:

职位如下:41、42、43、44、45、46、47、48、49、50。

假设我点击了44。

我看到的页面具有相同的循环,但开头有44个循环,其他循环也相应地重新排列。

循环内容如下:44、45、46、47、48、49、50、41、42、43。

如果我点击下一页。因为我在第页5 并点击6, 循环将再次正常:51、52、53。。。

<?php get_template_part(\'templates/page\', \'header\');

    /**
    * woocommerce_before_main_content hook
    *
    * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
    * @hooked woocommerce_breadcrumb - 20
    */
    do_action(\'woocommerce_before_main_content\');

    do_action( \'woocommerce_archive_description\' );

    if ( have_posts() ) {

        /**
         * woocommerce_before_shop_loop hook
         *
         * @hooked woocommerce_result_count - 20
         * @hooked woocommerce_catalog_ordering - 30
         */
        do_action( \'woocommerce_before_shop_loop\' );

        woocommerce_product_loop_start();

        woocommerce_product_subcategories();

        while ( have_posts() ) {

            the_post();

        ?>

        <li>

            <?php get_template_part( \'woocommerce/content\', \'product\' );

        </li>

        <?php
        }
        woocommerce_product_loop_end();
        /**
         * woocommerce_after_shop_loop hook
         *
         * @hooked woocommerce_pagination - 10
         */
        do_action( \'woocommerce_after_shop_loop\' );

    } elseif ( ! woocommerce_product_subcategories( array( \'before\' => woocommerce_product_loop_start( false ), \'after\' => woocommerce_product_loop_end( false ) ) ) ) {

    wc_get_template( \'loop/no-products-found.php\' );
    }
    /**
    * woocommerce_after_main_content hook
    *
    * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
    */
    do_action(\'woocommerce_after_main_content\');

    ?>

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

这个\'the_posts\' 过滤器挂钩允许您编辑将在循环中显示的帖子。

它针对所有查询(主查询和辅助查询)启动,因此您需要检查所执行的查询是否正确。

也就是说,在您的情况下,您可以:

发送查询变量以个性化所选帖子的使用\'the_posts\' 筛选以在帖子数组的开头移动所选帖子。发送查询变量以个性化所选帖子应使用以下方式打印帖子缩略图:

<a href="<?php esc_url( add_query_arg( array(\'psel\' => get_the_ID() ) ) ) ?>">
  <?php the_thumbnail() ?>
</a>
add_query_arg() 将查询变量添加到当前url,这意味着如果您位于包含该url的页面上example.com/some/path/page/5 通过单击ID为44的帖子的帖子缩略图,您将被发送到urlexample.com/some/path/page/5?psel=44.

一旦url是相同的,显示的帖子将是相同的,但由于psel url变量您可以对帖子重新排序,使所选帖子位于帖子数组的开头。

2。使用\'the_posts\' 筛选在帖子数组的开头移动所选帖子一旦在url变量中有了所选帖子id,将相关帖子对象放在帖子数组的顶部只需几个PHP函数即可

function get_selected_post_index() {
  $selID = filter_input(INPUT_GET, \'psel\', FILTER_SANITIZE_NUMBER_INT);
  if ($selID) {
    global $wp_query;
    return array_search($selID, wp_list_pluck($wp_query->posts, \'ID\'), true);
  }
  return false;
}

add_filter(\'the_posts\', function($posts, $wp_query) {

  // nothing to do if not main query or there\'re no posts or no post is selected
  if ($wp_query->is_main_query() && ! empty($posts) && ($i = get_selected_post_index())) {
      $sel = $posts[$i]; // get selected post object
      unset($posts[$i]); // remove it from posts array
      array_unshift($posts, $sel); // put selected post to the beginning of the array
  }

  return $posts;

}, 99, 2);
前面的代码将确保帖子按您想要的顺序排列。

这个get_selected_post_index() 函数还可以在模板中使用,以了解是否有选定的帖子(并相应地修改模板),因为它返回false 未选择post时(或如果通过发送错误的Idpsel url变量)。

结束

相关推荐

Escape current post from loop

我正在创建一个搜索小部件,为此我通过新的WP\\u Query()使用了一个二级循环;$query = new WP_Query(\'s=searchTerm\'); if ($query->have_posts()){ while ($query->have_posts()){ $query->the_post(); //echo the post } wp_reset_postda