我想在返回的数据中添加其他项WP_Post
. 因此,对于每个返回WP\\u Post对象的函数/查询,我希望添加额外的数据。
返回结果示例:
WP_Post (object) => [
// Default data returned by WP_Post
ID => int,
post_author => string,
post_name => string,
post_type => string,
post_title => string,
post_date => string,
post_date_gmt => string,
post_content => string,
post_excerpt => string,
post_status => string,
comment_status => string,
ping_status => string,
post_password => string,
post_parent => int,
post_modified => string,
post_modified_gmt => string,
comment_count => string,
menu_order => string,
// Additional data I want to add
extra_data_1 => array,
more_data_key => string,
another_added => string
]
例如,当函数
get_post()
或
get_page_by_path()
如果运行,它们将返回WP\\u Post对象以及我的其他数据。
我试着找到合适的hook/filter 但这并不成功。
我希望我能做如下事情:
// This is concept code
add_action(\'pre_wp_post_return\', function($data) {
$data->extra_data_1 = get_post_meta($data->ID, \'extra_data\');
$data->more_data_key = get_post_meta($data->ID, \'more_data\', true);
$data->another_added = get_post_meta($data->ID, \'another_data\', true);
return $data;
});
我的理由是,我必须为WP构建一个自定义API,该API使用一系列不同的核心函数来返回WP\\U Post对象。能够在一个地方添加额外的数据可以防止我复制代码。
我希望这足够清楚。任何帮助都会很好!
SO网友:David
如果您的额外数据直接引用post meta,则无需执行任何操作,因为WP_Post
实现»magic«方法__isset()
和__get()
它直接要求post meta键(以下四个键除外:page_template
, post_category
, tags_input
和ancestors
). 下面是一个快速示例,展示了该行为:
<?php
$post_id = 42;
$meta_key = \'extra_data_1\';
add_post_meta( $post_id, $meta_key, [ \'some\', \'value\' ], TRUE );
$post = get_post( $post_id );
var_dump( $post->{$meta_key} ); // (array) [\'some\', \'value\']
在任何其他情况下,使用过滤器
posts_results
:
<?php
add_filter(
\'posts_results\',
function( array $posts, WP_Query $query ) {
foreach ( $posts as $post ) {
$post->extra_data_1 = get_post_meta( $post->ID, \'extra_data\' );
// and so on …
}
return $posts;
},
10,
2
);
然而,我建议使用面向对象的方法并创建自己的实体接口,该接口遵循您的问题域。然后包装实现
WP_Post
实例作为依赖项。例如,假设您正在处理书籍:
<?php
namespace Wpse240042\\Type;
use WP_Post;
interface Book {
/**
* @return string
*/
public function title();
/**
* @return string
*/
public function publisher();
/**
* @return int
*/
public function year();
}
class WpPostBook implements Book {
/**
* @var WP_Post
*/
private $post;
/**
* @param WP_Post $post
*/
public function __construct( WP_Post $post ) {
$this->post = $post;
}
/**
* @return string
*/
public function title() {
return $this->post->post_title;
}
/**
* @return string
*/
public function publisher() {
return get_post_meta( $this->post->ID, \'_book_publisher\', TRUE );
}
/**
* @return int
*/
public function year() {
return get_post_meta( $this->post->ID, \'_book_publisher\', TRUE );
}
}
然后,您的业务逻辑可以依赖于按类型提示类型的书籍的结构
Book
在每个依赖项上。要获取书籍列表,您可以在第一步中实现一个工厂,该工厂将
WP_Query
或获取WP\\u查询参数并返回book实例列表。您不应该使用
posts_results
在这种情况下要更换的过滤器
WP_Query::posts
包含以下列表:
Type\\Book
实例不破坏整个WP核心的类型一致性。