自定义固定链接接受任何参数

时间:2017-06-11 作者:Christian Giupponi

我需要创建一个自定义permalink结构,我想在url中显示m自定义分类法,类似于:

www.example.com/ristoranti/italia/milano/my-post-slug
第一部分是帖子类别,添加了WP Categories菜单
italiamilano 是否使用自定义插件创建分类,其中milano 是的孩子italia:

function mlt_create_custom_taxonomies()
{
    $labels = [
        \'name\'              => _x( \'Locations\', \'taxonomy general name\', \'mlt\' ),
        \'singular_name\'     => _x( \'Location\', \'taxonomy singular name\', \'mlt\' ),
        \'search_items\'      => __( \'Search Locations\', \'mlt\' ),
        \'all_items\'         => __( \'All Locations\', \'mlt\' ),
        \'parent_item\'       => __( \'Parent Location\', \'mlt\' ),
        \'parent_item_colon\' => __( \'Parent Location:\', \'mlt\' ),
        \'edit_item\'         => __( \'Edit Location\', \'mlt\' ),
        \'update_item\'       => __( \'Update Location\', \'mlt\' ),
        \'add_new_item\'      => __( \'Add New Location\', \'mlt\' ),
        \'new_item_name\'     => __( \'New Location Name\', \'mlt\' ),
        \'menu_name\'         => __( \'Location\', \'mlt\' ),
    ];

    $args = [
        \'labels\' => $labels,
        \'exclude_from_search\' => true,
        \'has_archive\'         => true,
        \'hierarchical\'        => true,
        \'rewrite\'             => array( \'with_front\' => false, \'hierarchical\'        => true, ),
        \'show_ui\'             => true,
        \'show_tagcloud\'       => false,
    ];

    register_taxonomy( \'location\', [ \'post\' ], $args );
}
add_action(\'init\', \'mlt_create_custom_taxonomies\');
要将自定义分类添加到url,我已编辑了permalink结构,如下所示:

/%category%/%location%/%postname%/
我还为添加了重写规则%location% 要添加分类,请执行以下操作:

function location_post_type_link( $link, $post ) {

    if (\'post\' == $post->post_type) {
        if ( $terms = get_the_terms( $post->ID, \'location\' ) ) {                
            foreach ($terms as $term) {
                $tax_array[] = $term->slug;
            }
            $link = str_replace( \'%location%\', implode(\'/\',$tax_array), $link );
        }
    }
    return $link;
}
add_filter( \'post_link\', \'location_post_type_link\', 10, 2 );
使用此代码,我可以创建链接。

问题是,如果我创建一个假url,如:

www.example.com/ristoranti/XXXXX/XXXX/my-post-slug 我可以看到帖子,而XXXX/XXX 完全错了。

这怎么可能?如何确保url中的分类法是正确的?

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

我想这就是查询解析器的工作方式。如果创建新的WP_Query 实例,并提供一个帖子name, 您添加的任何分类参数都将被忽略,并且不会添加到查询中。后段唯一性完全基于后段塞来确定,并强制执行段塞的唯一性。

修复是可能的,但我真的认为没有必要。如何生成这些随机的错误URL?如果您访问其中一个错误的URL,您将看到规范链接是正确的,因此搜索引擎不会索引这些错误的URL,如果它们是以某种方式遇到的。

这么说来,这里有一个解决方案。将函数挂钩到wp, 这是在运行查询之后,但在加载模板之前。在这里,我们可以检查它是否是单数帖子,获取被查询帖子的ID,并检查它是否实际包含这些术语。如果没有,我们将生成404。

function wpd_check_singular_post_terms() {
    global $wp_query;
    if( is_singular( \'post\' )
    && isset( $wp_query->query_vars[\'location\'] )
    && isset( $wp_query->query_vars[\'category_name\'] ) ) {
        if( ! has_term( $wp_query->query_vars[\'location\'], \'location\', get_queried_object_id() )
        || ! has_term( $wp_query->query_vars[\'category_name\'], \'category\', get_queried_object_id() ) ){
            $wp_query->set_404();
            status_header( 404 );
        }
    }
}
add_action( \'wp\', \'wpd_check_singular_post_terms\' );
请注意,现在的结果实际上不是404!惊喜设置404使redirect_guess_404_permalink 函数kick-in,它为请求的帖子名获取正确的永久链接,并在那里进行301重定向。

结束

相关推荐