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

11

J'ai un dossier personnalisé appelé xxxx_url. xxxx_urldevrait être unique.

Donc, avant de publier le message, je veux m'assurer qu'il xxxx_urlest unique ou non? S'il n'est pas unique, la publication de l'article doit être refusée.

J'ai essayé publish_post. Mais ce n'est pas le bon, car il se déclenche lorsque nous publions le message. Je veux exécuter mon code juste avant la publication.

Je suis la personne la plus stupide
la source
1
Pourquoi ne pas définir l'ID de publication actuel comme valeur unique. Comme: 132_url132est l'ID du message. Que vous avez toujours ici une valeur unique. En plus de cela: les champs personnalisés doivent être enregistrés dans l' save_postaction. Dans cette action, vous pouvez vérifier le champ personnalisé (s'il n'est pas vide et a une valeur unique par exemple), et basé sur cela update_post_metaou non. Je suppose que vous pouvez également vérifier le champ personnalisé et s'il n'a pas de valeur unique, définissez le post-statussur draftou autre chose pour désactiver la publication. Sinon, je pense que vous avez besoin de jQuery pour ce faire.
LWS-Mo

Réponses:

5

Au début de wp_insert_post, la fonction qui sauvegarde / met à jour une publication, il y a 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, auquel cas le processus d'enregistrement 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 ceci:

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 retourner 'true' pour arrêter le processus d'enregistrement.

Si le champ personnalisé n'est pas unique, vous pouvez également faire écho à un avertissement.

cjbj
la source
2
Cela fonctionnera probablement, mais ressemble un peu plus à un hack qu'à une solution. J'ai également pensé à cela, mais j'ai décidé plus tard de ne pas publier car il wp_insert_post_empty_contentest sémantiquement destiné au contenu vide . Cela dit, je n'ai pas non plus trouvé de crochet sémantiquement approprié.
Scott
Eh bien, si ce n'était que pour le titre et le contenu vides, il n'y aurait pas de filtre pour les développeurs.
cjbj
1
Si vous vous concentrez moins sur le simple mot «vide», je dirais que ce filtre est destiné à vérifier si la publication répond aux exigences minimales pour l'enregistrement. OP souhaite élargir les exigences minimales. Peut-être que le filtre devrait être nommé wp_insert_post_valid_contentpour exprimer cela, mais pour le reste, il est exactement au bon endroit.
cjbj
@cjbj Lorsque vous avez une question comme celle-ci, comment trouvez-vous le bon filtre? Je veux dire, comment avez-vous trouvé le wp_insert_post_empty_contentfiltre?
Je suis la personne la plus stupide du
1
Eh bien, lorsque vous travaillez avec WP depuis un certain temps, vous savez en quelque sorte quelle partie du code génère quelles parties de l'administrateur. Vous recherchez donc le fichier et vérifiez le code source pour les filtres disponibles.
cjbj
1

Que diriez-vous d'utiliser AJAX pour vérifier l'unicité avant même de soumettre le message 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é.

Abhik
la source
0

Je me connecterais au filtre wp_insert_post_data et gérerais cela de la manière la moins intrusive possible, car si je comprends bien, vous 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 en é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' );

Une autre grande chose à propos de ce filtre est qu'il est séparé de celui des pièces jointes wp_insert_attachment_data.

J'espère que ça aide, et quoi que vous fassiez, ça a l'air génial!

Andrei
la source
2
Ce n'est peut-être pas une bonne idée. Que faire si $data['post_status']est publishet l' utilisateur est sa mise à jour? Est-ce que la création du message ne draftcréerait pas de 404problème pour ce message?
Scott
@Scott En d'autres termes, si une publication publiée détecte lors de l'enregistrement que sa méta-valeur n'est pas unique, la publication de publication doit être rejetée et la publication doit être rédigée. Encore une fois, je ne sais pas à quel point cette méta-valeur est importante, mais s'il s'agit d'un type de données de tri ou de quelque chose d'essentiel, le statut du message doit être brouillon (ce qui ne signifie pas un problème 404, il dit simplement que le message a été retiré du public)
Andrei
-1

Le chèque doit être envoyé à wp_insert_post. Ce crochet est déclenché chaque fois que le post est publié ou modifié.

Là, vous pouvez faire une requête personnalisée pour vérifier si un article a déjà la même xxxx_urlvaleur 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
    }
});
Petr Cibulka
la source
3
Comme je le sais, quoi que vous écriviez à l'intérieur si le post de la déclaration / else sera publié puisque l' wp_insert_postaction se déclenche une fois le post enregistré, il ne peut pas bloquer la publication ou l'insertion du post.
Je suis la personne la plus stupide du
Vous souhaitez donc bloquer la publication, si la publication échoue à la validation? Vous n'avez pas écrit cela dans votre question.
Petr Cibulka
Je l'ai clairement mentionné If it isn't unique it should reject publishing post.dans ma question.
Je suis la personne la plus stupide du