私がやりたいのは私の親ページのおすすめ画像を表示させることです。子ページがそれ自身の注目画像を持っていなければ、その画像をそのページとその残りの子ページからの注目画像にしたいです。
-Page 1
-Page 2
-Sub Page 1
-Sub Page 2
-Sub Sub Page 1
-Sub Sub Page 2
だから上記の例では:
Page 1 および Page 2 には、ヘッダーに表示される機能のある画像セットがあります。
サブページ1 は、フィーチャーされた画像を Page 2 継承します。
サブページ2 には独自の注目イメージがあり、それをサブサブページ1 に継承します。
サブサブページ2 には、独自の特集画像があるでしょう。
私はこのコードを私のヘッダに配置しようとしました。そこには画像が行く必要があり、そしてどんな特徴のある画像でも描画されませんでした、それはただ画像スライダを持ってきました。
<?php if ( has_post_thumbnail($post->post_parent, 'pagethumb') ) {
echo get_the_post_thumbnail($post->post_parent, 'pagethumb');
} else {
echo do_shortcode('[rev_slider header-slider-bw]');
} ?>
私はまた、イメージがそこにあり、このコードを使って作業していることを確認するためにテストしました。
if ( has_post_thumbnail() ) {
the_post_thumbnail();
}
これを実現する方法についてアドバイスがありますか。私はどんな助けにも感謝します。前もって感謝します!
これは私の提案であり、 get_ancestors
とカスタム$wpdb
クエリを組み合わせて、注目の画像を取得します。
カスタム関数の例:
function inherited_featured_image( $page = NULL ) {
if ( is_numeric( $page ) ) {
$page = get_post( $page );
} elseif( is_null( $page ) ) {
$page = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : NULL;
}
if ( ! $page instanceof WP_Post ) return false;
// if we are here we have a valid post object to check,
// get the ancestors
$ancestors = get_ancestors( $page->ID, $page->post_type );
if ( empty( $ancestors ) ) return false;
// ancestors found, let's check if there are featured images for them
global $wpdb;
$metas = $wpdb->get_results(
"SELECT post_id, meta_value
FROM {$wpdb->postmeta}
WHERE meta_key = '_thumbnail_id'
AND post_id IN (" . implode( ',', $ancestors ) . ");"
);
if ( empty( $metas ) ) return false;
// extract only post ids from meta values
$post_ids = array_map( 'intval', wp_list_pluck( $metas, 'post_id' ) );
// compare each ancestor and if return meta value for nearest ancestor
foreach ( $ancestors as $ancestor ) {
if ( ( $i = array_search( $ancestor, $post_ids, TRUE ) ) !== FALSE ) {
return $metas[$i]->meta_value;
}
}
return false;
}
この関数は、ページID、ページオブジェクト、または単一ページテンプレートの場合は何も使用せず、最も近い祖先の注目画像を返します。
(正直に言うと、ページだけでなく、階層的な投稿タイプでも機能します)。
次のような単一ページのテンプレートで使用できます。
if ( has_post_thumbnail() ) {
the_post_thumbnail( 'pagethumb' );
} else {
$img = inherited_featured_image();
if ( $img ) {
echo wp_get_attachment_image( $img, 'pagethumb' );
}
}
これは動作するはずですが、2つのデータベースクエリと追加の作業が必要になるため、パフォーマンスが少し劣ります。したがって、おそらく、バックエンドで関数を使用することをお勧めします。ページが保存されたら、注目の画像が存在するかどうかを確認し、そうでない場合は継承します。
それを変更したい場合は、もちろんできます...
add_action( "save_post_page", "inherited_featured", 20, 2 );
function inherited_featured( $pageid, $page ) {
if ( has_post_thumbnail( $pageid ) ) return;
$img = inherited_featured_image();
if ( $img ) {
set_post_thumbnail( $page, $img );
}
}
もちろん、これはnewページまたは更新するページafterそれを挿入したので、以前のスニペットの両方を使用できます:このようにexistingページはサムネイルを継承しますオンザフライ。