Was ist der Unterschied zwischen den Hooks update_post_meta und update_postmeta?

7

Ich arbeite an einem erweiterten Revisionssystem, um eine Protokolldatei für alle Änderungen zu erstellen, die von Benutzern und / oder Algorithmen in Bezug auf Metadaten vorgenommen wurden, die an bestimmte Beitragstypen angehängt sind.

Während ich bin vollkommen bewusst , dass update_post_metaWerke für alle Post - Typen, während update_postmetanur auf Post arbeitet, meine Frage nach der Post - Typ abhängig ist, und es ist auch nicht nur die Abdeckung updateTeil, wie es das gleiche für ist updated, deleteusw.

Nach der Inspektion wp-includes/meta.phpfand ich die zuvor erwähnten Haken, um meine Sachen zu erledigen, aber dies warf Fragen für mich auf.

Der Abschnitt im Kern ist diese einzeilige 215 in Version 4.4.2:

foreach ( $meta_ids as $meta_id ) {
    /**
     * Fires immediately before updating metadata of a specific type.
     *
     * The dynamic portion of the hook, `$meta_type`, refers to the meta
     * object type (comment, post, or user).
     *
     * @since 2.9.0
     *
     * @param int    $meta_id    ID of the metadata entry to update.
     * @param int    $object_id  Object ID.
     * @param string $meta_key   Meta key.
     * @param mixed  $meta_value Meta value.
     */
    do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
}

if ( 'post' == $meta_type ) {
    foreach ( $meta_ids as $meta_id ) {
        /**
         * Fires immediately before updating a post's metadata.
         *
         * @since 2.9.0
         *
         * @param int    $meta_id    ID of metadata entry to update.
         * @param int    $object_id  Object ID.
         * @param string $meta_key   Meta key.
         * @param mixed  $meta_value Meta value.
         */
        do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );
    }
}

So gibt es einen Haken für update_post_meta, update_comment_metaund update_user_meta. Unmittelbar danach wird ein weiterer Hook aufgerufen - nur für die Posts-Tabelle mit dem Namen update_postmeta, die fast genauso funktioniert, mit dem einzigen Unterschied, dass die maybe_serialize()Daten des meta_value übergeben werden.

Zeile 204:

$_meta_value = $meta_value;
$meta_value = maybe_serialize( $meta_value );

Zuerst dachte ich, dass der zweite Hook aus Gründen der Abwärtskompatibilität vorhanden ist, aber beide wurden in 2.9.0 eingeführt. update_postmetaundupdate_{$meta_type}_meta

Als ich ein bisschen weiter schaute, fand ich vor drei Jahren auch eine andere Antwort von mir, in der dieses Thema ebenfalls auftauchte, aber dies war nicht der Hauptpunkt.

Vermisse ich hier etwas?

Ist das doch Abwärtskompatibilität - und wurde gerade auf meta.php2.9.0 umgestellt? Oder gibt es einen wirklichen Grund, beides zu haben? Für mich update_post_meta()könnten maybe_unserialize()die mit der Funktion verknüpften Aktionen bei Bedarf leicht die Daten enthalten, sodass ich wirklich nicht den Sinn sehe, beides zu haben.

Ich freue mich auf Ihre Eingabe!

fischi
quelle

Antworten:

4

Sie wurden beide in Version 2.9 eingeführt, jedoch in verschiedenen Dateien.

update_postmeta ging in /wp-admin/includes/post.php

Während...

update_{$meta_type}_meta ging in /wp-includes/meta.php

Es wurde erst später update_postmetain verschoben /wp-includes/meta.php.

Ich glaube, es war aus Gründen der Abwärtskompatibilität, bei der der update_postmetaHook maybe_serialize(), obwohl er immer den Wert von dann erhielt, dies auch weiterhin tun sollte, obwohl er später verschoben wurde /wp-includes/meta.php.

Darüber hinaus gibt der update_postmetaHook Daten aus dem $_POST['meta']Superglobal und den Schlüssel zurück, der Daten aus dem Bedienfeld für benutzerdefinierte Felder enthält .

Könnte dies nur eine schlechte Designentscheidung gewesen sein? Schaut so aus.

Ich dachte, ich erinnere mich an einen anderen Grund, der genau diese Frage in Bezug auf die doppelte Serialisierung von Daten umgibt, aber ich könnte mit etwas anderem verwechselt werden.

Interessanterweise serialisiert WordPress bereits serialisierte Daten vor dem Speichern erneut, wenn Sie bereits serialisierte Daten im Textbereich der Benutzeroberfläche für benutzerdefinierte Felder speichern. Dies unterstützt den Gedanken der Abwärtskompatibilität in Bezug auf:

Hinweis: Diese Antwort ist nicht unbedingt vollständig .

Adam
quelle
0

Wie im Wordpress-Codex bemerkt, fügt add_post_meta neues Postmeta ein, das einem Beitrag zugeordnet ist. Wenn der Parameter "unique" als true angegeben wird, wird nach einem vorhandenen Schlüssel mit demselben Namen gesucht. Wenn vorhanden, umgehen Sie es, wenn nicht, erstellen Sie einen Wert und weisen Sie ihn zu

update_post_meta aktualisiert Metadaten und erstellt neue Schlüssel- und Wertepaare, sofern meta_key nicht vorhanden ist.

Was ist am besten zu verwenden? Es hängt davon ab, ob. update_post_meta passt in die meisten Situationen, aber manchmal erledigt add_post_meta die Arbeit, wenn Sie Metadaten in eingeschränkten Umgebungen hinzufügen müssen (z. B. Shared Hosting).

Weitere Informationen finden Sie unter: https://codex.wordpress.org/Function_Reference/update_post_meta und https://codex.wordpress.org/Function_Reference/add_post_meta

R. Simon
quelle