升级到4.4后自定义分类查询中断


9

我刚刚从4.2升级到4.4,现在我的分类查询返回空。在升级之前,它一直运行良好。

我已经注册了一个名为的自定义分类法'title',供我的自定义帖子类型使用'sg-publications'。按照WP模板层次结构,我创建了一个名为的模板taxonomy-title.php,该模板使用默认的查询args,到目前为止,已按标题正确显示了每个出版物。

这是该模板中$ queried_object和$ wp_query-> request的输出:

[queried_object] => WP_Term Object
    (
        [term_id] => 1256
        [name] => Stroupe Scoop
        [slug] => stroupe-scoop
        [term_group] => 0
        [term_taxonomy_id] => 1374
        [taxonomy] => title
        [description] => 
        [parent] => 0
        [count] => 30
        [filter] => raw
    )

[queried_object_id] => 1256

[request] => 
SELECT wp_posts.* 
FROM wp_posts 
INNER JOIN wp_term_relationships 
ON (wp_posts.ID = wp_term_relationships.object_id) 
WHERE 1=1 
AND wp_posts.post_title = 'stroupe-scoop' 
AND ( 
    wp_term_relationships.term_taxonomy_id 
    IN (1374)
    ) 
AND wp_posts.post_type = 'sg-publications' 
AND (wp_posts.post_status = 'publish' 
    OR wp_posts.post_status = 'private'
    ) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date 
DESC 

我在上面的查询中看到的问题就在后面WHERE 1=1,由于某种原因,它正在搜索post_title = 'stroupe-scoop'。这是不正确的-这是分类术语term,而不是帖子标题。实际上,当我注释掉该行并针对数据库运行它时,我得到了正确的回报。那么,是什么导致WP添加该条件,而(我假设)在我升级到4.4之前未添加该条件的呢?

这是taxonomy-title.php:

<?php
/**
 * @package WordPress
 * @subpackage Chocolate
 */
  global $wp_query;

  $quer_object = get_queried_object();
  $tax_desc    = $quer_object->description;
  $tax_name    = $quer_object->name;
  $tax_slug    = $quer_object->slug;

get_header();
get_sidebar();

$title = get_the_title( $ID );
$args  = array(
    'menu'            => 'new-publications',
    'container'       => 'div',
    'container_id'    => $tax_slug . '-menu',
    'menu_class'      => 'menu-top-style nav nav-tab',
    'menu_id'         => '',
    'echo'            => true,
    'fallback_cb'     => false,
    'before'          => '',
    'after'           => '',
    'link_before'     => '<i class="fa fa-chevron-circle-right fa-fw fa-2x"></i>',
    'link_after'      => '',
    'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
    'depth'           => 0,
    'walker'          => ''
);

?>

<div id="page-title">
  <h1><?php _e( 'Publications - ' . $tax_name, LANGUAGE_ZONE ); ?></h1>
  <p><?php _e( 'View our monthly newsletter and stay informed on the latest real estate news.', LANGUAGE_ZONE ); ?></p>

<?php wp_nav_menu($args); ?>

</div>

<div id="multicol">

<?php
if ( have_posts() ) : while ( have_posts() ) : the_post();

get_template_part( 'loop' , 'title' );

endwhile;
endif;
?>

</div><!-- end #multicol -->
<section class="page-text well"><?php _e( $tax_desc, LANGUAGE_ZONE ); ?></section>

<?php
get_footer();

在functions.php中,我有以下查询过滤器:

// use pre_get_posts to remove pagination from publications
function gd_publications_pagination( $query ) {
  if ( is_admin() || ! $query->is_main_query() )
    return;

  if ( is_tax('title') ) {
    // Display all posts for the taxonomy called 'title'
    $query->set( 'posts_per_page', -1 );
    return;
  }
}
add_action( 'pre_get_posts', 'gd_publications_pagination', 1 );

查询代码在哪里?如果它在您的模板中,那么为什么不删除破坏它的零件呢?如果不是,您使用什么来生成查询?
蒙特利尔,2015年

没有自定义查询代码,我使用的是WP默认循环。因为我正在遵循模板层次结构,所以WP应该(并且已经在升级之前)为我的分类法生成正确的查询参数。
加里D

2
你的内容是taxonomy-title.php什么?您是否查看主题functions.php以检查主查询上是否有任何过滤器?
蒙特利尔,2015年

Answers:


5

我不建议您使用与公共查询变量(如)相符的分类标准title

title 查询变量是在4.4推出,所以我认为这可以解释你的问题。

看看这部分的的WP_Query类:

    if ( '' !== $q['title'] ) {
        $where .= $wpdb->prepare( 
            " AND $wpdb->posts.post_title = %s", 
            stripslashes( $q['title'] ) 
        );
    }

因此,当我们使用例如:

example.tld/?title=test

WordPress在这里应该做什么?是分类查询还是标题搜索?

因此,我建议给自定义分类标准段加上前缀,例如

gary_title

以避免可能的名称冲突。

更新:

感谢@ ocean90 指出这是一个错误,它将在4.4.1中修复


2
感谢您对4.4的更改提出警告-我怀疑这可能是命名冲突。一旦运行了几次测试,我就会跟踪。
加里D

直到几个版本之前,您都无法注册post type code,因为这使得整个管理员后端都是等距的。通用名称始终是冲突候选者。另一方面,WordPress应该在其内部添加前缀。
fuxia

是的,就是这样。一旦我将分类术语和相关的文件名更改为无冲突的方案,所有文件都恢复了。再次感谢您将我指向更新的WP代码。
加里D

很高兴听到它再次启动并运行@GaryD
birgire

很酷,我必须测试一下,如果我可以使用旧版本;-)我肯定会支持该前缀票,但我看不到不久的将来会发生,可悲的是@toscho
birgire
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.