变量未正确传递到使用自定义字段的数据库

时间:2020-03-18 作者:Seddek Iguijji

大家好,我正在尝试在数据库中添加一个自定义字段,当我以某种方式更新它时,当我在数据库中检查它时,我发现字段值上没有添加几个额外的字符,如果您看到下面的代码,这就是我正在使用的代码

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,],
    ];

1 个回复
最合适的回答,由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 );

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: