Get_post_meta的$Single参数有什么意义?

时间:2016-11-08 作者:jgraup

正在查看get_post_meta() 我总是要记住设置$single 参数至true. 我通常假设我正在设置一个值,并且我希望返回该值。

检索帖子的帖子元字段。

  • $post_id (int)(必填)职位ID。
  • $key (字符串)(可选)要检索的元键。默认情况下,返回所有键的数据。默认值:“”$single (bool)(可选)是否返回单个值。默认值:false
我知道这应该作为选项存在,但我个人不知道为什么。有人能解释一下为什么返回array 默认值的?从向后兼容性的角度来看,这是有道理的,但事情有没有发展?或者,是否有一些核心功能要求它以这种方式运行,以获得我所不知道的效率。

是否添加$prev_valueupdate_post_meta() 是否将历史记录创建为数组元素?

我希望working 将此设置为false, 有道理。这意味着我可以测试代码。此外,一个真正经过深思熟虑和研究的答案。这意味着我想要评论,就像TLC想要scrubs一样。

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

一般来说storing PHP serialized data in database in a bad idea. 如果在一个字段行中使用多个键值对的数据,也就是说,使用一个数组或一个具有一个元键的对象,就很容易理解。

将汽车成像为对象。例如,您可以设置多个元值来描述汽车colorfuel. 您可以序列化数据并将其存储在一个元字段中(仅一个元键):

$metadata = array(
    \'color\' => \'white\',
    \'fuel\'  => \'diesel\'
);
// as it is an array, $metadata will be serialized automatically by WordPRess
update_post_meta( 458, \'car_meta\', $metadata );
在本例中,您可以使用get_post_meta() 将第三个参数设置为false;

$carmeta = get_post_meta( 458, \'car_meta\', false );
// Serialized meta is unserialized automatically by WordPress
echo $carmeta[0][\'color\'];
echo $carmeta[0][\'fuel\'];
或者您可以将其用于true, 差别不大:

$carmeta = get_post_meta( 458, \'car_meta\', true );
echo $carmeta[\'color\'];
echo $carmeta[\'fuel\'];
现在想象一下,你只想买红色的柴油车。你需要all cars 他们的元数据来自数据库,并在所有汽车上循环,取消元数据的序列化并搜索运行柴油的白色汽车。这是really bad.

另一方面,如果对每个元数据使用一个元键,例如:

$metadata = array(
    \'car_color\' => \'white\',
    \'car_fuel\'  => \'diesel\'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}
然后,您可以直接从数据库中获取所需内容:

$args = array(
    \'meta_query\' => array(
        \'relation\'  => \'AND\',
         array(
             \'key\'   => \'car_color\',
             \'value\' => \'red\'
         ),
         array(
             \'key\'   => \'car_fuel\',
             \'value\' => \'diesel\'
         )
    )
);

$query = new WP_Query( $args );
现在想象一辆车可以available in multiple colors, 您可以这样做:

$metadata = array(
    \'car_colors\' => array( \'red\', \'white\' ),
    \'car_fuel\'   => \'diesel\'
);
foreach( $metadata as $key => $value ) {
    update_post_meta( 458, $key, $value );
}
现在我们有了car_colors 具有序列化数组的元键。如果只想查询一种颜色的可用汽车,我们将面临前面描述的相同问题。因此,最好将颜色存储为转发器元字段:

$metadata = array(
    \'car_colors\' => array( \'red\', \'white\' ),
    \'car_fuel\'   => \'diesel\'
);
foreach( $metadata as $key => $value ) {
    if( is_array( $value ) ) {
        foreach( $value as $val ) {
            // We add multiiple meta fields with the same meta key
            add_post_meta( 458, $key, $val );
        }
    } else {
        update_post_meta( 458, $key, $value );
    }
}
现在,如果您想获得汽车的所有可用颜色,您需要third parameter of get_post_meta() set to false, 如果设置为true 您将只获得数据库中为该车找到的第一种可用颜色。

// This gets only the first car_colors entry found in database for car 458
$available_colors = get_post_meta( 458, \'car_colors\', true );
// This gets all the car_colors entries for car 458
$available_colors = get_post_meta( 458, \'car_colors\', false );
这是一个非常基本的例子,但我认为它说明了use case where third parameter of get_post_meta() makes sense, 所以我希望这能回答你的问题。

另一个例子可能是在另一个答案中披露的关于一天内演出几次的节目,例如电影院中的电影。您希望“开始时间”是一个转发器字段,而不是一个所有开始时间都存储为序列化数据的字段。

关于另一个问题:添加$prev_valueupdate_post_meta() 是否将历史记录创建为数组元素?不,如果你通过$prev_valueupdate_post_meta(), 仅更新数据库中具有该值的现有行;如果$pre_value 如果未设置,则将更新元键的所有行。

最后,如果要删除汽车的所有可用颜色:

delete_post_meta( 458, \'car_colors\' );
如果只想删除一个具有特定值的条目:

delete_post_meta( 458, \'car_colors\', \'white\' );

SO网友:Benoti

如果元中有一个序列化值,可以将其设置为true并获取非序列化数组。

因此,如果您需要通过一个表单将其设置为false,那么该值就可以发送了。

请注意get_post_meta() 是一个简单的函数,返回get_metadata. 此函数使用:maybe_unserialize() 在返回元数据之前取消序列化元数据。

来自法典(translated from french from this page):

对于序列化字符串,这可能不是很明确。如果使用此方法检索序列化数组,则需要将$single设置为“true”,以实际获取反序列化数组。如果转到“false”,或将其保留为空,则会有一张图片,索引0处的值是序列化字符串。

SO网友:Mark Kaplun

不是那么多get_post_metaadd_post_meta 这在这里很重要。

在由custome fields UI公开的naive实现os元字段中,可以将多个值分配给一个元键。

有人设想通过向元表添加和删除行来存储数据数组,而没有意识到对于95%的应用程序来说,序列化是一个更好的选择,至少从可读代码的角度来看,这可能是一种判断失误。一个简单的更好的替代方法是反转该参数的默认值。

当您需要对元数据执行查询时,这实际上是一种有用的存储元数据的方法,但仍有5%(好的,可能是1%)的用法。最简单的例子可能是一个在当地影院放电影的网站,你想知道今晚(晚上8点-9点开始时间)有什么节目。如果将开始时间存储在各自的db meta行中,那么编写wp\\U查询以返回所有相关电影是很简单的,而如果数据被序列化,则几乎不可能。

SO网友:Aamer Shahzad

$meta = get_post_meta( get_the_ID(), \'meta_key\', true );
\'meta_key\' 是一个示例元密钥。

如果您使用\'false\' 在第三个参数中,您将得到以下结果$metaarray(). 你不能echo 像这样,例如echo $meta; 您将使用echo $meta[0];

如果您使用\'true\' 在第三个参数中,您将获得存储在$meta 变量asstring. 你可以echo 结果,例如echo $meta;

如果保留第三个参数(布尔值),则将其设置为\'false\' 默认情况下,它将结果打印为array();

要理解这一点,请在循环中使用以下代码,您将看到结果。

$meta = get_post_meta( get_the_ID(), \'meta_key\', true );
echo \'<pre>\';
print_r($meta);
echo \'</pre>\';
将true更改为false并查看结果。同时更改\'meta_key\' 到您的元密钥。

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在