web-dev-qa-db-ja.com

親ページから継承されたおすすめの画像

私がやりたいのは私の親ページのおすすめ画像を表示させることです。子ページがそれ自身の注目画像を持っていなければ、その画像をそのページとその残りの子ページからの注目画像にしたいです。

-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();
} 

これを実現する方法についてアドバイスがありますか。私はどんな助けにも感謝します。前もって感謝します!

3
JHP

これは私の提案であり、 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ページはサムネイルを継承しますオンザフライ

3
gmazzap