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


11

Ich habe eine benutzerdefinierte Datei namens xxxx_url. xxxx_urlsollte einzigartig sein.

Bevor ich den Beitrag veröffentliche, möchte ich sicherstellen, dass er xxxx_urleindeutig ist oder nicht. Wenn es nicht eindeutig ist, sollte die Veröffentlichung des Beitrags abgelehnt werden.

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


1
Warum nicht die aktuelle Post-ID als eindeutigen Wert festlegen? Wie: 132_urlWo 132ist die Post-ID. Dann haben Sie hier immer einen einzigartigen Wert. Außerdem: Benutzerdefinierte Felder sollten in der save_postAktion gespeichert werden . In dieser Aktion können Sie das benutzerdefinierte Feld überprüfen (wenn es nicht leer ist und beispielsweise einen eindeutigen Wert hat) und basierend darauf update_post_metaoder nicht. Ich denke, Sie können auch das benutzerdefinierte Feld überprüfen und, wenn es keinen eindeutigen Wert hat, den Wert post-statusauf draftoder etwas anderes setzen, um die Veröffentlichung zu deaktivieren. Ansonsten brauche ich dazu jQuery.
LWS-Mo

Antworten:


5

Zu Beginn wp_insert_postder Funktion, die einen Beitrag speichert / aktualisiert, wird ein Filter aufgerufen wp_insert_post_empty_content. Standardmäßig prüft dieser Filter, ob die Felder Titel, Editor und Auszug leer sind. In diesem Fall wird der Speichervorgang angehalten.

Da jedoch alle zu speichernden Felder an diesen Filter übergeben werden, können Sie diesen Filter um jeden anderen Test erweitern, 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, möchten Sie möglicherweise auch eine Warnung wiederholen.


2
Dies wird wahrscheinlich funktionieren, sieht aber eher nach einem Hack aus als nach einer Lösung. Ich habe dies ebenfalls in Betracht gezogen, aber später beschlossen, nicht zu posten, da dies wp_insert_post_empty_contentsemantisch für leere Inhalte gedacht ist . Trotzdem habe ich auch keinen semantisch richtigen Haken dafür gefunden.
Scott

Wenn es nur leere Titel und Inhalte gäbe, gäbe es keinen Filter für Entwickler.
cjbj

1
Wenn Sie sich weniger auf das bloße Wort "leer" konzentrieren, würde ich sagen, dass dieser Filter prüfen soll, ob der Beitrag die Mindestanforderungen zum Speichern erfüllt. OP will die Mindestanforderungen erweitern. Vielleicht sollte der Filter benannt werden, wp_insert_post_valid_contentum dies auszudrücken, aber im Übrigen ist er genau an der richtigen Stelle.
cjbj

@cjbj Wenn Sie eine Frage wie diese haben, wie finden Sie den richtigen Filter? Ich meine, wie haben Sie wp_insert_post_empty_contentFilter gefunden?
Ich bin die dümmste Person

1
Wenn Sie einige Zeit mit WP gearbeitet haben, wissen Sie, welcher Teil des Codes welche Teile des Administrators generiert. Sie suchen also in der Datei nach dem Quellcode und suchen nach verfügbaren Filtern.
cjbj

1

Wie wäre es mit AJAX, um die Eindeutigkeit zu überprüfen, bevor Sie den Beitrag 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.


0

Ich würde mich in den Filter wp_insert_post_data einbinden und dies so aufdringlich wie möglich behandeln, da Sie meines Wissens das Einfügen eines Posts nicht blockieren möchten, sondern nur vermeiden möchten, einen Post mit doppelten Metawerten zu veröffentlichen.

Ich kann in diesem Fall nicht zu viel sparen, weil Sie keinen Code freigegeben haben, aber hier ist 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' );

Eine weitere großartige Sache an diesem Filter ist, dass er von den Anhängen getrennt ist wp_insert_attachment_data.

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


2
Das ist vielleicht keine gute Idee. Was ist, wenn es $data['post_status']ist publishund der Benutzer es aktualisiert? Würde das draftErstellen des Beitrags nicht zu einem 404Problem für diesen Beitrag führen?
Scott

@Scott Mit anderen Worten, wenn ein veröffentlichter Beitrag beim Speichern feststellt, dass sein Metawert nicht eindeutig ist, sollte die Veröffentlichung des Beitrags abgelehnt und der Beitrag verfasst werden. Auch hier weiß ich nicht, wie wichtig dieser Metawert ist, aber wenn es sich um einen Sortierdatentyp oder etwas Wesentliches handelt, sollte der Post-Status ein Entwurf sein (was kein 404-Problem bedeutet, sondern nur besagt, dass der Post war aus der Öffentlichkeit zurückgezogen)
Andrei

-1

Der Scheck sollte gehen wp_insert_post. Dieser Hook wird ausgelöst, wenn ein Beitrag veröffentlicht oder bearbeitet wird.

Dort können Sie eine benutzerdefinierte Abfrage durchführen, um zu überprüfen, ob ein Beitrag bereits denselben xxxx_urlWert hat oder nicht.

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
Wie ich weiß, wird alles, was Sie in den if / else-Anweisungsbeitrag schreiben, veröffentlicht, da die wp_insert_postAktion ausgelöst wird, sobald ein Beitrag gespeichert wurde. Sie kann das Veröffentlichen oder Einfügen von Beiträgen nicht blockieren.
Ich bin die dümmste Person

Sie möchten also die Veröffentlichung blockieren, wenn die Validierung des Beitrags fehlschlägt? Das hast du in deiner Frage nicht geschrieben.
Petr Cibulka

Ich habe das If it isn't unique it should reject publishing post.in meiner Frage klar erwähnt .
Ich bin die dümmste Person
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.