it-swarm.com.de

Rückgabe des benutzerdefinierten ACF-Felds von publish_post

Ich versuche, ein benutzerdefiniertes Feld zurückzugeben, sobald ein Beitrag veröffentlicht wird. Ich verwende die Aktion publish_post (oder {status}_{post_type}), aber es sieht so aus, als würden die benutzerdefinierten Felder nach dem Hook erstellt.

Mein Code in functions.php:

function create_recurring_posts( $ID, $post ) {
    logMe(print_r(get_post_custom($ID), true));
}
add_action( 'publish_profile', 'create_recurring_posts', 10, 2 );

Die Funktion logMe() protokolliert die Ausgabe lediglich zu Testzwecken in eine Datei. Mein Problem ist, dass beim Erstellen des Profilposts nur die benutzerdefinierten Felder _edit_last und _edit_lock zurückgegeben werden. Aber wenn ich die Seite danach betrachte, auf der die gleiche get_post_custom() -Funktion ausgeführt wird, sehe ich das andere benutzerdefinierte Feld, das ich benötige.

Ich verwende erweiterte benutzerdefinierte Felder für die Felderstellung. Jede Hilfe wird geschätzt.

1
v0wels

Ihre Aktion wird in wp_transition_post_status() ausgelöst, das von wp_insert_post() aufgerufen wird, bevor die Aktion save_post ausgelöst wird. save_post ist die typische Aktion zum Behandeln benutzerdefinierter Felder. ACF arbeitet auch daran.

Grundsätzlich müssen Sie warten, bis ACF mit seinen Inhalten fertig ist. Dies bedeutet, dass Sie sich mit save_post mit einer Priorität> 10 verbinden müssen oder besser wp_insert_post verwenden müssen, der direkt nach save_post ausgeführt wird.

Um den Post-Status-Übergang zu verfolgen, können Sie ein einfaches "Protokoll" wie das folgende verwenden:

<?php

namespace WPSE199070;

class PublishedTransitionLog {

    /**
     * @type array
     */
    private $status_log = [];

    /**
     * logs a published post id 
     * 
     * @wp-hook publish_profile
     *
     * @param int $post_id
     */
    public function published_post( $post_id ) {

        $blog_id = get_current_blog_id();
        if ( ! isset( $this->status_log[ $blog_id ] ) )
            $this->status_log[ $blog_id ] = [];

        if ( in_array( $post_id, $this->status_log[ $blog_id ] ) )
            return;

        $this->status_log[ $blog_id ][] = $post_id;
    }

    /**
     * @param int $post_id
     * @return bool
     */
    public function post_published( $post_id ) {

        $blog_id = get_current_blog_id();
        if ( ! isset( $this->status_log[ $blog_id ] ) )
            return FALSE;

        return in_array( $post_id, $this->status_log[ $blog_id ] );
    }
}

class PublishPostHandler {

    /**
     * @type PublishedTransitionLog
     */
    private $log;

    public function __construct( PublishedTransitionLog $log ) {

        $this->log = $log;
    }

    /**
     * @param int $post_id
     * @param \WP_Post $post 
     * @param bool $updated
     */
    public function update( $post_id, \WP_Post $post, $updated ) {

        if ( ! $this->log->post_published( $post_id ) )
            return;

        // do your stuff here
    }
}

$transition_log = new PublishedTransitionLog;
$handler        = new PublisPostHandler( $transition_log );

add_action( 'publish_profile', array( $transition_log, 'published_post' ) );
add_action( 'wp_insert_post', array( $handler, 'update', 10, 3 ) );

Lassen Sie mich das erklären. Die erste Klasse, PublishedTransitionLog, hört sich die Aktion publish_profile an und speichert intern jeden veröffentlichten Beitrag für jedes Blog. Es bietet auch eine Methode, um zu überprüfen, ob ein Beitrag bereits veröffentlicht wurde.

Die zweite Klasse sollte Ihre Logik bereitstellen und hängt von der ersten Klasse ab. Wenn der Beitrag nicht veröffentlicht wurde, tut er einfach nichts.

Auf diese Weise können Sie unabhängig voneinander hören, wie verschiedene Haken gezogen werden.

3
David

@ David erklärte, warum Ihr Code nicht funktioniert und skizzierte eine Lösung (verwenden Sie stattdessen save_post). Sie können jedoch Hooks "verketten", sodass Sie weiterhin die Übergangsfilter verwenden können, um die Ausführung zu steuern:

function create_recurring_posts( $ID, $post ) {
  add_action(
    'save_post',
    function() {
      // debug, since I don't have a `logMe()` function :)
      var_dump(print_r(get_post_custom($ID), true));
      die;
    },
    PHP_INT_MAX,
    1
  );   
}
add_action( 'publish_profile', 'create_recurring_posts', 10, 2 );
1
s_ha_dum