it-swarm.com.de

Gibt es einen Aktionsfilter/Hook zum Überprüfen eines benutzerdefinierten Felds vor dem Veröffentlichen des Posts?

Ich habe eine benutzerdefinierte Datei namens xxxx_url. xxxx_url sollte eindeutig sein.

Bevor ich den Beitrag veröffentliche, möchte ich sicherstellen, dass xxxx_url eindeutig ist oder nicht? Wenn es nicht eindeutig ist, sollte das Veröffentlichen des Beitrags abgelehnt werden.

Ich habe versucht, publish_post. Aber das ist nicht der richtige, da er ausgelöst wird, wenn wir den Beitrag veröffentlichen. Ich möchte meinen Code kurz vor der Veröffentlichung ausführen.

Am Anfang von wp_insert_post , der Funktion zum Speichern/Aktualisieren eines Posts, befindet sich ein Filter mit dem Namen wp_insert_post_empty_content . Standardmäßig überprüft dieser Filter, ob die Felder Titel, Editor und Auszug leer sind. In diesem Fall wird der Speichervorgang abgebrochen.

Da jedoch alle zu speichernden Felder an diesen Filter übergeben werden, können Sie diesen Filter erweitern, um jeden anderen Test einzuschließen, um festzustellen, ob der Beitrag als leer betrachtet werden soll. Es wäre ungefähr so:

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

Hinweis: Die Funktion muss "true" zurückgeben, um den Speichervorgang anzuhalten.

Wenn das benutzerdefinierte Feld nicht eindeutig ist, können Sie auch eine Warnung ausgeben.

5
cjbj

Wie wäre es, wenn Sie AJAX verwenden, um die Eindeutigkeit zu überprüfen, bevor Sie den Beitrag überhaupt zur Veröffentlichung einreichen?

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

Der Code wird zwar nicht getestet, sollte aber funktionieren. Möglicherweise müssen Sie damit spielen, um das gewünschte Ergebnis zu erzielen.

1
Abhik

Ich würde mich in wp_insert_post_data filter einklinken und dies so unauffällig wie möglich behandeln, da ich verstehe, dass Sie das Einfügen eines Posts nicht blockieren möchten, sondern nur vermeiden möchten, einen Post mit doppelten Metawerten zu veröffentlichen.

In diesem Fall kann ich nicht zu viel sparen, da Sie keinen Code freigegeben haben. Hier ist jedoch ein Pseudocode eines Filters, der funktionieren würde:

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

Ein weiteres großartiges Merkmal dieses Filters ist, dass er von den Anhängen durch einen wp_insert_attachment_data getrennt ist.

Ich hoffe es hilft und was auch immer du tust, es klingt großartig!

0
Andrei