web-dev-qa-db-ja.com

特定の投稿のおすすめ画像のカスタムフィールド

次のコードを使用して、投稿用にカスタムテキストエリアを自分のおすすめ画像に追加しました。

function add_featured_description( $content ) {
    global $post;
    $small_description = get_post_meta( $post->ID,'thumbnail_description', true ) !== '0' ? get_post_meta( $post->ID,'thumbnail_description', true ) : '';
    global $pagenow;
    if (is_admin() && ($pagenow == 'post-new.php' || $pagenow == 'post.php') && ( get_post_type()=='post' ) ) {
      return $content .= '<div id="thumb_desc_container">
                            <textarea name="thumbnail_description" id="thumbnail_description" rows="4" style="width:100%;">'.$small_description.'</textarea>
                            <p class="hide-if-no-js howto" id="set-post-thumbnail-desc">Enter the image description.</p>
                          </div>';
    } else{
      return $content;
    }
}
add_filter( 'admin_post_thumbnail_html', 'add_featured_description');

それはうまくいきます!このコードはPOSTでのみ追加のテキストエリアを表示します。しかし、私が選択したときに注目画像のelseパートが実行されます(注目画像のみが返されます)。画像を追加する場合、$pagenowにはadmin-ajax.phpが含まれ、get_post_type()はnullです。グローバル変数$postはnull値を生成します。私は今どうすればいい?

4
Prifulnath

admin_post_thumbnail_html filterコールバックに使用できる追加の入力引数、つまり$post->ID$thumbnail_idがあります。

/**
 * Filters the admin post thumbnail HTML markup to return.
 *
 * @since 2.9.0
 * @since 3.5.0 Added the `$post_id` parameter.
 * @since 4.6.0 Added the `$thumbnail_id` parameter.
 *
 * @param string $content      Admin post thumbnail HTML markup.
 * @param int    $post_id      Post ID.
 * @param int    $thumbnail_id Thumbnail ID.
 */
 return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID, $thumbnail_id );

これは _wp_post_thumbnail_html() 関数内で適用されます。

これは、代わりに$post->ID入力引数を使用して、スニペット内のグローバル投稿を回避する方法の例です。

function wpse250432_add_featured_description( $content, $post_id, $thumbnail_id ) {

    $small_description = get_post_meta( $post_id, 'thumbnail_description', true );

    // Target only the 'post' post type
    if ( 'post' === get_post_type( $post_id ) ) 
      $content .= '<div id="thumb_desc_container">...</div>'; // Edit

    return $content;
}
add_filter( 'admin_post_thumbnail_html', 'wpse250432_add_featured_description', 10, 3 );

post.phppost-new.phpスクリーンとget-post-thumbnail-html ajax呼び出しにこのフィルタリングを本当に制限する必要があるなら、あなたは次のようなチェックを追加することができます:

if( 
       ! did_action( 'load-post.php' ) 
    && ! did_action( 'load-post-new.php' ) 
    && ! did_action( 'wp_ajax_get-post-thumbnail-html' )
)
    return $content;

しかし、私はあなたがいると思います他の場所で "private"の_wp_post_thumbnail_html()コア関数を呼び出しますか?しかし、これらの(underscored非公開関数は、プラグインおよびテーマ開発者による使用を目的としたものではなく、他のコア関数 のみによるものです。

4
birgire