私はこの大きなテーマを使っています。それはほぼ完全にウィジェットとスライダーに依存しています。これで、フォールバックを達成するためにすべてのインクルードファイルで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_html
filter hook
解決策が好きで、それがうまくいかないことに興味を持っています。
任意の助けをいただければ幸いです。
フックした関数に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;
}
@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 );
テスト済みで、この作業は私にとって問題ないようです。
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' ));
}
}
}