如何用ACF值替换自定义POST类型的Slug?

时间:2018-12-02 作者:Noobie

我在高级自定义字段中有一个下拉选择类型字段。值为视频和图像。

我想替换自定义的post类型slug。目前,它是视频。

我想改变我的网站。com/video/post name到mysite。com/1/post name或mysite。com/0/post名称

我的意思是,当选择下拉值视频时,它将显示mysite。com/1/post名称。

我可以替换post-type slug。

function update_video_slug( $args, $post_type) {

$cptslug = "newslug";

if ( \'video\' === $post_type ) {
    $args[\'rewrite\'][\'slug\'] = $cptslug;
}

return $args;

}

add_filter( \'register_post_type_args\', \'update_video_slug\', 10, 2 );
根据ACF值,$cptslug值是否可以动态变化?

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

可以是$cptslug 根据ACF值动态确定值?

是的,它可以。

方法如下:

首先,我的ACF字段设置如下:

姓名:video_or_image
类型:选择选项:

1 : Video
0 : Image
所以我像这样注册post类型,其中重写slug设置为%video_or_image% —i、 e。%{Name of the ACF field}%, 但您不必遵循这种格式:

register_post_type( \'video\', array(
    \'label\'   => \'Video\',
    \'public\'  => true,
    \'rewrite\' => array(
        \'slug\' => \'%video_or_image%\',
    ),
    ...
) );
或者如果您想要或只能使用register_post_type_args 要更改重写段塞,只需设置$cptslug%video_or_image%.

接下来,我注册重写标记(%video_or_image%) 在register_post_type() 呼叫,连接到init 措施:

add_rewrite_tag( \'%video_or_image%\', \'([^/]+)\' );
必须注册标记,并确保标记被RegEx模式正确替换(即。([^/]+)) 保存重写规则时:

然后我使用适当的(ACF)字段值替换重写标记post_type_link 过滤器:

add_filter( \'post_type_link\', function( $url, $post ){
    if ( \'video\' === $post->post_type ) {
        $value = get_field( \'video_or_image\', $post->ID );
        $url = str_replace( \'%video_or_image%\', $value, $url );
    }

    return $url;
}, 10, 2 );
仅此而已,但别忘了刷新重写规则—只需访问永久链接设置页面。

我建议您为ACF字段设置一个默认值,并尽可能使用“更好”的值。。我是说,除了10.. 但如果你对这些值有把握,那么(我认为)没关系

在我的情况下,仅使用([^/]+) 在“重写”标记中,在加载页面(即。page 职位类型):

add_rewrite_tag( \'%video_or_image%\', \'([^/]+)\' );

How I solved the problem

<使用唯一标识符,例如。v/ 例如:

add_rewrite_tag( \'%video_or_image%\', \'v/([^/]+)\' );
然后在后permalink中,v/ 还应添加到重写标记替换值中&mdash;请参阅上面的步骤#4:

$url = str_replace( \'%video_or_image%\', \'v/\' . $value, $url );
我将ACF字段值限制为数字,然后使用:

add_rewrite_tag( \'%video_or_image%\', \'(\\d+)\' );
那个(\\d+) 不保证与其他重写规则没有冲突,但至少在我的情况下,它是有效的。

很抱歉([^/]+) &mdash;我以为01 价值观只是一个例子。我应该用(\\d+).

相关推荐