窗口小部件中循环和查询上的冲突ARRAY_SPLICE

时间:2016-03-03 作者:nicogaldo

我使用函数array\\u slice在索引的循环中插入两个post。

function insert_post_wpse_96347($posts) {
  global $wp_query;
  $args = array(\'meta_key\' => \'Caja\', \'meta_value\' => array(\'UNO\',\'DOS\'), \'post__not_in\' => get_option("sticky_posts"), \'posts_per_page\' => \'2\',\'suppress_filters\'=>true);

  if (is_main_query() && is_home() &&  0 == get_query_var(\'paged\')) {
    $p2insert = new WP_Query($args);
    $insert_at = 0;
    if (!empty($p2insert->posts)) {
      array_splice($posts,$insert_at,0,$p2insert->posts);
    }
  }
  return $posts;
}
add_filter(\'posts_results\',\'insert_post_wpse_96347\');
我还创建了一个插件来显示浏览量最大的帖子。此插件在添加上一个函数之前工作。

/* set view post */
function observePostViews($postID) {
  $count_key = \'post_views_count\';
  $count = get_post_meta($postID, $count_key, true);
  if ($count==\'\') {
    $count = 0;
    delete_post_meta($postID, $count_key);
    add_post_meta($postID, $count_key, \'0\');
  } else {
    $count++;
    update_post_meta($postID, $count_key, $count);
  }
}
我的插件只是小部件的一个副本class-wp-widget-recent-posts.php 我只改变了WP_Query 使用\'meta_key\' => \'post_views_count\', \'orderby\' => \'meta_value_num\' 我如上所示创建的。

代替小部件,它显示的是两篇带有\'meta_key\' => \'box\', \'meta_value\' => array(\'ONE\',\'DOS\')

如何解决这一冲突?Array\\u splice,仅应用于循环,而不是全部查询我的主页

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

您的代码非常混乱,这使得调试很困难,所以我对您的代码进行了一些清理。

这个posts_results filter 接受两个参数,一个是posts结果数组,另一个是当前WP_Query 例子因此,您可以通过第二个参数,然后测试您的条件。

我没有测试您的代码,只是清理了它并添加了第二个参数。应该可以做到以下几点:(需要PHP 5.4+)

add_filter( \'posts_results\', \'insert_post_wpse_96347\', 10, 2 );
function insert_post_wpse_96347( $posts, \\WP_Query $q ) 
{
    remove_filter( current_filter(), __FUNCTION__ );

    if (    $q->is_main_query() 
         && $q->is_home() &&  
         0 == get_query_var( \'paged\' ) 
     ) {

        $args = [
            \'meta_key\'         => \'Caja\', 
            \'meta_value\'       => [\'UNO\',\'DOS\'], 
            \'post__not_in\'     => get_option( "sticky_posts" ), 
            \'posts_per_page\'   => \'2\',
            \'suppress_filters\' =>true
        ];

        $p2insert = new WP_Query($args);
        $insert_at = 0;
        if ( !empty( $p2insert->posts ) ) {
            array_splice( $posts, $insert_at, 0, $p2insert->posts );
        }
    }
  return $posts;
}

相关推荐

GET_POSTS查询大约需要40秒来执行

我在get\\u帖子中有一个元查询,它需要花很长时间才能完成。它工作得很好,但只是时间太长了。我有一个名为event. 在每个event 发布后,有自定义元数据:post\\U sort\\U日期(事件日期YmdHis 格式,用于排序)我需要做的是获取下一个事件,该事件相对于$year 和$month 变量。所以如果$year = 2021 和$month = 10 (2021 10月)然后应该在2021 11月或之后找到第一个事件。我下面的查询很好,但很慢。执行大约需要40秒,我不知道为什么。$next