Existe-t-il un filtre / crochet d'action permettant de valider un champ personnalisé avant la publication du message?

10

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

    
posée I am the Most Stupid Person 31.08.2018 - 08:26

4 réponses

5

Au début de wp_insert_post , la fonction qui enregistre / met à jour un message, il existe un filtre appelé wp_insert_post_empty_content . Par défaut, ce filtre vérifie si les champs de titre, d'éditeur et d'extrait sont tous vides. Dans ce cas, le processus de sauvegarde sera interrompu.

Cependant, é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.

    
réponse donnée cjbj 09.09.2018 - 13:19
1

Pourquoi ne pas utiliser AJAX pour vérifier le caractère unique avant même de soumettre le message à la 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é.

    
réponse donnée Abhik 09.09.2018 - 20:06
0

J'accrochais au wp_insert_post_data le filtre et le traitait de la manière la moins intrusive possible car, si j'ai bien compris, vous ne le faites pas. ne voulez pas bloquer l’insertion d’une publication, vous voulez simplement éviter de publier une publication 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 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!

    
réponse donnée Andrei 03.09.2018 - 16:29
-1

La vérification devrait aller à wp_insert_post . Ce hook est activé chaque fois que le message est publié ou modifié.

Là, vous pouvez faire une requête personnalisée pour vérifier si une publication a déjà la même valeur xxxx_url ou non.

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check 'post' post type only. Or use 'any'.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});
    
réponse donnée Petr Cibulka 03.09.2018 - 13:26

Lire d'autres questions sur les étiquettes