Metabox doesn't retain values

时间:2012-02-24 作者:Chris

我在函数中有这个代码。php,以便在后端显示元框。问题是,在我将网站从子域(dev)移动到根域之前,这个功能一直正常运行,现在即使元盒出现在后端,它也不再保留这些值。

<?php
define(\'MY_WORDPRESS_FOLDER\',$_SERVER[\'DOCUMENT_ROOT\']);
define(\'MY_THEME_FOLDER\',str_replace(\'\\\\\',\'/\',dirname(__FILE__)));
define(\'MY_THEME_PATH\',\'/\' . substr(MY_THEME_FOLDER,stripos(MY_THEME_FOLDER,\'wp-content\')));

<?php
define(\'MY_WORDPRESS_FOLDER\',$_SERVER[\'DOCUMENT_ROOT\']);
define(\'MY_THEME_FOLDER\',str_replace(\'\\\\\',\'/\',dirname(__FILE__)));
define(\'MY_THEME_PATH\',\'/\' . substr(MY_THEME_FOLDER,stripos(MY_THEME_FOLDER,\'wp-content\')));

add_action(\'admin_init\',\'my_meta_init\');

function my_meta_init()
{
    $post_id = $_GET[\'post\'] ? $_GET[\'post\'] : $_POST[\'post_ID\'] ;
    if ($post_id == \'2\') {
    foreach (array(\'post\',\'page\') as $type) 
    {
        add_meta_box(\'my_all_meta_home\', \'Additional info\', \'my_meta_setup\', $type, \'normal\', \'high\');
    }
    }
    add_action(\'save_post\',\'my_meta_save\');
}
function my_meta_setup()
{
    global $post;
    $meta = get_post_meta($post->ID,\'_my_meta\',TRUE);
    include(MY_THEME_FOLDER . \'/meta.php\');
    echo \'<input type="hidden" name="my_meta_noncename" value="\' . wp_create_nonce(__FILE__) . \'" />\';
}

function my_meta_save($post_id) 
{
    if (!wp_verify_nonce($_POST[\'my_meta_noncename\'],__FILE__)) return $post_id;
    if ($_POST[\'post_type\'] == \'page\') 
    {
        if (!current_user_can(\'edit_page\', $post_id)) return $post_id;
    } 
    $current_data = get_post_meta($post_id, \'_my_meta\', TRUE);  
    $new_data = $_POST[\'_my_meta\'];
    my_meta_clean($new_data);
    if ($current_data) 
    {
        if (is_null($new_data)) delete_post_meta($post_id,\'_my_meta\');
        else update_post_meta($post_id,\'_my_meta\',$new_data);
    }
    elseif (!is_null($new_data))
    {
        add_post_meta($post_id,\'_my_meta\',$new_data,TRUE);
    }
    return $post_id;
}
function my_meta_clean(&$arr)
{
    if (is_array($arr))
    {
        foreach ($arr as $i => $v)
        {
            if (is_array($arr[$i])) 
            {
                my_meta_clean($arr[$i]);
                if (!count($arr[$i])) 
                {
                    unset($arr[$i]);
                }
            }
            else 
            {
                if (trim($arr[$i]) == \'\') 
                {
                    unset($arr[$i]);
                }
            }
        }
        if (!count($arr)) 
        {
            $arr = NULL;
        }
    }
}
你能帮我理解出了什么问题吗?我无法理解这一点,这很令人沮丧。代码根本没有更改,我的metabox的输出位于主题根目录中的另一个php文件中,没有任何更改。

我能想到的唯一一件事是,在子域上开发网站,当我将文件复制到根目录下时,我没有创建另一个数据库,因为我不需要一个数据库,而是使用了我拥有的数据库,然后使用一个插件来更改所有URL。然后我使用一个插件来搜索和替换数据库中的URL值,但这是在更改数据库之前发生的。无论如何,我不能这样。

当我在后端编辑metabox时,没有任何错误,帖子/页面会更新,但很明显数据库不会保留新值,编辑后的字段是emtpy。这是我在元中的内容。php:

<input type="text" name="_my_meta[title]" value="<?php if(!empty($meta[\'title\'])) echo $meta[\'title\']; ?>"/>
<span>Enter in a title</span>


<label>Body text</label>
<textarea name="_my_meta[body-text]" rows="5"><?php if(!empty($meta[\'body-text\'])) echo $meta[\'body-text\']; ?></textarea>
<span>Enter in the body text</span>


<label>Link</label>
<input type="text" name="_my_meta[link]" value="<?php if(!empty($meta[\'link\'])) echo $meta[\'link\']; ?>"/>
<span>Enter in the URL of the link</span>

<span>e.g. <code><a href=\'services/\' > View our Services page < /a ></code></span>
以后编辑:

这是我获取metabox值的方式:

<?php 
global $wp_query;
$postid = $wp_query->post->ID;
$array = get_post_meta($postid,\'_my_meta\',TRUE);

  echo "<h1>"; echo $array[\'title\']; echo "</h1>"; 
  echo \'<p>\'; echo $array[\'body-text\']; echo \'</p>\'; 
  echo $array[\'link\']; ?>

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

下面的许多注释都引用了用于调试的代码,为了清楚起见,我已经删除了这些代码

我应该很快就会发现这一点-您只在Posteta表中添加了一行,而这一行具有键_my_meta. 在表中插入数组之前,WordPress会序列化数组。检索meta时,您正在检索一个序列化数组,然后需要unserialize.

然而,我认为这不是你想要的,(也不可取)。最好将数组中的每个值保存为数据库中单独的键值对(这样会更有效,并允许查询特定的键值等)。

要做到这一点,您需要遍历接收到的数据数组并分别添加每个键值:(我已经用适当的注释重新发布了您的代码)

function my_meta_save($post_id) {

// verify this is not an auto save routine. 
if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) return $post_id;

//Perform nonce checks & permissions (for pages and posts)

//Sanitize the input 

//Declare a white list of \'keys\' with their defaults (or null)
//- i.e. this code will not add any other keys:
$whitelist = array(
    \'title\'=>null,
    \'img01-title\'=>null,
    \'img01-url\'=>null
);
   //It would probably make sense to do this before sanitzing. 
    $new_data = shortcode_atts($whitelist,$new_data);

   //Now add/update or remove key-values appropriately
   foreach ($whitelist as $key=>$value){
        //If the key has a value, update it. If it doesn\'t already exist it will add it
        if(!is_null($whiltelist[$key]))
              update_post_meta($post_id,$key,$value);
        else
              delete_post_meta($post_id,$key);
    }

    //No need to return, this is an action not a filter
 }
备注我添加了一个自动保存检查,以便在帖子/页面自动保存时更新数据。如果帖子是页面,您已经检查了权限,您也应该对帖子执行此操作shortcode_atts 这将删除所有未在中声明的密钥$whitelist. 它将为缺少/没有值的键指定默认值
  • update_post_meta 如果新密钥不存在,将添加新密钥

  • 结束

    相关推荐

    在短代码中获取Metabox值?

    是否可以在该页上执行的短代码中获取该页的元盒值?场景:我每个页面都有一个侧边栏元数据库</我有一些自定义的Gallery快捷码我的gallery快捷码输出600x200幅图像(我在这里使用timthumb)。但如果没有侧栏,我希望它显示900x300。通常我会使用:$sidebar = get_post_meta($post->ID, \'metabox_sidebar\', true); if($sidebar == \"true\") { do something }