大家好,我正在尝试在数据库中添加一个自定义字段,当我以某种方式更新它时,当我在数据库中检查它时,我发现字段值上没有添加几个额外的字符,如果您看到下面的代码,这就是我正在使用的代码
function set_embed($post_id) {
$player_0_embed_player = get_field( \'player_0_embed_player\', $post_id );
$query = $query = \'a:1:{i:0;a:3:{s:11:"ab_hostname";s:4:"#HLS";s:8:"ab_embed";s:203:"<iframe width="1263" height="480" src="https://www.youtube.com/embed/5Gsdtetr1zo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>";s:6:"_state";s:8:"expanded";}}\';
update_field( \'ab_embedgroup\', $query, $post_id );
}
add_action( \'save_post_watch\', \'set_embed\' );
这是我在数据库中找到的值
s:301:"a:1:{i:0;a:3:{s:11:"ab_hostname";s:4:"#HLS";s:8:"ab_embed";s:203:"<iframe width="1263" height="480" src="https://www.youtube.com/embed/5Gsdtetr1zo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>";s:6:"_state";s:8:"expanded";}}";
正如你所看到的文本s:301:“在开头,也在”;最后添加了,但我没有编写它们,所以每次我都要去数据库删除它们。我正在考虑将regex用于php,但不知道这是否是一个好的做法,因为在那之后,我想在queryany帮助中添加变量。我非常感谢。
编辑:请不要说s:301中的数字不总是一样的,我不知道为什么
编辑2:感谢@Mikhail对maybe\\u unserialize()的帮助;修复了这个问题,这让我想取消序列化并将其添加到数组中,所以在联机使用取消序列化工具后,值是
Array
(
[0] => Array
(
[ab_hostname] => #HLS
[ab_embed] => <iframe width="1263" height="480" src="https://www.youtube.com/embed/5Gsdtetr1zo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[_state] => expanded
)
)
如何将其正确格式化为变量?非常感谢你的帮助
编辑3:该字段是metabox插件字段:但是我正在尝试使用php向其添加值该字段是一个组,我想请检查下面的元文件中的这些值
\'fields\' => array(
array(
\'id\' => \'ab_embedgroup\',
\'type\' => \'group\',
\'clone\' => true,
\'sort_clone\' => true,
\'save_state\' => true,
\'desc\' => \'<b style="color:red;">You can insert embed code or shortcode</b>\',
\'tab\' => \'input-version\',
\'fields\' => array(
array(
\'name\' => \'Host Name\',
\'id\' => \'ab_hostname\',
\'type\' => \'text\',
),
array(
\'name\' => \'Embed\',
\'id\' => \'ab_embed\',
\'type\' => \'textarea\',
\'sanitize_callback\' => \'none\',
),
), //episode
), //input-version
array(
\'name\' => __( \'Shortcode Video\', \'meta-box\' ),
\'id\' => "{$prefix}embed",
\'type\' => \'textarea\',
\'clone\' => \'true\',
\'sort_clone\' => true,
\'sanitize_callback\' => \'none\',
\'tab\' => \'sc-version\',
),
),
现在,我可以在修复后用普通文本填充它们,然后我可以使用自定义变量,这不是问题
我尝试添加数组,但没有成功。这是php中应该如何编码的
$content = array(
[0] => array
(
[ab_hostname] => \'#HLS\',
[ab_embed] => \'<iframe width="1263" height="480" src="https://www.youtube.com/embed/5Gsdtetr1zo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>\',
[_state] => \'expanded\',
)
);
编辑4:您上一个代码运行得很好,但当我想添加第二个ab\\U主机名和ab\\U嵌入时,它不起作用,我想我在语法上犯了一些错误
这很有效
$data_to_save = [
\'ab_hostname\' => $player_0_name_player
,\'ab_embed\' => $player_0_embed_player,
];
现在我想添加多个,所以我这样做了,但不起作用
$data_to_save = [
[\'ab_hostname\' => $player_0_name_player,\'ab_embed\' => $player_0_embed_player,],
[\'ab_hostname\' => $player_1_name_player,\'ab_embed\' => $player_1_embed_player,],
];
最合适的回答,由SO网友:Mikhail 整理而成
第一:当您存储数据时,它会被序列化,这就是这些额外的s:301:
还有类似的东西。
如果您使用的是ACF插件,至少我在函数中看到了它get_field()
update_field()
您只需要传入一个要存储的值,它将在幕后为您序列化和取消序列化数据。
我还看到了字段名player_0_embed_player
is-您有一个名为player
有一个子字段名为embed_player
.
要从子字段中获得价值,您可以做的只是
$all_rows = get_field(\'player\', $post_id); // you\'ll have array of rows
$your_value = isset( $all_rows[0][\'embed_player\'] ) ? $all_rows[0][\'embed_player\'] : \'\'; // get value of subfield from first row if it exists.
update_field(\'ab_embedgroup\', $your_value, $post_id); // save this value to other field. i don\'t know why but your code does it.
//I also have no idea why you create some `$query` variable and assign it twice.
保存时,存储在数据库中的值将由ACF序列化。
UPD:澄清后
当您取消序列化以某种方式读取的元数据时,您就拥有了这些数据。
Array
(
[0] => Array
(
[ab_hostname] => #HLS
[ab_embed] => <iframe width="1263" height="480" src="https://www.youtube.com/embed/5Gsdtetr1zo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
[_state] => expanded
)
)
它的数据结构是
[ [ ab_hostname, ab_embed, _state ] ]
据我所知,您的目标数据结构ab_embedgroup
字段(类型为Group
) 是[ [ab_hostname, ab_embed ] ]
为什么你不能这么做?
$unserialized_data = maybe_unserialize($some_data_in_serialized_form_gathered_somehow);
$data_to_save = [
\'ab_hostname\' => $unserialized_data[\'ab_hostname\'],
\'ab_embed\' => $unserialized_data[\'ab_embed\'],
];
$data_to_save_as_group_field = [ $data_to_save ]; // it expects array of arrays with single array inside as it\'s group.
update_field( \'ab_embedgroup\', $data_to_save_as_group_field, $post_id );