Wie kann ich update_post_meta und delete_post_meta einbinden?

29

Ich habe immer noch Mühe, mich auf die Sache einzulassen, und bin wirklich fest entschlossen, die folgende Aufgabe zu erledigen:

Wenn update_post_metaausgelöst wird, prüfen Sie, ob der meta_keyWert gleich ist (ich möchte einen Code auslösen, wenn ein bestimmter meta_key verwendet wird). Wenn der gesuchte Metaschlüssel vorhanden ist, führen Sie einen Code aus, $post->IDder den aktualisierten Metaschlüssel kennt .

Ich muss mich auch in delete_post_metadiese Art der umgekehrten Vorgehensweise wie oben einklinken.

Kann mir jemand einen Beispielcode zum Einhängen in update_post_metaund geben delete_post_meta?

Brady
quelle

Antworten:

45

Die update_post_metaHooks werden von der allgemeineren update_metadata()Funktion aufgerufen , sodass Sie sie möglicherweise nicht direkt gefunden haben. Die drei Haken sind:

  • update_post_metadata, ein Filter, mit dem Sie das Metadaten-Update "hijacken" und etwas anderes tun können. Wenn Sie eine Funktion einbinden, die einen Booleschen Wert zurückgibt, wird die Ausführung dort angehalten und der Boolesche Wert zurückgegeben.
  • update_post_metaEine Aktion, die aufgerufen wird, bevor die Daten in der Datenbank aktualisiert werden.
  • updated_post_metaEine Aktion, die aufgerufen wird, nachdem die Daten in der Datenbank aktualisiert wurden.

Wenn die Meta - Taste nicht noch in der Datenbank vorhanden ist , update_metadata()wird die Steuerung an add_metadata(), die die ähnlichen Haken hat add_post_metadata, add_post_metaund added_post_meta. Dies geschieht, bevor es update[d]_post_metaaufgerufen wird. Wenn Sie also etwas tun möchten, wenn der Metaschlüssel hinzugefügt oder aktualisiert wird, müssen Sie sowohl den update*als auch den Hook add*einbinden. Beachten Sie jedoch, dass die updated_*und added_*-Aktionen ähnliche Parameter übergeben update_*und add_*nicht ( add_post_metaübergibt zuerst keine Meta-ID). .

delete_metadata()hat ähnlichen Haken: delete_post_metadata, delete_post_metaund deleted_post_meta.

Beispielcode:

add_action( 'added_post_meta', 'wpse16835_after_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'wpse16835_after_post_meta', 10, 4 );
function wpse16835_after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_do_something( $post_id, $meta_value );
    }
}

add_action( 'deleted_post_meta', 'wpse16835_deleted_post_meta', 10, 4 );
function wpse16835_deleted_post_meta( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_undo_something( $post_id );
    }
}
Jan Fabry
quelle
super danke dafür. Ich war mir bewusst zu update_post_metaverwenden update_metadataund dort gibt es Haken added_post_metaund , updated_post_metaaber das ist so weit wie ich bekommen konnte. Ich habe nicht verstanden, wie man es benutzt. Aber jetzt denke ich, dass ich es habe :)
Brady
3
Genauer gesagt, der Haken istupdated_{$post_type}_meta
Benjamin Intal
8

Die Antwort von Jan deckt so ziemlich alles oben ab, mit Ausnahme des Falls, dass benutzerdefinierte Metadaten von der Seite "Beitrag bearbeiten" gelöscht werden. Dies geschieht asynchron, sobald Sie über einen Aufruf von wp-admin / admin-ajax.php unter den Metadaten auf die Schaltfläche "Löschen" klicken. Leider umgehen diese Aufrufe die delete_metadata()Funktion in meta.php und delete_meta()rufen stattdessen wp-admin / includes / post.php auf (nicht zu verwechseln mit wp-includes / post.php).

Es gibt jedoch zwei Aktionen, die delete_postmeta(vor dem Löschen) und deleted_postmeta(nach dem Löschen) noch verwendet werden können. Beide akzeptieren einen einzelnen Parameter $mid, nämlich die ID der Metadaten ( nicht den Schlüssel). Sie können das Metadatenobjekt wie folgt abrufen:

$meta = get_post_meta_by_id($mid);  

Das gibt ein Objekt mit meta_id, post_id, meta_key und meta_value zurück. Natürlich werden deleted_postmetadie Metadaten zum Zeitpunkt des Aufrufs gelöscht, sodass get_post_meta_by_id()sie nicht mehr funktionieren (was diese Aktion irgendwie unbrauchbar macht).

Gleiches gilt für die Aktualisierung benutzerdefinierter Metadaten über die Seite "Beitrag bearbeiten". Die update_metadata()Funktion (und ihre Aktionen) in meta.php wird nicht aufgerufen, sondern die update_meta()Funktion in wp-admin / includes / post.php. Hier nochmal zwei Aktionen, update_postmetaund updated_postmeta. Die Argumente sind $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
quelle