从父页面继承的精选图像

时间:2014-06-10 作者:JHP

我想做的是显示父页面的特征图像,除非子页面有自己的特征图像,否则我希望该图像成为该页面及其其余子页面的特征图像。

-Page 1
-Page 2
  -Sub Page 1
  -Sub Page 2
    -Sub Sub Page 1 
    -Sub Sub Page 2
所以在上面的例子中:
Page 1Page 2 将有一个在标题中显示的特色图像集
Sub Page 1 将继承Page 2 特色图片
Sub Page 2 会有自己的特色形象sub sub page 1 将继承
Sub Sub Page 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();
} 
有人对如何做到这一点有什么建议吗?我感谢你的帮助。提前感谢!

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

这是我的建议,combineget_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 );
  }
}
当然,对于新的页面或插入后要更新的页面,这一个可以使用,因此您可以使用之前的两个片段:这样,现有的页面将动态继承缩略图。

结束

相关推荐