it-swarm.com.de

Was ist der Unterschied zwischen den Hooks update_post_meta und update_postmeta?

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 wurden.

Ich bin mir durchaus bewusst, dass update_post_meta für alle Post-Typen funktioniert, während update_postmeta nur für Post-Typen funktioniert. Meine Frage ist jedoch nicht vom Post-Typ abhängig und deckt auch nicht nur den Teil update ab, da er für updated, delete gleich ist. , usw.

Nach der Überprüfung von wp-includes/meta.php habe ich die zuvor erwähnten Haken gefunden, um meine Sachen zu erledigen, aber dies warf eine Frage für mich auf.

Der Abschnitt im Kern lautet wie folgt: Zeile 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 );
    }
}

Es gibt also einen Haken für update_post_meta, update_comment_meta und update_user_meta. Direkt danach wird ein weiterer Hook aufgerufen - nur für die Tabelle posts 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_postmeta und update_{$meta_type}_meta

Als ich ein bisschen weiter blickte, fand ich vor drei Jahren auch eine andere Antwort von mir, in der dieses Thema ebenfalls zur Sprache kam, aber das war nicht der Hauptpunkt.

Vermisse ich hier etwas?

Ist diese Abwärtskompatibilität schließlich - und wurde gerade in meta.php in 2.9.0 verschoben? Oder gibt es einen wirklichen Grund, beides zu haben? Für mich könnten die Aktionen, die mit der Funktion update_post_meta() verknüpft sind, leicht die Daten maybe_unserialize(), wenn sie benötigt werden, sodass ich wirklich nicht den Sinn sehe, beides zu haben.

Freue mich auf eure Beiträge!

7
fischi

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

update_postmeta ist in /wp-admin/includes/post.php eingegangen.

Während...

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

Erst später wurde update_postmeta in /wp-includes/meta.php verschoben.

Ich glaube also, dass dies aus Gründen der Abwärtskompatibilität geschah, bei der der Hook update_postmeta immer den Wert maybe_serialize() erhielt und dies auch weiterhin tun sollte, obwohl er später in den Hook /wp-includes/meta.php verschoben wurde.

Darüber hinaus gibt der Hook update_postmeta, den Sie vielleicht bereits kennen, zum besseren Verständnis Daten aus dem superglobalen $_POST['meta'] und den Schlüssel zurück, der Daten aus dem Bedienfeld 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 im Zusammenhang mit der doppelten Serialisierung von Daten betraf, aber ich könnte mit etwas anderem verwechselt werden.

Interessanterweise serialisiert WordPress bereits serialisierte Daten vor dem Speichern erneut, wenn Sie sie im Textbereich der benutzerdefinierten Feldbenutzeroberfläche speichern. Dies unterstützt den Begriff der Abwärtskompatibilität in Bezug auf:

Hinweis: Diese Antwort ist nicht unbedingt vollständig .

4
userabuser

Wie in Wordpress Codex bemerkt, fügt add_post_meta neue Postmetas ein, die einem Beitrag zugeordnet sind. Wenn der angegebene Parameter "unique" den Wert "true" hat, wird nach vorhandenen Schlüsseln mit demselben Namen gesucht. Wenn es existiert, 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 benutzen? Kommt drauf an. 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

0
R. Simon