web-dev-qa-db-ja.com

アクション 'save_post'がクイック編集で機能しない

私は同様の質問に対する他の答えを読んだことがありますが、それらのどれも私の問題を解決しませんでした。このコードはエディタではうまく機能しますが、クイック編集や一括編集ではまったく作動しません。何がおかしいのですか?

// 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

私はあなたのコードをテストしていないので、それは推測にすぎません、しかし... ...私にはかなりスケッチに見える部分があります:

すべてのアクションは、この条件が満たされている場合にのみ実行されます。

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

そして$post_type変数はどこから来たのでしょうか?

$post_type = get_post_type();

そのため、その関数呼び出しにpost_idを渡さないでください...これは、グローバル$ postオブジェクトを操作することを意味します。しかし、そのような投稿が存在するという保証はありません。

save_postフックがpost_idをパラメータとして渡すのには理由があります - あなたはあなたの関数の中でそれを使うべきです...

そのため、上の行を次のように変更します。

$post_type = get_post_type($post_id);

あなたの問題を解決するはずです。

PS。それをすることに意味がありません:

$post_types = get_post_types();

unset($post_types['listings']);

後でそのコードでその変数を使用することすらありません...

PPS save_postはアクションなので、何も返す必要はありません。

2