php - Wordpress pre_get_posts 中断所有页面

我知道这应该是显而易见的,但我的功能是让所有页面都使用 index.php 除了使用 archive-project.php 的页面和该帖子类型的类别页面。

function change_project_loop( $query ) {

  // Make sure this only fires when we want it too
  if( !is_admin() || is_home() || is_page_template( 'archive-projects.php' )  &&  $query->is_main_query() && $query->is_tax('projectcat') ) {

// If so, modify the order variables
$query->set('meta_key', 'status' );
$meta_query[] = array(
            array(
           'key' => 'status',
           'value' => 'assigned',
           'compare' => 'NOT LIKE',
             ),
             );
$query->set('meta_query',array( $meta_query ) );
}

}
add_action('pre_get_posts', 'change_project_loop', 9999);

我只希望它在主页、使用 archive-projects.php 的页面和“projectcat”的分类页面上运行。

回答1

如果条件不正确。

if ( !is_admin() || is_home() || is_page_template( 'archive-projects.php' )  &&  $query->is_main_query() && $query->is_tax('projectcat') ) {
    // ...
}

这意味着它不是管理页面或主页或模板存档项目中。php

AND $query->is_main_query() AND $query->is_tax('projectcat') 为真。

!is_admin() 始终是 true 如果您在头版的主题/模板中使用 is_home() 并且 is_page_template() 为 false 但满足您的条件之一。

如果所有 $query 条件为真则意味着此 if 条件将始终在您的首页上起作用。

要解决这个问题,请删除 !is_admin() 因为它是不必要的,is_home()is_page_template() 已经可以用于首页。

还要用括号将您的 OR 条件包裹起来以将它们分组。

if( (is_home() || is_page_template( 'archive-projects.php' ))  &&  $query->is_main_query() && $query->is_tax('projectcat') ) {
    // ...
}

现在,这意味着(它必须在家里或使用特定模板)- 这些条件之一必须为真。

并且所有 $query 条件必须为真。

相似文章

最新文章