web-dev-qa-db-fra.com

L'action 'save_post' ne fonctionne pas pour l'édition rapide

J'ai lu d'autres réponses à des questions similaires mais aucune d'entre elles n'a résolu mon problème. Ce code fonctionne très bien dans Editor, mais sous Quick Edit ou Bulk Edit, il ne semble pas fonctionner du tout. Qu'est-ce que je fais mal?

// link author display name to Broker Name if Author is Broker

add_action( 'save_post', 'author_is_broker', 200 );

function author_is_broker($post_id) {
    // page/post options
    global $lwp_options, $Listing;

    $post_types = get_post_types();

    unset($post_types['listings']);

    $post_type = get_post_type();

    //Only for listings
    if(isset($post_type) && $post_type == "listings"){
        // Ignore for autosave
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )  {
            return $post_id;
        } else {

            // If this is a revision, get real post ID
            if ( $parent_id = wp_is_post_revision( $post_id ) ) 
                $post_id = $parent_id;

            // Get display name of post owner
            $broker_id = get_post_field( 'post_author', $post_id );
            $broker = get_the_author_meta('display_name', $broker_id);

            // Verify directory exists for author
            $args = array(
            'post_type'  => 'wpbdp_listing',
            'author'     => $broker_id
            );

            $wp_posts = get_posts($args);

            if (count($wp_posts)) {
                $is_broker = true;
            } else {
                return $post_id;
            }

            // If directory listing has been assigned, user is broker
            if (isset($is_broker) && $is_broker == true) {
                // add the term
                $term         = sanitize_text_field($broker);
                $Listing->add_listing_category_term('broker', $term);
                // update the post
                update_post_meta( (int) $post_id, 'broker', $term );
            }
            else {
                return $post_id;
            }
        }
    } else {
    return $post_id;
    } 
}
2
Shane

C'est juste une supposition, puisque je n'ai pas testé votre code, mais ... Il y a une partie qui a l'air assez floue pour moi:

Toutes vos actions ne sont exécutées que si cette condition est vraie:

if(isset($post_type) && $post_type == "listings"){

Et d'où vient cette variable $post_type?

$post_type = get_post_type();

Donc, vous ne transmettez aucun post_id à cet appel de fonction ... Cela signifie que vous travaillez avec l'objet global $ post. Mais rien ne garantit que de tels postes existent.

Il y a une raison pour laquelle save_post hook passe post_id en tant que paramètre - vous devriez l'utiliser dans votre fonction ...

Donc, changer la ligne ci-dessus pour:

$post_type = get_post_type($post_id);

devrait résoudre votre problème.

PS. Il ne sert à rien de faire ça:

$post_types = get_post_types();

unset($post_types['listings']);

Vous n'utilisez même pas cette variable dans votre code plus tard ...

PPS. save_post est une action, vous n’avez donc rien à y retourner.

1
Krzysiek Dróżdż