WordPress 3在保存时搞砸了我的自定义Meta Box值

时间:2010-09-15 作者:Scott B

“我的主题”的代码在页面编辑器界面上放置了一个自定义元框,用于切换页面的noindex和/或nofollow属性。

这是一个简单的小交易,有两个复选框,一个表示noindex,另一个表示nofollow。

这些在3.0.1之前的所有WP版本中都能完美工作

我发现在3.0.1中,复选框的值没有保存。无论我做什么,它们总是未经检查而出现,并且值也不会传递到数据库(它不仅在接口中报告未经检查,而且从不将值发送到db)

我不知道有什么不同,以及如何让我的代码与3.0.1兼容

是否有人知道,在WP 3.0.1中更新页面时,会发生哪些更改,使这些复选框值无法通过?

// ===================
// = POST OPTION BOX =
// ===================

add_action(\'admin_menu\', \'my_post_options_box\');

function my_post_options_box() {
    if ( function_exists(\'add_meta_box\') ) { 
        add_meta_box(\'categorydiv\', __(\'Page Index Options\'), \'post_categories_meta_box_modified\', \'page\', \'side\', \'high\');
    }
}

//adds the custom categories box
function post_categories_meta_box_modified($post) {
global $post, $noindexCat, $nofollowCat;
    $noindexCat = get_cat_ID(\'noindex\');
    $nofollowCat = get_cat_ID(\'nofollow\');
    if(in_category("noindex")){ $noindexChecked = " checked=\'checked\'";} 
    if(in_category("nofollow")){ $nofollowChecked = " checked=\'checked\'";}
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id=\'category-<?php echo $noindexCat ?>\' class="popular-category"><label class="selectit"><input value="<?php echo $noindexCat ?>" type="checkbox" name="post_category[]" id="in-category-<?php echo $noindexCat ?>"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id=\'category-<?php echo $nofollowCat ?>\' class="popular-category"><label class="selectit"><input value="<?php echo $nofollowCat ?>" type="checkbox" name="post_category[]" id="in-category-<?php echo $nofollowCat ?>"<?php echo $nofollowChecked ?> /> nofollow</label></li> 
        <li id=\'category-1\' class="popular-category" style="display:none;"><label class="selectit"><input value="1" type="checkbox" name="post_category[]" id="in-category-1" checked="checked"/> Uncategorized</label></li> 
    </ul>
</div>
<?php
}

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

首先,这不是使用自定义post meta。。。您正在尝试检索类别并使用这些类别的存在来选中这些框。我也没有看到任何脚本可以在单击值后保存它们。。。当这个解决方案起作用时,我认为这是一个非常粗糙的解决方案,所以我对它的不稳定和损坏并不感到惊讶。

但是,您可以实际使用自定义post meta来完成您想要做的事情。请改用以下脚本:

// ===================
// = POST OPTION BOX =
// ===================

add_action(\'admin_menu\', \'my_post_options_box\');

function my_post_options_box() {
    if ( function_exists(\'add_meta_box\') ) { 
        add_meta_box(\'categorydiv\', __(\'Page Index Options\'), \'post_categories_meta_box_modified\', \'page\', \'side\', \'high\');
    }
}

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, \'_noIndex\', true) ) $noindexChecked = " checked=\'checked\'";
    if( get_post_meta($post->ID, \'_noFollow\', true) ) $nofollowChecked = " checked=\'checked\'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id=\'noIndex\' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id=\'noFollow\' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>  
    </ul>
</div>
<?php
}

function save_post_categories_meta($post_id) {
    if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ) return $post_id;

    $noIndex = $_POST[\'chk_noIndex\'];
    $noFollow = $_POST[\'chk_noFollow\'];

    update_post_meta( $post_id, \'_noIndex\', $noIndex );
    update_post_meta( $post_id, \'_noFollow\', $noFollow );

    return $post_id;
}

add_action(\'save_post\', \'save_post_categories_meta\');
这将在自定义post元字段“noIndex”和“noFollow”中存储布尔标志,检索这些字段的值以在自定义元框中使用,并允许您轻松访问站点中的其他位置。使用get_post_meta( $post->ID, \'meta-name\', true ) 检索它们。

SO网友:farinspace

我还建议使用WPAlchemy Meta Box (我创建的一个php类)用于创建元框。。。

结束

相关推荐