使用自定义分类名称作为变量时的CPT存档404ing

时间:2013-03-14 作者:Jonathan Wold

因此,我正在使用一个自定义的post类型归档,并生成一个基于JavaScript的过滤界面,用于对结果进行排序。

下面是一个示例:http://www.inverity.org/sermons/

现在,我想做的是将变量传递到脚本中,以便根据URL参数进行过滤。

这项工作:http://www.inverity.org/sermons/?presenters=4

问题是,这不会:http://www.inverity.org/sermons/?speakers=4

“speakers”是我正在使用的自定义分类法的名称,也是我要筛选的值。

你知道为什么会这样吗?我能做些什么来绕过它并防止404爆炸吗?

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

我在我目前从事的大型项目中遇到了同样的问题。当分类法和post类型slug之间发生冲突时,就会出现这种情况。问题是,您可以通过添加?taxonomy_name=term_slug 您还可以通过添加?post_type=custom_post_slug. 所以,这是相同的语法,WP不知道您想要什么;术语存档;或“或”;单个自定义帖子;。

唯一正确的解决方法(在我看来)是更改taxonomy slug或post\\u type-slug(我想,修复和处理重命名taxonomy的副作用可能更容易)。

第二个解决方案同样,我找到了一个精确的解决方案,您可以找到详细信息here. 换句话说,您可以设置register_taxonomy() 论点$args[\'query_var\'] = false 用于禁用查询参数speakers 充当分类学鼻涕虫。因此,如果您想直接在URL/$_GET var,你必须做一些其他的魔术。但至少,您将消除post\\u类型和分类名称之间的冲突。

或者,您必须flush_rewrite_rules 之后,无论你想以什么方式:

添加flush_rewrite_rules(); 在里面functions.php, 转到站点,刷新几次,删除该行并保存functions.php 再一次

第三种解决方案将自定义函数挂接到pre_get_posts(). 使用此方法时,您必须小心,在这种情况下,您将编辑查询参数。把这个放在functions.php.

function preQueryAction( $query ) {

    // classic approach to avoid messing queries in Admin and custom queries.
    if(is_admin() or !$query->is_main_query()) return; 
    
    // selectively filter only if you are on CPT arhive
    if(is_post_type_archive()){
        $query->set( \'speakers\', false );
    }
    
    return;
    
}


add_action( \'pre_get_posts\', \'preQueryAction\', 1 );

SO网友:funwhilelost

我在黑暗中拍照,这里。

我首先要看的是您的register\\u分类调用。您应该确保不要将query\\u var选项设置为false。

register_taxonomy(
  \'speakers\',
  array(\'post\'),
  array(
    \'rewrite\'                    => array( \'slug\' => \'media-channel\' ),
    \'public\'                     => true,
    \'query_var\'                  => \'speakers\',
  )
)
有了它,您可以确定可以使用get\\u posts测试查询。此测试如下所示:

$test_results = get_posts( array(
                      \'post_type\' => \'post\', 
                      \'numberposts\' => -1,
                      \'speakers\' => 4,
                  ) );
你得到结果了吗?在查看您的示例时,我强烈怀疑您的分类法可能与附件相关。如果是这种情况,我必须添加“post\\u status”=>“inherit”。

$test_results = get_posts( array(
                      \'post_status\' => \'inherit\',
                      \'post_type\' => \'attachment\', 
                      \'numberposts\' => -1,
                      \'speakers\' => 4,
                  ) );
你觉得这个怎么样?如果您在这里得到结果,那么可能是查询参数或重写规则出了问题。

法典register_taxonomy 引用如果使用“rewrite”参数,则需要刷新重写规则。

 global $wp_rewrite;
 $wp_rewrite->flush_rules();
现在您已经相当确定您从这个查询中获得了结果,您可以检查WordPress正在内部构建的查询。这可以使用优秀的插件“Debug This”或使用:

global $wp_query;
print_r($wp_query->query_vars);
这将显示WordPress使用“”speakers=4“”构造的查询。

结束

相关推荐

permalinks issue and archives

我对运行在WP 3.3上的一个站点有一个问题,当我们通过“/%post\\u id%/%postname%/”使永久链接成为任何内容时,归档页面会断开并变成404。经过一些研究,我明白了为什么从性能的角度来看,这不是一个好的做法,所以我尝试了建议的备选方案:“/%year%/%postname%/”和“/%post\\u id%/%postname%/”这两个建议都有效,只是只有使用post\\u id的建议,归档URL才会变成“/date/2012/11/”,并被找到。根据permalink的任何其他建