Custom meta boxes not saving

时间:2013-10-10 作者:asaunders

我正在尝试创建一个具有12个字段的自定义元框。共有3组4个字段,因此我使用for循环创建它们以节省键入等操作。

由于某种原因,我似乎无法让他们储蓄。我不确定我的编码是否正确?我检查了它们是否通过对var_dump($linktext[1]); 查看是否正在保存它,并且返回null。

这是添加元框的回调,以在元框的后端输出字段:

function home_callout_meta_box_cb($post) {
    global $post;
    wp_nonce_field(\'home_callout_nonce\', \'home_callout_meta_box_nonce\');
    $values = get_post_custom($post->ID);

    for ($i = 1; $i <= 3; $i++) {

        $imagefield1[$i] = isset($values[\'imagefields\'][$i]) ? esc_attr($values[\'imagefields\'][$i][\'image1\'][0]): \'\';
        $imagefield2[$i] = isset($values[\'imagefields\'][$i]) ? esc_attr($values[\'imagefields\'][$i][\'image2\'][0]): \'\';

        $linktext[$i] = isset($values[\'linktext\'][$i]) ? esc_attr($values[\'linktext\'][$i][0]): \'\';
        $link[$i] = isset($values[\'link\'][$i]) ? esc_attr($values[\'link\'][$i][0]): \'\';


        echo \'<p><strong>Call out box \' . $i .\' image 1</strong></p>\';
        echo \'<div>\';
        echo \'<input type="text" id="imagefields\'. [$i] . \'[image1]" name="imagefields\' . [$i] . \'[image1]" class="upload-url image_url" readonly="readonly" value="\' . $imagefield1[$i] .\'" />\';
        echo \'<input id="st_upload_button" class="st_upload_button button-secondary upload_image" type="button" name="upload_button" value="Upload" />\';
        echo \'</div>\';

        echo \'<p><strong>Call out box \' . $i .\' image 2</strong></p>\';
        echo \'<div>\';
        echo \'<input type="text" id="imagefields\' . [$i] . \'[image2]" name="imagefields\' . [$i] . \'][image2]" class="upload-url image_url" readonly="readonly" value="\' . $imagefield2[$i] .\'" />\';
        echo \'<input id="st_upload_button" class="st_upload_button button-secondary upload_image" type="button" name="upload_button" value="Upload" />\';
        echo \'</div>\';

        echo \'<p><strong>Call out box \' . $i .\' link text</strong></p>\';
        echo \'<input type="text" id="linktext\' . [$i] . \'" name="linktext\' . [$i] . \'" value="\' . $linktext[$i] . \'" />\';

        echo \'<p><strong>Call out box \' . $i .\' link</strong></p>\';
        echo \'<input type="text" id="link\' . [$i] . \'" name="link\' . [$i] . \'" value="\' . $link[$i] . \'" />\';

    }
}
这是我的保存功能:

function home_callout_save($post_id) {
    if(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) return;
    if(!isset($_POST[\'home_callout_meta_box_nonce\']) || !wp_verify_nonce($_POST[\'home_callout_meta_box_nonce\'], \'home_callout_nonce\')) return;
    if(!current_user_can(\'edit_pages\')) return;

    if(isset($_POST[\'imagefields\'])) {
        update_post_meta($post_id, \'imagefields\', $_POST[\'imagefields\']);   
    }

    if(isset($_POST[\'linktext\'])) {
        update_post_meta($post_id, \'linktext\', $_POST[\'linktext\']);
    }
    if(isset($_POST[\'link\'])) {
        update_post_meta($post_id, \'link\', $_POST[\'link\']);
    }
}
add_action(\'save_post\', \'home_callout_save\');
我想我已经盯着这个代码看了很久了,我想这可能是我犯的一个小错误,似乎看不到它。

感谢阅读,非常感谢您的帮助。

Edit:

这是我从$values[\'linktext\']:

字符串(75)“a:3:{i:1;s:11:“链接文本1”;i:2;s:11:“链接2文本”;i:3;s:11:“链接3文本”;}”

我不知道如何将返回的值放入字段中。

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

您以错误的方式访问$\\u POST数组。这是不可能的:

$_POST[\'imagefields[\' . $i . \'][image2]\']
正确的方法是:

$_POST[\'imagefields\'][$i][\'image2\'];
(访问$values 阵列。)

您还应该将完整的数组提供给update_post_meta() 函数,而不是单独保存每个值:

 if(isset($_POST[\'imagefields\'])) {
    update_post_meta($post_id, \'imagefields\', $_POST[\'imagefields\']);
}
*EDIT*

您可以使用以下代码查看保存到post\\U meta的值是否正确:

$values = get_post_custom($post->ID);
var_dump($values);
要修复$values部分,您需要更改以下所有事件:

$values[\'imagefields[\' . $i . \'][image1]\']
收件人:

$values[\'imagefields\'][$i][\'image1\']

结束

相关推荐

WordPress:可排序的Metabox字段不保存位置

我遇到了一个让我困惑的问题:升级到WP 3.6后,当您重新订购时,我的可排序metabox字段没有保存它们的位置。下面是我的代码:PHP:function save_box( $post_id ) { $post_type = get_post_type(); // verify nonce if ( ! isset( $_POST[\'custom_meta_box_nonce_field\'] ) ) return $p