J'ai un fichier personnalisé appelé xxxx_url
. xxxx_url
devrait être unique.
Donc, avant de publier l'article, je veux m'assurer que xxxx_url
est unique ou pas? Si ce n'est pas unique, la publication de l'article doit être rejetée.
J'ai essayé publish_post
. Mais ce n'est pas la bonne, car cela se déclenche lorsque nous publions l'article. Je veux exécuter mon code juste avant la publication.
Au début de wp_insert_post
, la fonction qui enregistre/met à jour un article, il existe un filtre appelé wp_insert_post_empty_content
. Par défaut, ce filtre vérifie si les champs titre, éditeur et extrait sont tous vides. Dans ce cas, le processus de sauvegarde sera interrompu.
Toutefois, étant donné que tous les champs à enregistrer sont passés à ce filtre, vous pouvez développer ce filtre pour inclure tout autre test afin de déterminer si la publication doit être considérée comme vide. Ce serait quelque chose comme ça:
add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {
// extract custom field from $postarr, check uniqueness
if ($unique) return false else return true;
}
Remarque: la fonction doit renvoyer 'true' pour arrêter le processus de sauvegarde.
Si le champ personnalisé n'est pas unique, vous pouvez également souhaiter faire écho à un avertissement.
Que diriez-vous d'utiliser AJAX pour vérifier l'unicité avant même de soumettre l'article pour publication?
$( '#post' ).on( 'submit', function( event ) {
event.preventDefault(); // Prevent publishing
//Now do some AJAX Checks
$.post( ajaxurl, data, function(response) {
if ( response === 'success' ) {
$( this ).off( event ).submit();
} else {
alert( 'The custom field must be unique' );
}
});
});
Bien que le code ne soit pas testé, il devrait fonctionner. Vous devrez peut-être jouer avec pour obtenir le résultat souhaité.
J'accroche à wp_insert_post_data filter et je le traite aussi peu intrusif que possible car, si j'ai bien compris, vous ne souhaitez pas bloquer l'insertion d'un article, vous voulez simplement éviter de publier un article avec des méta-valeurs en double.
Je ne peux pas épargner trop dans ce cas car vous n'avez partagé aucun code, mais voici un pseudo-code d'un filtre qui fonctionnerait:
function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
// setup an uniqueness flag.
$meta_is_unique = true;
// check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
// {...} <- your code
// if the meta is NOT unique keep the post status in draft.
if ( ! $meta_is_unique ) {
// you can force the current post to be draft until the meta value will became unique.
$data['post_status'] = 'draft';
// maybe, update the meta value with a hint of the fact that it's not unique.
// or display a dashboard notice about it.
}
return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );
Un autre avantage important de ce filtre est qu’il est séparé des pièces jointes un wp_insert_attachment_data
.
J'espère que ça aide, et quoi que vous fassiez, ça a l'air génial!