聪明的规则,你可以找到它here.文档是here.
下载后,放入插件文件夹并激活它。
现在您必须注册您的规则。为此,您需要编写一个简单的插件(或向现有插件添加代码)。
创建一个新的php文件,并在其中放入如下内容:
<?php
/**
* Plugin Name: WPSE #125186 Tricky Rule
*
*/
add_action(\'plugins_loaded\', \'register_my_tricky_rule\');
function register_my_tricky_rule() {
if ( ! function_exists(\'register_clever_rule\') ) return;
$args = array(
\'id\' => \'my_custom_rule\',
\'route\' => \'/%s/%s/%s/%s\',
\'query\' => array(\'name\'=>\'[3]\')
);
register_clever_rule( $args );
}
将其保存在插件文件夹中并激活它。此时此刻,您想要的链接只起作用,but 它会破坏由4个“片段”组成的任何其他WordPress链接。a-parent-tax/a-child/a-granchild/something
.
为了避免这种情况,您只能在片段正确的情况下运行规则。这可以使用过滤器挂钩完成skip_clever_rule
.
在插件文件中,添加如下内容:
add_filter(\'skip_clever_rule\', \'skip_my_tricky_rule\', 10, 3);
function skip_my_tricky_rule( $skip, $rule, $pieces ) {
if ( $rule[\'id\'] == \'my_custom_rule\' ) {
$custom_taxes = get_taxonomies(
array(\'public\'=> true,\'_builtin\' => false, \'object_type\'=> array(\'post\') )
);
if ( ! in_array( $pieces[0], $custom_taxes ) ) return true;
// one of or both next two lines can be removed for performance reasons
if ( ! get_terms($pieces[0], array(\'fields\'=>\'ids\', \'slug\'=>$pieces[1]))) return true;
if ( ! get_terms(\'category\', array(\'fields\'=>\'ids\', \'slug\'=>$pieces[2]))) return true;
}
}
由于此过滤器,只有在url的前3个部分有效时,您才能运行自定义规则:如果第一个是有效的自定义分类名称,例如“作者”,如果第二个是该分类的有效术语,例如“斯蒂芬·金”,如果第三个是有效的类别术语,例如“新闻”,则这3个检查将逐一进行(请参见3if
在函数中)。然而,这需要付出性能方面的代价,因此您可能可以删除最后2项检查,但通过这种方式,任何url都可以如下所示:
/author/anything-here/anything-here/news-about-stephen-king
将打开news-about-stephen-king
邮递为了在准确性和性能之间达成妥协,您可以删除这两项检查中的一项,而保留另一项。
如果您将这两个代码块放入新的插件文件并保存,您的链接就会正常工作,然而,此时,您必须手动在地址栏中写入URL。。。
下一步是过滤帖子链接创建,以您想要的方式创建url。在同一插件文件中添加以下代码:
add_filter( \'post_link\', \'my_tricky_post_link\', 10, 2 );
function my_tricky_post_link( $url, $post ) {
if ( $post->post_type == \'post\' ) {
$custom_taxes = get_taxonomies(
array(\'public\'=>true, \'_builtin\'=>false, \'object_type\'=>array(\'post\'))
);
if ( empty($custom_taxes) ) return $url;
$newurl = \'\';
while( empty($newurl) && ! empty($custom_taxes) ) {
$tax = array_shift( $custom_taxes );
$terms = get_the_terms( $post->ID, $tax );
if ( ! empty($terms) ) {
$term = array_shift( $terms );
$newurl = $term->taxonomy .\'/\' . $term->slug;
}
}
if ( empty($newurl) ) return $url;
$categories = get_the_category( $post->ID );
if ( ! empty($categories) ) {
$cat = array_shift( $categories );
$newurl .= \'/\' . $cat->slug;
$url = home_url( $newurl . \'/\' . $post->post_name );
}
}
return $url;
}
仅此而已。请注意,这将与any 自定义分类法,无需更改一行代码。<小时>
Full plugin code can be downloaded here.