如何检查最后的uri片段是否为自定义帖子类型或分类术语?

时间:2015-02-04 作者:serks

遵循Jeffs关于this thread 要在permalink中创建嵌套的父分类术语和子分类术语,请执行以下操作。。。

url。com/自定义帖子类型/分类父级/分类子级/cpt条目

除了一个问题外,它基本上都能正常工作。

在继续之前,我应该提到我有一个自定义的post类型,名为gallery 还有一种分类法叫做gallery_cat.


/gallery/ - archive-gallery.php
/gallery/wedding-cakes/ - parent taxonomy - taxonomy-gallery_cat.php     
/gallery/wedding-cakes/chocolate/ - child taxonomy - taxonomy-gallery_cat.php      
/gallery/wedding-cakes/chocolate/cpt-entry/ - CPT entry under child taxonomy - single-gallery.php
不工作

/gallery/wedding-cakes/cpt-entry/ - CPT entry under parent taxonomy


这是我在函数中的代码。php:

// ADD A GALLERY CUSTOM POST TYPE WITH GALLERY_CAT TAXONOMY
add_action(\'init\', \'create_gallery_post_type\');

function create_gallery_post_type() {

register_taxonomy(
    \'gallery_cat\',
    \'gallery\',
     array(
        \'label\' => \'Categories\',
        \'singular_label\' => \'Category\',
        \'hierarchical\' => true,
        \'query_var\' => true,
        \'rewrite\' => array(\'slug\' => \'gallery\', \'hierarchical\' => true ),
    )
);

$labels = array(
    \'name\' => _x(\'Gallery\', \'post type general name\'),
    \'singular_name\' => _x(\'Photo\', \'post type singular name\'),
\'add_new\' => _x(\'Add New\', \'gallery\'),
);

$args = array(
    \'labels\' => $labels,
    \'public\' => true,
    \'publicly_queryable\' => true,
    \'show_ui\' => true,
    \'query_var\' => true,
    \'capability_type\' => \'post\',
    \'hierarchical\' => false,
    \'menu_position\' => null,
    \'supports\' => array(\'title\',\'editor\',\'thumbnail\', \'excerpt\', \'author\', \'comments\'),
    \'rewrite\' => array(
        \'slug\' => \'gallery/%gallery_cat%\',
        \'with_front\' => false
    ),
    \'has_archive\' => \'gallery\',
    \'menu_icon\' => get_bloginfo(\'template_directory\') . \'/images/gallery-icon.png\' //16x16 png if you want an icon
); 

register_post_type( \'gallery\' , $args );
}



function filter_post_type_link($link, $post) {
if ($post->post_type != \'gallery\')
    return $link;
if ($cats = get_the_terms($post->ID, \'gallery_cat\')) {
    $link = str_replace(\'%gallery_cat%\', rtrim(get_taxonomy_parents(array_pop($cats)->term_id, \'gallery_cat\', false, \'/\', true),"/"), $link); // see custom function defined below
}
return $link;
}
add_filter(\'post_type_link\', \'filter_post_type_link\', 10, 2);


// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = \'/\', $nicename = false, $visited = array()) {    
$chain = \'\';   
$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) {
    return $parent;
}

if ($nicename)    
    $name = $parent -> slug;        
else    
    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
    $visited[] = $parent -> parent;    
    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}
if ($link) {
    // nothing, can\'t get this working :(
} else    
    $chain .= $name . $separator;
return $chain;    
}


//Rewrite rules
add_filter(\'rewrite_rules_array\', \'gallery_rewrite_rules\');
function gallery_rewrite_rules($rules) {
$newRules  = array();

$newRules[\'gallery/(.+)/(.+)/(.+)/?$\'] = \'index.php?gallery=$matches[3]\';   
$newRules[\'gallery/(.+)/(.+)/?$\'] = \'index.php?gallery_cat=$matches[2]\'; 
$newRules[\'gallery/(.+)/?$\']      = \'index.php?gallery_cat=$matches[1]\';

return array_merge($newRules, $rules);
}
现在,我认为问题在于我需要在重写规则数组中添加以下行:

$newRules[\'gallery/(.+)/(.+)/?$\'] = \'index.php?gallery=$matches[2]\';

因为我的自定义结构不会总是将帖子名作为第三个uri段,因为如果CPT仅在父分类下,那么它将位于第二个uri段中。

但当我加上这一点时,它破坏了一切。我最好的猜测是它与这条线冲突。。。

$newRules[\'gallery/(.+)/(.+)/?$\'] = \'index.php?gallery_cat=$matches[2]\';

杰夫,是谁帮我做到了这一点this thread, 说了下面的话。。。

如果将有不同级别的嵌套术语,那么需要编写一个函数来检查最后一个uri段是自定义post类型还是分类术语,以了解要添加的规则

有人知道如何做到这一点吗?

谢谢

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

要了解如何实现这一点,请通读Query Overview Codex page, 尤其是What Plugins can Modify 第节:

保存变量值后,修改查询规范(request 过滤器或parse_request 行动如果要使用条件标记测试,请使用parse_querypre_get_posts 操作,因为它们在is_ 变量已设置)。

在这种情况下,我们要筛选request, 这将是由parse_request method of the WP class (滚动到此功能的末尾,查看过滤器的应用位置)。

在我们的过滤器中,我们将检查gallery_cat 如果请求的术语实际上是现有的gallery_cat 学期如果不是,我们就假设是gallery post,并重置查询变量以对post而不是术语进行WordPress查询。为此,我们需要设置3个不同的查询变量-gallery, name, 和post_type.

function wpd_gallery_request_filter( $request ){
    if( array_key_exists( \'gallery_cat\' , $request )
        && ! get_term_by( \'slug\', $request[\'gallery_cat\'], \'gallery_cat\' ) ){
            $request[\'gallery\'] = $request[\'gallery_cat\'];
            $request[\'name\'] = $request[\'gallery_cat\'];
            $request[\'post_type\'] = \'gallery\';
            unset( $request[\'gallery_cat\'] );
    }
    return $request;
}
add_filter( \'request\', \'wpd_gallery_request_filter\' );

结束

相关推荐

Custom permalinks structure

我希望有这样的结构:www.mysite.com/2013 (必须显示2013年的所有职位)www.mysite.com/my-category/2013 (必须显示2013年和“我的类别”类别的所有帖子)www.mysite.com/my-category/my-tag/ (必须显示所有类别为“我的类别”和标记为“我的标记”的帖子)www.mysite.com/my-category/ (必须显示“我的类别”类别的所有帖子)www.mysite.com/my-