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.
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
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.