我在函数中有这个代码。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\']; ?>
最合适的回答,由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
如果新密钥不存在,将添加新密钥