J’ai un type de publication personnalisé qui vérifie et valide certains champs méta (personnalisés) ajoutés lors de la publication. j’utilise wp_insert_post_data
aux fins:
public function __construct()
{
$this->sconfig= ['post_type'=> 'event', 'slug'=>'events'];
add_filter('wp_insert_post_data', array($this, 'validate_event_meta'), 99, 2);
add_filter('post_updated_messages', array($this, 'event_save_update_msg'), 10, 1);
//add_action('admin_notices', array($this, 'event_save_update_msg'));
}
function validate_event_meta($postData, $postArray)
{
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $postData;
}
if (array_key_exists('post_type', $postData) && $postData['post_type'] === $this->sconfig['post_type']) {
if (array_key_exists('post_status', $postData) && $postData['post_status'] === 'publish') {
$valstat = $this->get_meta_posted_vals();
/*
$valstat['stat'] is 0 or 1 depending on validation success
$valstat['log'] has the error message
*/
if ($valstat['stat'] == 0) {
$postData['post_status'] = 'draft';
set_transient(get_current_user_id() . '_event8273_add_notice', 'ERROR: ' . $valstat['log']);
add_filter('redirect_post_location', array($this, 'alter_event_save_redirect'), 99);
}
}
}
return $postData;
}
function alter_event_save_redirect($location)
{
remove_filter('redirect_post_location', __FUNCTION__, 99);
$location = remove_query_arg('message', $location);
$location = add_query_arg('message', 99, $location);
return $location;
}
function event_save_update_msg($messages)
{
$message = get_transient(get_current_user_id() . '_event8273_add_notice');
if ($message) {
delete_transient(get_current_user_id() . '_event8273_add_notice');
//echo $message;
//$messages['post'][99] = $message;
$messages[$this->sconfig['post_type']][99] = $message;
}
return $messages;
}
Bien que le système de validation fonctionne correctement, je ne peux afficher aucun avis sur l’erreur. Chaque fois que le code rencontre une méta-valeur invalide lors de la « publication », il rétablit le statut de la publication en « brouillon » et le « Brouillon enregistré ». Aperçu‘ message apparaît.
Après quelques recherches, j’ai découvert que l’éditeur de blocs utilise javascript pour afficher des avis personnalisés. Mais ce que je ne comprends pas, c’est comment appeler la fonction javascript (fichier déjà mis en file d’attente dans l’admin) après la validation de wp_insert_post_data
.
function event_save_alert(errmsg)
{
( function ( wp ) {
wp.data.dispatch( 'core/notices' ).createNotice(
'error', // Can be one of: success, info, warning, error.
errmsg, // Text string to display.
{
isDismissible: true, // Whether the user can dismiss the notice.
// Any actions the user can perform.
actions: [
{
url: '#',
label: 'View post',
},
],
}
);
} )( window.wp );
}
Tout type d’aide est apprécié. Merci d’avoir lu jusqu’ici et d’y avoir pensé.