web-dev-qa-db-fra.com

Comment remplacer un slug de type post personnalisé par une valeur ACF?

J'ai un menu déroulant de type de sélection dans Champs personnalisés avancés. Les valeurs sont Vidéo et Image.

Je veux remplacer le slug de type poste personnalisé. Actuellement, c'est la vidéo.

Je souhaite remplacer mysite.com/video/post-name par mysite.com/1/1/post-name ou mysite.com/0/post-name

Je veux dire que lorsque la liste déroulante Vidéo est sélectionnée, elle affiche mysite.com/1/post-name.

Je peux remplacer le slug de type post.

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 );

Peut-être la valeur de $ cptslug dynamique en fonction de la valeur ACF?

1
Noobie

Peut-être la valeur $cptslug dynamique en fonction de la valeur ACF?

Oui il peut.

Voici comment:

  1. Tout d’abord, mes paramètres de champ ACF sont les suivants:

    Nom: video_or_image
    Type: Sélectionner
    Options:

    1 : Video
    0 : Image
    
  2. Donc, j’enregistre le type de message comme suit, où le slug de réécriture est défini sur %video_or_image% - i.e. %{Name of the ACF field}%, mais vous non devez suivre ce format:

    register_post_type( 'video', array(
        'label'   => 'Video',
        'public'  => true,
        'rewrite' => array(
            'slug' => '%video_or_image%',
        ),
        ...
    ) );
    

    Ou si vous voulez ou pouvez uniquement utiliser le register_post_type_args pour changer le slug de réécriture, , définissez simplement le $cptslug sur %video_or_image%.

  3. J'enregistre ensuite la balise de réécriture (%video_or_image%) après l'appel register_post_type(), qui est relié à l'action init:

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

    L'enregistrement de la balise est obligatoire et garantit que la balise est correctement remplacée par le motif RegEx (c'est-à-dire ([^/]+)) lorsque les règles de réécriture sont enregistrées:

  4. Ensuite, je remplace l'étiquette de réécriture par le champ approprié (ACF) value en utilisant le filtre 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 );
    

C'est tout, mais n'oubliez pas de vider les règles de réécriture - visitez simplement la page des paramètres de permalien.

Et je vous suggère de définir une valeur par défaut pour votre champ ACF, et utilisez "mieux" les valeurs si possible .. Je veux dire, autre que 1 ou 0 .. mais si vous êtes sûr de telles valeurs, alors (je pense) que tout va bien. =)

METTRE À JOUR

Dans mon cas, utiliser uniquement ([^/]+) dans la balise de réécriture provoque des problèmes lors du chargement de Pages (type de poste page):

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

Comment j'ai résolu le problème

  1. Utilisez un identifiant unique, par exemple v/ comme dans:

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

    Ensuite, dans le post-lien permanent, v/ devrait également être ajouté à la valeur de remplacement de la balise de réécriture - voir l'étape 4 ci-dessus:

    $url = str_replace( '%video_or_image%', 'v/' . $value, $url );
    
  2. J'ai limité la valeur du champ ACF au numérique, puis j'ai utilisé:

    add_rewrite_tag( '%video_or_image%', '(\d+)' );
    

    Ce (\d+) ne garantit pas l'absence de conflit avec d'autres règles de réécriture, mais au moins dans mon cas, cela a fonctionné.

Désolé pour le ([^/]+) - Je pensais que les valeurs 0 et 1 n'étaient que des exemples. J'aurais juste dû utiliser (\d+).

3
Sally CJ