修改查询以排除某些ID和某些父项及其对应的子项

时间:2016-07-07 作者:noquierouser

我正在尝试修改管理员query 其中,我需要根据两个条件排除几页:

基于某些标题排除,基于某些页面排除,包括其子页面要了解我需要完成的任务,想法如下。我有以下页面:

现在,我的实际代码允许我根据标题排除“PageB”和“PageZ”。我想做的是排除“Parent1”和“Parent3”and its corresponding children.

我现在运行的代码是:

add_action(\'pre_get_posts\', \'filter_dummy_pages\');
function filter_dummy_pages($query) {
  if (function_exists(\'get_current_screen\')) {
    $screen = get_current_screen();
    if (is_admin() and !current_user_can(\'manage_options\') and $screen->post_type == \'page\') {
      $query->set(\'post__not_in\', get_dummy_pages());
    }
  }
}

function get_dummy_pages() {
  $result = array();
  $pages_query = array(
    \'PageB\',
    \'PageZ\'
  );

  foreach ($pages_query as $page) {
    $result[] = get_page_by_title($page)->ID;
  }

  return $result;
}
我试着WP_Query 在…内get_dummy_pages(), 但是我得到了一个白色页面,所以我假设这个问题与attepmt a有关query 在实际query.

我也试过戳post_parent, post_parent__inpost_parent__not_in 选项,但我可以排除比我想要的更多的页面。

对于这个用例,我应该考虑哪些选项?

1 个回复
SO网友:noquierouser

结果表明,可以运行WP_Query 内部apre_get_posts 行动要牢记两个简单的原则:

  1. pre_get_posts 操作将改变every query ,因此需要包含其操作,指定需要更改的查询。在这种情况下,通过以下管线进行控制:

    if (
      is_admin()
      and !current_user_can(\'manage_options\')
      and $screen->post_type == \'page\'
    ) {
      ...
    }
    
    这意味着我只更改加载时发生的查询edit.php?post_type=page 在“管理”面板中。

    因为前者,pre_get_posts 将更改页面的主查询,即“查询所有页面”。我的问题试图运行WP_Query 在一个改变每个查询的操作中,这个操作也改变了我的“子查询”。因此,正如第一条原则所告诉我们的,我们需要控制act only on the main query, 因为如果我们不包含它,我们将得到一个无限循环。因此,我们的“遏制”行需要知道我们正在改变的是否是主要查询:

    if (
      is_admin()
      and !current_user_can(\'manage_options\')
      and $screen->post_type == \'page\'
      and $query->is_main_query()  // This contains only the main query
    ) {
      ...
    }
    
    所以现在我们可以运行任何WP_Query 我们想加入get_dummy_pages() 作用

相关推荐

WP-ADMIN:“对不起,您不能访问此页面。”

两周后不使用我们的WP站点,登录/wp-admin/ 出现白屏错误:抱歉,不允许您访问此页面。我有:重命名plugins 到plugins.temp.通过phpMyAdmin创建了一个新的管理员用户。新用户已user_meta 的作用a:1:{s:13:"administrator";s:1:"1";}.</已重命名themes 到themes.temp.</删除核心WordPress文件,并替换为新上载的文件</已替换.htaccess 使用默认