如何将自定义POST类型转换为单独的类而不是WP_Post

时间:2016-11-16 作者:jsphpl

我想创建的子类WP_Post 并向其添加一些“模型功能”。当我查询自定义帖子类型时,如何强制WP创建该子类的对象而不是WP\\U帖子本身?

Example:

假设我有两种自定义帖子类型:BookReview. 每本书可以有许多评论。在我的书中,我想要一种方法来总结所有的评论。我将定义以下类:

class Book extends WP_Post
{
    public function reviewsSummary()
    {
        // Retrieve all reviews for $this book
        // Sum up their ratings
        // Return that sum
    }
}
有什么方法吗,例如打电话时register_post_type(), 强制WordPress将所有类型为“book”的帖子强制转换到我的Book 类而不是WP_Post?

可能看起来像这样:

register_post_type(\'book\', [
    …,
    \'class\' => Acme\\Models\\Book::class
]);

2 个回复
SO网友:Rarst

WP_Post WP中的等级为final, 因此它明确禁止子类化。这在实践中也是相当模糊的,只要建立了数据结构,周围的很多代码都会很乐意接受/生成类似于的post–对象。

在不了解您的具体需求的情况下推荐替代方案是一项挑战。一般来说,假设在模板中使用,典型的做法是创建一个模板标记函数,该函数将计算评论帖子的分数,作为参数和/或循环中的当前值提供给它。

SO网友:jsphpl

如何“子类”WP_Post

谢谢你,@Rarst指出了you can\'t subclass WP_Post, 这是本案的一个主要问题。

解决方法

但是,有一种方法可以使用一个包装类来解决这个问题,该包装类将一个真实的WP\\u Post对象存储为属性,并通过魔术方法将其公开,以便表现得像一个包装类。

可以找到这种方法的两个例子herehere.

警告:在许多情况下,这种方法可能因不同的原因而不起作用,其中一个原因是这些对象不会通过instanceof WP_Post 检查

那么让我们假设我们可以以某种方式替换WP\\u Post。我要找的是where to hook in 为了更换WP_Post. 这个问题的答案是posts_results 过滤器,此处给出:https://stackoverflow.com/a/40631962/3919281

相关推荐