我有元数据自定义post“事件”,注册为非单一的,即有一个数组d元数据“术语”(它不是WordPress术语,我只是称之为术语,它是一个记录包含事件的开始日期,事件的结束日期,可能的事件的开始和结束时间。
register_meta(
'post',
'term_definition',
[
'object_subtype' => 'event',
'type' => 'object',
'description' => 'object with time data of the event',
'single' => false,
'auth_callback' => __NAMESPACE__ . '\authentication',
'sanitize_callback' => 'sanitization',
'show_in_rest' => [
'schema' => [
'type' => 'object',
'properties' => [
'ID' => [
'type' => 'integer'
],
'startDate' => [
'type' => 'string'
],
'endDate' => [
'type' => 'string'
],
'startTime' => [
'type' => 'string'
],
'endTime' => [
'type' => 'string'
],
]
]
]
]
)我希望获得自定义类型事件的所有帖子,其中元数据中的startDate位于当前日期时间之后(或当前日期时间之前)。从文档来看,这似乎只适用于单一的、简单的元数据,正如手册所描述的那样。作为一个侧面,我注意到以这种方式创建的元数据被序列化并存储在数据库中,如下所示:
meta_key: 'term_definition'
meta_value: a:3:{s:9:"startDate";s:19:"2021-12-09T16:36:00";s:2:"ID";i:0;s:7:"endDate";s:19:"2021-12-10T16:36:00";}发布于 2021-12-06 11:39:13
您是正确的,这是不可能的序列化数据。有一些黑客试图通过搜索序列化字符串的各个部分来绕过这一问题,但这些漏洞会引发大量错误,无法排序。
通常,在单个元值中存储结构化数据是一种反模式,您不能在meta_query字段中查询内部数据。如果您绝对必须存储它,那么将其存储为JSON,但请记住,您不能对内容进行查询或执行逻辑。(序列化的PHP值还会打开对象反序列化攻击,如果长度发生变化,则当在数据库上运行朴素搜索替换查询时中断)
这里的解决方案是将它分离成单个原子post元(至少5 ),在PHP/JS中进行排序,或者创建子post类型来表示您的事件,以便您可以使用标准的日期时间列
https://wordpress.stackexchange.com/questions/398792
复制相似问题