it-swarm.com.de

Gibt es einen Haken/eine Aktion, die beim Hinzufügen oder Entfernen eines Post-Thumbnails ausgelöst wird?

Ich versuche, ein benutzerdefiniertes Feld zu aktualisieren, nachdem ein Beitrags-Miniaturbild (Featured Image) einem Beitrag hinzugefügt oder daraus entfernt wurde. Damit soll verfolgt werden, ob ein ausgewähltes Bild hinzugefügt oder entfernt wurde, um einen synchronisierten Export nur der aktualisierten "unsauberen" Posts zur Verwendung in einem externen Dienst durchzuführen.

Ich habe im gesamten Codex nach einem Hook gesucht, der ausgelöst wird, nachdem ein post_thumbnail gesetzt wurde, aber ich konnte nichts finden. Die Lösung, die ich mir erhofft hatte, war die Verwendung der schlank dokumentierten Aktion "updated_post_meta" (nicht zu verwechseln mit "update_post_meta"!) Unter Verwendung des folgenden Codes:

add_action('updated_post_meta', 'check_dirty_fields_updated_post_meta', 10, 4);
function check_dirty_fields_updated_post_meta($meta_id, $post_id, $meta_key, $meta_value) {
    if ('_thumbnail_id' == $meta_key) {
        update_post_meta($post_id, 'thumbnails_dirty', 1);
    }

    if ('schedule' == $meta_key) {
        update_post_meta($post_id, 'schedule_dirty', 1);
    }
}

Daher sollte 'updated_post_meta' immer dann ausgelöst werden, wenn post_meta aktualisiert wird. Leider wird '_thumbnail_id' nie ausgelöst, sodass das benutzerdefinierte Feld 'thumbnails_dirty', das ich später festlegen möchte, nicht aktualisiert wird.

Aus diesem Code geht hervor, dass ich auch überprüfe, ob ein meta_key von 'schedule' jemals aktualisiert wurde, und dann ein anderes benutzerdefiniertes Feld namens 'schedule_dirty' markiere (der post_meta-Wert 'schedule' ist ein benutzerdefiniertes Feld, das innerhalb von festgelegt wird Die Standard-Post-Benutzeroberfläche) Bei diesem benutzerdefinierten Standardfeld wird es bei der Aktion 'updated_post_meta' angezeigt, wenn es aktualisiert wird, und 'schedule_dirty' wird wie beabsichtigt festgelegt.

Das Problem, das ich habe, ist, dass ich nicht sehen kann, warum die '_thumbnail_id' post_meta die Aktion 'updated_post_meta' nicht auslöst.

Das Problem weiter verschärfen Ich kann keine eindeutige Dokumentation darüber finden, wann das Post-Thumbnail gesetzt und anschließend das zugehörige Post-Meta-Feld '_thumbnail_id' aktualisiert wird. Ich stelle fest, dass beim Festlegen des Vorgestellten Bildes für einen Beitrag dieses sofort festgelegt wird und daher nicht von der Aktion 'save_post' abhängig zu sein scheint. Obwohl ich verschiedene Aspekte zum Speichern von Beiträgen durchgesehen habe, denke ich, dass die Antwort an anderer Stelle liegt .

Ein paar weitere Informationen, die für Sie relevant sein könnten:

  • Bei den hier fraglichen Posts handelt es sich um benutzerdefinierte Posts

  • Ich verwende auch das Plugin für mehrere Post-Thumbnails und möchte anschließend auch den aktualisierten Status dieser zusätzlichen Post-Thumbnails überprüfen.

3
Rick Curran

Ich denke, Sie möchten den Hook added_post_meta anstelle von updated_post_meta verwenden, da Sie das Meta hier nicht aktualisieren, sondern nur hinzufügen. Zumindest im Fall von _thumbnail_id, wo wir es löschen müssen, bevor wir es erneut hinzufügen (kein Update) über die Admin-Benutzeroberfläche.

Wenn wir dies weiter untersuchen, sehen wir, dass dieser Teil der Funktion update_metadata():

if ( empty( $meta_ids ) ) {
    return add_metadata($meta_type, $object_id, $meta_key, $passed_value);
}

verursacht das Problem, weil es add_metadata() aufruft und es zurückgibt, bevor die Hooks update_{$meta_type}_meta und updated_{$meta_type}_meta ausgelöst werden.

Sie müssen sich daher in die Funktion add_metadata() einhängen, anstatt in die Funktion update_metadata(), z. der add_{$meta_type}_meta ( vor ) oder added_{$meta_type}_meta ( nach ) hakt.

Wenn wir die Funktion wp_ajax_set_post_thumbnail() auschecken, die beim Hinzufügen/Entfernen des vorgestellten Bilds von der Benutzeroberfläche des Administrators angefordert wird, werden die Funktionen set_post_thumbnail() und delete_post_thumbnail() verwendet.

Letzteres ist ein Wrapper für delete_metadata(), der die Hooks delete_{$meta_type}_meta ( before ) und deleted_{$meta_type}_meta ( after ) auslöst.

4
birgire

Dies ist ein funktionierendes Beispiel für das Hinzufügen/Entfernen von Ereignissen für eine Post-Miniaturansicht. Es enthält auch den Metaschlüssel, der für die vom MultiPostThumbnail erstellte sekundäre Miniaturansicht erforderlich ist. Die Hilfe für diese Lösung kam aus hier und den MultiPostThumbnail-Dokumenten. birgire gibt eine gute erklärung zu diesen haken in der akzeptierten antwort.

// Initialize the MultiPostThumbnails based on https://github.com/voceconnect/multi-post-thumbnails/wiki

if (class_exists('MultiPostThumbnails')) {
    new MultiPostThumbnails(
        array(
            'label' => 'Secondary Image',
            'id' => 'secondary-image',
            'post_type' => 'post'
        )
    );
}

// Listen for Updates

add_action( 'added_post_meta', '___after_post_meta', 10, 4 );
add_action( 'updated_post_meta', '___after_post_meta', 10, 4 );

function ___after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
  if( $meta_key === '_thumbnail_id' ){

    // Primary Thumbnail Added
    update_post_meta($post_id, 'thumbnails_dirty', 1);

  } else if ( $meta_key === 'post_secondary-image_thumbnail_id' ) {

    // Secondary Thumbnail Added
    update_post_meta($post_id, 'thumbnails_dirty', 1);
  } 
}

add_action( 'deleted_post_meta', '___deleted_post_meta', 10, 4 );

function ___deleted_post_meta ( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
  if( $meta_key === '_thumbnail_id'){

    // Primary Thumbnail Deleted
    update_post_meta($post_id, 'thumbnails_dirty', 1);

  } else if ( $meta_key === 'post_secondary-image_thumbnail_id' ) {

    // Secondary Thumbnail Deleted
    update_post_meta($post_id, 'thumbnails_dirty', 1);
  } 
}
1
jgraup