如何将_POST_META值更新为数组

时间:2016-10-19 作者:Shwan Namiq

我在导航菜单项中创建了新的自定义字段,作为我使用的多个选择选项update_post_meta() 如下所示

function YPE_update_custom_fields($menu_id, $menu_item_db_id, $menu_item_data) {
    if (is_array($_REQUEST[\'menu-item-content-multiple\'])) {
        update_post_meta($menu_item_db_id, \'_menu_item_content_multiple\', $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id]);
    }
}
add_action(\'wp_update_nav_menu_item\', \'YPE_update_custom_fields\', 10, 3);

function YPE_setup_custom_fields($item) {
    $item->content_multiple = get_post_meta($item->ID, \'_menu_item_content_multiple\', true);
    return $item;
}
add_filter(\'wp_setup_nav_menu_item\', \'YPE_setup_custom_fields\');
然后我将新字段添加到Walker_Nav_Menu_Edit 文件如下

EDITED

<?php
$select_options = array (
    \'key_1\' => \'option1\', 
    \'key_2\' => \'option2\', 
    \'key_3\' => \'option3\'
); 
?>
<p class="field-content-multiple description description-thin">
<label for="edit-menu-item-content-multiple-<?php echo $item_id; ?>">
    <?php _e( \'Multiple Content\' ); ?><br />
    <select name="menu-item-content-multiple[<?php echo $item_id; ?>][]" id="edit-menu-item-content-multiple-<?php echo $item_id; ?>" class="widefat code edit-menu-item-content-multiple" multiple="multiple">
            <?php foreach ($select_options as $key => $value): ?>
                <option value="<?php echo $key; ?>"  <?php echo selected(in_array($key, $item->content_multiple)); ?>><?php echo $value;?></option>
            <?php endforeach ?>
    </select>
</label>
</p>
我的代码使用单一选择框时没有任何问题,但使用in_array() 在多个select案例中,返回此错误

Warning: in_array() expects parameter 2 to be array, null given

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

您可以这样做:

$item->content_multiple = get_post_meta($item->ID, \'_menu_item_content_multiple\', true);
请注意如何设置的第三个参数get_post_meta()true, 这意味着只返回一个值。If you read the docs, 如果第三个参数是false, 您将获得array 包含该元字段的所有值。

请记住,元字段可以是唯一的,也可以是多个。或者,它可以是唯一的序列化数据字符串。

实际上,您的代码似乎将select multiple中的所有值存储到一个元字段中。因此,在请求中获得一个数组,并将其作为元字段的单个值传递。当元字段的值是数组时,WordPressconverts it to a serialized string before it is stored in the database; 这是通过函数内部完成的maybe_serialize(). 然后,当您尝试获取元字段的值时,如果它是一个序列化字符串,WordPress会将其传递给maybe_unserialize(), 因此,序列化字符串将转换回数组:

让我们用一个通用示例进行解释。

这将是存储在数据库中的值数组:

$values = [ \'red\', \'yellow\', \'blue\', \'pink\' ];
如果元键为“color”,则有两个选项:

同一元密钥的多个条目

$values = [ \'red\', \'yellow\', \'blue\', \'pink\' ];
foreach( $values as $value ) {
    // This method uses `add_post_meta()` instead of `update_post_meta()`
    add_post_meta( $item_id, \'color\', $value );
}
现在,标识为$item_id 将有多个条目用于color 元键。然后,您可以使用get_post_meta() 将第三个参数设置为false 您将得到一个包含所有值的数组:

// You don\'t really need the set the third parameter
// because it is false vay default
$colors = get_post_meta( $item_id, \'color\' );

// $colors should an array with all the meta values for the color meta key
var_dump( $colors );
将数组存储在单个元条目中。在这种情况下,在将值数组存储到数据库中之前,先将其序列化:

$values = [ \'red\', \'yellow\', \'blue\', \'pink\' ];
// WordPress does this automatically when an array is passed as meta value
// $values = maybe_serialize( $values );
update_post_meta( $item_id, \'color\', $values );
现在,标识为$item_id 将只有一个条目用于color 元密钥;该值是表示原始数组的序列化字符串。然后,您可以使用get_post_meta(), 将第三个参数设置为true,因为只有一个条目,然后取消序列化字符串以获取数组:

$colors = get_post_meta( $item_id, \'color\', true );
// WordPress does this automatically when the meta value is a serialized array
// $colors = maybe_unserialize( $colors );

// $colors should be an array
var_dump( $colors );
您可以使用相同的方法来选择表单的倍数。

With only one entry for the meta key:

if( ! empty( $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id] ) ) {
    $meta_field_value = $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id];
    // $meta_field_value will be serialized automatically by WordPress
    update_post_meta( $menu_item_db_id, \'_menu_item_content_multiple\', $meta_field_value );
}
然后,可以将值用作数组:

 // The value returned by get_post_meta() is unserialized automatically by WordPress
 $item->content_multiple = get_post_meta( $item->ID, \'_menu_item_content_multiple\', true );

With multiple entries:

这里的概念有点不同;您将使用相同的元键在数据库中创建多个条目,因此需要使用add_post_meta() 而不是update_post_meta() 以便为每个值添加新条目。

if( ! empty( $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id] ) ) {
    $values = $_REQUEST[ \'menu-item-content-multiple\' . $menu_item_db_id ];
    foreach( $values as $value ) {
        add_post_meta( $menu_item_db_id, \'_menu_item_content_multiple\', $value );
    }
}
现在,您可以使用get_post_meta() 将第三个参数设置为false (这是默认值,因此可以忽略):

$item->content_multiple = get_post_meta( $item->ID, \'_menu_item_content_multiple\', false );
这两个选项都可以,您必须决定哪一个更好地组织项目中的数据。

Side note: 您应该在使用输入数据之前进行一些santization,但我不知道您的要求,这里有一个示例:

array_map( \'sanitize_text_field\', wp_unslash( $_REQUEST[\'menu-item-content-multiple\'][$menu_item_db_id] ) );

SO网友:Benoti

您不使用selected() 功能正常。selected() 需要1个必需参数和2个选项。在您的情况下,最好使用$selected和$current。

在选择名称中,元字段名称前缺少下划线。

对于所选():

selected( $selected, $current, $echo);
你可以从法典中了解更多信息function reference selected()

您的选择必须如下所示:

<select name="_menu-item-content-multiple[]" multiple>
     <?php 
        foreach ($select_options as $key => $value) {
            echo \'<option value="\'.$key.\'" \'.selected(in_array($key, $item->content_multiple), $key).\'>\'.$value.\'</option>\';
        }
     ?>
</select>

相关推荐

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

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