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