我试图覆盖WP的默认附件URL结构,如果附件附加到帖子,URL为/post-slug/attachment-slug/,如果不是,则为/attachment-slug/。
相反,我希望附件的行为类似于帖子,因为它们有一个存档,所有URL都指向/archive-slug/attachment-slug/。
我发现了一个新的(我相信是4.4版)过滤器,它允许你修改帖子类型选项,但它似乎不像广告中所说的那样工作;
add_filter(\'register_post_type_args\', function ($args, $postType) {
if ($postType == \'attachment\'){
$args[\'has_archive\'] = true;
$args[\'rewrite\'] = [
\'slug\' => \'media\'
];
}
return $args;
}, 10, 2);
如果我
var_dump($args)
事实上,它们看起来是正确的(has\\u archive is true等),但似乎对URL没有任何影响。
如果开发人员的这一评论是正确的,这可能并不奇怪;“不适用于内置帖子类型”https://core.trac.wordpress.org/changeset/34242.
所以我的问题是,我怎样才能做到这一点?
我还尝试在init钩子中修改post-type对象,但它不会咬人:
$obj = get_post_type_object(\'attachment\');
$obj->has_archive = true;
$obj->rewrite = [
\'slug\' => \'media\'
];
SO网友:Tom G
这是未经测试的,所以很抱歉,但我想得很清楚,你有没有尝试过以后重新注册帖子类型?或在首次尝试后刷新重写规则flush_rewrite_rules();
?
function change_attachment_post_type() {
$args = get_post_type_object(\'attachment\');
$args->has_archive = true;
$args->rewrite = [
\'slug\' => \'media\'
];
register_post_type($args->name, $args);
// As a temporary one time, remove after first flush
flush_rewrite_rules();
}
add_action(\'init\', \'change_attachment_post_type\', 20);
SO网友:Denis Gorodetsky
这是我的解决方案。首先,您需要更改附件post类型的参数(如问题中所述):
add_filter( \'register_post_type_args\', \'change_attachment_post_type_args\', 10, 2 );
function change_attachment_post_type_args( $args, $post_type ){
//Turn on attachment archive page
if( \'attachment\' == $post_type ){
$args[\'has_archive\'] = \'media\';//this is slug
$args[\'rewrite\'] = true;
}
return $args;
}
然后更改
post_status
到
inherit
在…内
WP_Query
因为默认值为
post_status
是
publish
但所有附件都有
inherit
状态:
add_action( \'pre_get_posts\', \'get_all_posts_attachment\' , 10, 1);
function get_all_posts_attachment( $query ) {
if( is_post_type_archive(\'attachment\') && \'attachment\' == $query->get(\'post_type\') )
{
$query->set( \'post_status\', \'inherit\' );
}
return $query;
}