web-dev-qa-db-ja.com

フックを使用したthe_post_thumbnailのフォールバック

私はこの大きなテーマを使っています。それはほぼ完全にウィジェットとスライダーに依存しています。これで、フォールバックを達成するためにすべてのインクルードファイルでpost_thumbnail出力コードを探すのを避けようとしました。これにより、ポストの最初のイメージまたは最後のデフォルトイメージが表示されます。

functionsファイルでこれを制御する方法はありますか?

任意の助けをいただければ幸いです。

post_thumbnail_htmlに基づくソリューションfilter hookは、明示的に設定されていないと、機能のある画像を表示しません:

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_fallback', 20, 5 );
function my_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( empty( $html ) ) {
        $image = get_children( "post_parent={$post_id}&post_type=attachment&post_mime_type=image&numberposts=1" );
        if($image){
                foreach ($image as $attachment_id => $attachment) {
                        $src = wp_get_attachment_image_src($attachment_id);
                 return printf(
                                 '<img src="%s" height="%s" width="%s" />'
                                ,$src[0]
                                ,get_option( 'thumbnail_size_w' )
                                ,get_option( 'thumbnail_size_h' )
                                );
            }
         } 
         else {
               return printf(
                                 '<img src="%s" height="%s" width="%s" />'
                                ,get_template_directory_uri().'/images/featured/featured.jpg'
                                ,get_option( 'thumbnail_size_w' )
                                ,get_option( 'thumbnail_size_h' )
                                );
         }  
    } 
        return $html;
}

私が この記事で見つけたもう一つの解決策 そしてそれは異なるaction hooksに基づいているので、意図した通りに投稿の最初の添付ファイル画像を表示(設定)します。投稿のおすすめ画像:

function autoset_featured() {
          global $post;
          $already_has_thumb = has_post_thumbnail($post->ID);
              if (!$already_has_thumb)  {
              $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
                          if ($attached_image) {
                                foreach ($attached_image as $attachment_id => $attachment) {
                                set_post_thumbnail($post->ID, $attachment_id);
                                }
                           } else {
                                set_post_thumbnail($post->ID, '414');
                           }
                        }
      }  //end function
add_action('the_post', 'autoset_featured');
add_action('save_post', 'autoset_featured');
add_action('draft_to_publish', 'autoset_featured');
add_action('new_to_publish', 'autoset_featured');
add_action('pending_to_publish', 'autoset_featured');
add_action('future_to_publish', 'autoset_featured');

今、私はそのpost_thumbnail_htmlfilter hook解決策が好きで、それがうまくいかないことに興味を持っています。

任意の助けをいただければ幸いです。

2
daniel.tosaba

フックした関数に5つの変数を渡すpost_thumbnail_htmlフィルタフックを使うことができます。

  • $html - 投稿のサムネイルの出力HTML
  • $post_id - 投稿ID。
  • $post_thumbnail_id - 画像の添付ファイルID
  • $size - 要求されたサイズまたはデフォルト
  • $attr - クエリ文字列または属性の配列.

だから、のようなもの:

add_filter( 'post_thumbnail_html', 'my_post_thumbnail_fallback', 20, 5 );
function my_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if ( empty( $html ) ) {
        // return you fallback image either from post of default as html img tag.
    }
    return $html;
}
5
Bainternet

@Bainternet回答に追加して:

オプションテーブルから設定サイズを取得します。つまり、返された画像はすべてのユーザー設定と一致します。デフォルトのサムを template ディレクトリからのみ呼び出して、子テーマが存在し、サムネイルが表示されない場合を回避します。

/**
 * Default post thumbnail image.
 * 
 * @param  string $html The Output HTML of the post thumbnail
 * @param  int $post_id The post ID
 * @param  int $post_thumbnail_id The attachment id of the image
 * @param  string $size The size requested or default
 * @param  mixed string/array $attr Query string or array of attributes
 * @return string $html the Output HTML of the post thumbnail
 */
function wpse64763_post_thumbnail_fb( $html, $post_id, $post_thumbnail_id, $size, $attr )
{
    if ( empty( $html ) )
    {
        return sprintf(
            '<img src="%s" height="%s" width="%s" />',
            get_template_directory_uri().'/path/to/default-thumb.png',
            get_option( 'thumbnail_size_w' ),
            get_option( 'thumbnail_size_h' )
        );
    }

    return $html;
}
add_filter( 'post_thumbnail_html', 'wpse64763_post_thumbnail_fb', 20, 5 );
3
kaiser

テスト済みで、この作業は私にとって問題ないようです。

    add_filter( 'post_thumbnail_html', 'wc_post_thumbnail_fallback', 20, 5 );
function wc_post_thumbnail_fallback( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
   if ($html) {
        return $html;
    }else {
        $args = array(
            'numberposts' => 1,
            'order' => 'ASC',
            'post_mime_type' => 'image',
            'post_parent' => $post_id,
            'post_status' => null,
            'post_type' => 'attachment',
        );

        $images = get_children($args);

        if ($images) {
            foreach ($images as $image) {
                return wp_get_attachment_image($image->ID, $size);
            }
        }else{
            printf('<img src="%s" height="%s" width="%s" />'
                ,get_template_directory_uri().'/images/featured/featured.jpg'
                ,get_option( 'thumbnail_size_w' )
                ,get_option( 'thumbnail_size_h' ));
        }

    }
}
0
WebCaos