从后端列表中删除页面*并*相应地更新计数器

时间:2014-04-01 作者:andys

我使用隐藏了一些页面\'parse_query\' 钩子,但“已发布”页面的数量没有改变。。。我该在哪里换呢?

Update the page status count in admin

迄今为止我的代码:

$query->query_vars[\'post__not_in\'] = array(4);

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

是的,您在列表上方看到的处于各种状态的页面计数是通过运行获得的wp_count_posts 但表中的页面是通过运行WP_Query 这两件事unrelated.

如果还想修改计数,则还必须过滤wp_count_posts 使用\'wp_count_posts\' 过滤器挂钩。

此外,您还应该检查要从编辑中排除的页面的状态,因为wp_count_posts 分别统计所有状态。

因此,我们有两项任务:

从查询中删除页面从计数中删除页面我将为这两个任务编写两个函数,在这两个函数中,我需要检查我们是否在管理中,当前用户是否具有所需的功能,最后检查当前屏幕是否正确。我将编写一个执行这些检查的附加函数,以避免重复编写相同的代码:

function in_pages_edit() {
  if ( ! is_admin() || ! current_user_can( \'edit_pages\' ) ) return FALSE; 
  $s = get_current_screen();
  return ( $s instanceof WP_Screen && $s->id === \'edit-page\' );
}
现在我们可以为out 2个任务添加2个挂钩,我将在\'load-edit.php\' 措施:

function go_exclude_pages_from_edit() {
  if ( ! in_pages_edit() ) return;
  global $exclude_pages_from_edit;
  $exclude_pages_from_edit = array( 662 ); // <-- set here the page ids to exclude
  add_filter( \'wp_count_posts\', \'change_pages_count\', 10, 3 );
  add_action( \'pre_get_posts\', \'exclude_pages_from_edit\' );
}

add_action( \'load-edit.php\', \'go_exclude_pages_from_edit\' );
现在,我们可以从查询中删除页面:

function exclude_pages_from_edit( $query ) {
  if ( ! in_pages_edit() || ! $query->is_main_query() ) return;
  global $exclude_pages_from_edit;
  if ( ! empty($exclude_pages_from_edit) ) {
    $query->set( \'post__not_in\', $exclude_pages_from_edit );
  }
}
并调整计数(有关解释,请参阅内联注释):

function get_valid_page_from_post( $p ) {
  if ( $p instanceof WP_Post &&  $p->post_type === \'page\' ) return $p;
}

function change_pages_count( $counts, $type, $perm  ) {
  // do nothing if not on right page
  if ( ! in_pages_edit() || $type !== \'page\' ) return $counts;
  // do the work only once
  static $new_counts;
  if ( ! is_null( $new_counts ) ) return $new_counts;
  global $exclude_pages_from_edit;
  // get the pages objects and be sure they are valid pages
  $excluded = array_filter(
    array_map( \'get_post\', $exclude_pages_from_edit ), \'get_valid_page_from_post\'
  );
  // if no page object obtained do nothing
  if ( empty( $excluded ) ) return $counts;
  // count the statuses of the page objectt
  $statuses_excluded = array_count_values ( wp_list_pluck( $excluded, \'post_status\' ) );
  // subtract from each status count the excluded pages status count
  foreach ( $statuses_excluded as $status => $num ) {
    if ( isset( $counts->$status ) ) {
      $counts->$status = (string) $counts->$status - $num;
    }       
  }
  // save the ajusted count for next running and return
  $new_counts = $counts;
  return $counts;
}

SO网友:TheDeadMedic

post计数使用wp_count_posts() 函数,该函数忽略任何查询筛选器。您需要使用wp_count_posts 过滤器:

function wpse_139851_count_posts( $counts, $type ) {
    if ( $type === \'page\' && ! empty( $counts->publish ) )
        $counts->publish--; // Decrease by 1
    return $counts; 
}

add_filter( \'wp_count_posts\', \'wpse_139851_count_posts\', 10, 2 );

结束

相关推荐

重写admin-ajax.php的规则

我浏览了很多帖子,在google上搜索了很多,但还是没能实现。我正在尝试为管理ajax创建一个重写规则。php,以实现此处所示的相同结果:Adding admin-ajax.php to the frontend. Good or bad idea?但是,我不想使用htaccess文件。相反,我需要通过动态添加规则(比如使用add\\u rewrite\\u rule)来实现这一点,例如,因为要调用的ajax函数位于我正在编写的插件中,我希望提供一个友好的URL来调用。我似乎遵循了有关该方法的所有最佳做法