Esiste un filtro / hook di azione per convalidare un campo personalizzato prima di pubblicare il post?


11

Ho un file personalizzato chiamato xxxx_url. xxxx_urldovrebbe essere unico.

Quindi, prima di pubblicare il post, voglio assicurarmi che xxxx_urlsia unico o no? Se non è univoco, la pubblicazione del post deve essere rifiutata.

Ci ho provato publish_post. Ma non è quello corretto, poiché si attiva quando pubblichiamo il post. Voglio eseguire il mio codice poco prima della pubblicazione.


1
Perché non impostare l'ID post corrente come valore univoco. Come: 132_urldove si 132trova l'ID del post. Di qui hai sempre un valore unico. Inoltre, i campi personalizzati devono essere salvati save_postnell'azione. In questa azione è possibile controllare il campo personalizzato (se non è vuoto e ha un valore univoco, ad esempio), e in base a questo update_post_metaoppure no. Suppongo che potresti anche controllare il campo personalizzato e, se non ha un valore univoco, impostare post-statussu drafto qualcos'altro, per disabilitare la pubblicazione. Altrimenti penso che tu abbia bisogno di jQuery per farlo.
LWS-Mo

Risposte:


5

All'inizio di wp_insert_post, la funzione che salva / aggiorna un post, c'è un filtro chiamato wp_insert_post_empty_content. Per impostazione predefinita, questo filtro controlla se i campi del titolo, dell'editor e dell'estratto sono tutti vuoti, nel qual caso il processo di salvataggio verrà interrotto.

Tuttavia, poiché tutti i campi da salvare vengono passati a questo filtro, è possibile espandere questo filtro per includere qualsiasi altro test per determinare se il post deve essere considerato vuoto. Sarebbe qualcosa del genere:

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;
  }

Nota: la funzione deve restituire 'true' per interrompere il processo di salvataggio.

Se il campo personalizzato non è univoco, è possibile che si desideri ripetere anche un avviso.


2
Probabilmente funzionerà, ma sembra un po 'più simile a un hack che a essere una soluzione. Ho considerato anche questo, ma in seguito ho deciso di non pubblicare come wp_insert_post_empty_contentsemanticamente significa contenuto vuoto . Detto questo, non ho trovato nessun gancio che sia semanticamente giusto per questo.
Scott,

Bene, se fosse solo per titoli e contenuti vuoti non ci sarebbe un filtro per gli sviluppatori.
cjbj,

1
Se ti concentri meno sulla semplice parola "vuoto", direi che questo filtro ha lo scopo di verificare se il post soddisfa i requisiti minimi per il salvataggio. OP vuole ampliare i requisiti minimi. Forse il filtro dovrebbe essere chiamato wp_insert_post_valid_contentper esprimerlo, ma per il resto è esattamente nel posto giusto.
cjbj,

@cjbj Quando hai una domanda come questa, come trovi il filtro corretto? Voglio dire, come hai trovato il wp_insert_post_empty_contentfiltro?
Sono la persona più stupida,

1
Bene, quando lavori con WP da un po 'di tempo, sai che parte del codice genera quali parti dell'amministratore. Quindi cerca il file e controlla il codice sorgente per i filtri disponibili.
cjbj,

1

Che ne dici di usare AJAX per verificare l'unicità prima ancora di inviare il post per la pubblicazione?

$( '#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' );
    }
  });
});  

Sebbene il codice non sia testato, ma dovrebbe funzionare. Potrebbe essere necessario giocarci per ottenere il risultato desiderato.


0

Vorrei agganciarmi al filtro wp_insert_post_data e gestirlo il meno intrusivo possibile perché, come ho capito, non vuoi bloccare l'inserimento di un post, vuoi solo evitare di pubblicare un post con meta valori duplicati.

Non posso risparmiare troppo in questo caso perché non hai condiviso alcun codice ma ecco alcuni pseudo-codici di un filtro che funzionerebbe:

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'altra cosa grandiosa di questo filtro è che è separato da quello degli allegati wp_insert_attachment_data.

Spero che sia d'aiuto, e qualunque cosa tu faccia, sembra fantastico!


2
Potrebbe non essere una buona idea. Cosa succede se lo $data['post_status']è publishe l'utente lo sta aggiornando? Fare il post non draftcreerebbe un 404problema per quel post?
Scott,

In altre parole, se un post pubblicato rileva al momento del salvataggio che il suo meta-valore non è univoco, la pubblicazione del post deve essere respinta e il post deve essere redatto. Ancora una volta, non so quanto sia importante quel meta-valore, ma se si tratta di un tipo di dati di ordinamento o di qualcosa di essenziale, lo stato del post dovrebbe essere bozza (il che non significa un problema 404, dice solo che il post è stato ritirato dal pubblico)
Andrei,

-1

Il controllo dovrebbe andare a wp_insert_post. Questo hook viene attivato ogni volta che il post viene pubblicato o modificato.

Lì, puoi fare una query personalizzata per verificare se ci sono post che hanno già lo stesso xxxx_urlvalore o meno.

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
    }
});

3
Come so, qualunque cosa tu scriva all'interno se il post dell'istruzione / else verrà pubblicato poiché l' wp_insert_postazione si attiva una volta che un post è stato salvato, non può bloccare la pubblicazione o l'inserimento del post.
Sono la persona più stupida dal

Quindi vuoi bloccare la pubblicazione, se il post fallisce la convalida? Non hai scritto questo nella tua domanda.
Petr Cibulka,

L'ho menzionato chiaramente If it isn't unique it should reject publishing post.nella mia domanda.
Sono la persona più stupida il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.