Can be the
$cptslugvalue dynamic according to ACF value?
Yes, it can.
Here’s how:
-
First off, my ACF field settings are as follows:
Name:
video_or_image
Type: Select
Options:1 : Video 0 : Image -
So I register the post type like so, where the rewrite slug is set to
%video_or_image%— i.e.%{Name of the ACF field}%, but you don’t have to follow that format:register_post_type( 'video', array( 'label' => 'Video', 'public' => true, 'rewrite' => array( 'slug' => '%video_or_image%', ), ... ) );Or if you want to or can only use the
register_post_type_argsto change the rewrite slug, then just set the$cptslugto%video_or_image%. -
Next, I register the rewrite tag (
%video_or_image%) after theregister_post_type()call, which is hooked to theinitaction:add_rewrite_tag( '%video_or_image%', '([^/]+)' );Registering the tag is mandatory, and ensures that the tag is properly replaced with the RegEx pattern (i.e.
([^/]+)) when the rewrite rules are saved: -
Then I replace the rewrite tag with the proper (ACF) field value using the
post_type_linkfilter: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 );
That’s all, but don’t forget to flush the rewrite rules — simply visit the permalink settings page.
And I suggest you to set a default value for your ACF field, and use “better” values if possible.. I mean, other than . =)1 or 0.. but if you’re sure about such values, then (I think) it’s alright
UPDATE
In my case, using only ([^/]+) in the rewrite tag, causes troubles when loading Pages (i.e. page post type):
add_rewrite_tag( '%video_or_image%', '([^/]+)' );
How I solved the problem
-
Use a unique identifier, e.g.
v/as in:add_rewrite_tag( '%video_or_image%', 'v/([^/]+)' );Then in the post permalink,
v/should also be added to the rewrite tag replacement value — see step #4 above:$url = str_replace( '%video_or_image%', 'v/' . $value, $url ); -
I restricted the ACF field value to numeric, then I used:
add_rewrite_tag( '%video_or_image%', '(\d+)' );That
(\d+)does not guarantee no conflict with other rewrite rules, but at least in my case, it worked.
Sorry about the ([^/]+) — I thought the 0 and 1 values were just examples. I should’ve just used (\d+).