web-dev-qa-db-fra.com

Personnaliser le permalien lors de la création d'un article

J'ai un type de message personnalisé nommé maisons. Dans mon type de message personnalisé, j'ai plusieurs champs personnalisés que j'ai créés avec ACF.

Ce que je dois faire, c'est changer le permalien lorsque je crée un nouveau poste.

Je souhaite utiliser les champs de code et de titre pour personnaliser le lien permanent:

//code + post title
4563312-house-example-1

Je développe un plugin qui contrôle tout.

Existe-t-il un moyen d’intermettre la création d’un message pour mettre à jour son lien permanent?

Merci.

1
Italo Borges

L'exemple que Cedon m'a donné, j'ai pu atteindre ce dont j'avais besoin, avec quelques modifications.

Avec wp_insert_post_data, je ne pouvais pas obtenir la valeur du champ personnalisé et, pour ce faire, je devais utiliser une autre action, save_post .

function rci_custom_permalink($post_id) {
  $post = get_post($post_id);
  if($post->post_type !== 'houses') return;

  $code = get_field('code', $post_id);
  $post_name = sanitize_title($post->post_title);
  $permalink = $code . '-' . $post_name;

  // remove the action to not enter in a loop
  remove_action('save_post', 'rci_custom_permalink');

  // perform the update
  wp_update_post(array('ID' => $post_id, 'post_name' => $permalink));

  // add the action again
  add_action('save_post', 'rci_custom_permalink');
} 

add_action('save_post', 'rci_custom_permalink');

PS: Comme tous ces champs sont obligatoires, je n'ai pas eu besoin de vérifier s'ils sont vides ou non.

Pour référence sur l'action save_post: Plugin API/Action Reference/save post

2
Italo Borges

Cela peut être fait en utilisant le hook wp_insert_post_data.

function house_post_slug( $data ) {
    if ( $data['post_type'] == 'houses' ) {
       $permalink = '';

       if ( isset ( $_POST['ACF Code Field'] ) ) {
          $permalink = $_POST['ACF Code Field'];
       }

       if ( isset ( $_POST['post_title'] ) ) {
          $permalink .= '-' . $_POST['post_title'];
       }

       $data['post_name'] = sanitize_title( $permalink )
    }

    error_log( '=== Filter $data ===');
    error_log( print_r($data, true) );
    return $data;

}
add_filter( 'wp_insert_post_data', 'house_post_slug' );

Ainsi, ce filtre interceptera $data à partir de WordPress et vérifiera si le champ post_type correspond à votre type de publication personnalisé et ne se déclenchera que pour ce CPT particulier.

Ensuite, il vérifiera si le champ de code ACF est défini. Et si tel est le cas, il affectera `$ permalink à cette valeur.

Je n'ai pas utilisé ACF, donc je ne suis pas sûr de la structure utilisée. Vous pouvez en voir un dump en ajoutant:

error_log( print_r ( $_POST, true ) );

Ensuite, il vérifiera et verra si la clé post_title est définie. Si tel est le cas, il ajoutera - et quelle que soit la valeur de post_title.

Enfin, nous définissons la clé post_name dans $data sur une version modifiée de $permalink, puis nous la renvoyons.

Je mets dans deux déclarations error_log() afin que vous puissiez voir le dump de $data à des fins de diagnostic.

3
Cedon