导致页眉错误的元框

时间:2012-12-30 作者:jsumnersmith

我正在尝试将一些元框和自定义帖子类型移动到插件文件中(以便在将来的主题更新中幸存下来)。一个问题是,现在我所有的wp\\u nonce值都返回了一个“未定义索引”通知(我意识到这不是一个大问题,但我希望我的代码以尽可能干净的方式工作)。然而,主要的问题是,save函数中的$\\u POST会导致“headers ready sent”的警告错误,与pluggables冲突。php文件(第876行)。下面是我尝试使用的代码:

// Add and Save Meta Boxes for Congregation Post Type
add_action( \'add_meta_boxes\', \'add_congregation_metaboxes\', 1 );
add_action(\'save_post\', \'save_address_meta\', 1, 2); // save the Address field

function add_congregation_metaboxes() {
    add_meta_box(\'congregation_address\', \'Congregation Address\', \'congregation_address\', \'congregation\', \'side\', \'default\');
}

// The Congregation Address Metabox 
function congregation_address() {
    global $post;
    // Noncename field
     wp_nonce_field( plugin_basename( __FILE__ ), \'address_noncename\' );
    // Get the first line of the address
    $address_line1 = get_post_meta($post->ID, \'_address_line1\', true);
    // Get second line of the address
    $address_line2 = get_post_meta($post->ID, \'_address_line2\', true);
    echo \'<p>Address</p>\';
    echo \'<input type="text" name="_address_line1" value="\' . $address_line1  . \'" class="widefat" />\';
    echo \'<input type="text" name="_address_line2" value="\' . $address_line2  . \'" class="widefat" />\';
    }

// Save the Metabox Data !! The error is in the wp_verify_nonce
function save_address_meta($post_id, $post) {
    // Verify Nonce
      if ( !wp_verify_nonce( $_POST[\'address_noncename\'], plugin_basename(__FILE__) )) {
      return $post->ID;
      }
    // Check permissions
    if ( !current_user_can( \'edit_post\', $post->ID ))
        return $post->ID;
    // Cycle through array
    $address_meta[\'_address_line1\'] = $_POST[\'_address_line1\']; //This is the line that explodes
    $address_meta[\'_address_line2\'] = $_POST[\'_address_line2\'];
    // Add values of custom fields
    foreach ($address_meta as $key => $value) { // Cycle array!
        if( $post->post_type == \'revision\' ) return; 
        $value = implode(\',\', (array)$value); 
        if(get_post_meta($post->ID, $key, FALSE)) { 
            update_post_meta($post->ID, $key, $value);
        } else { 
            add_post_meta($post->ID, $key, $value);
        }
        if(!$value) delete_post_meta($post->ID, $key); 
    }
}
感谢您的帮助!

1 个回复
SO网友:s_ha_dum

可能在这里:

if ( !wp_verify_nonce( $_POST[\'address_noncename\'], plugin_basename(__FILE__) )) {
  return $post->ID;
}
您正在使用$_POST[\'address_noncename\'] 但在你之前没有检查它是否存在。这将触发您提到的关于“未定义索引”的警告。如果在发送标头之前,该警告打印到屏幕上,则会出现标头错误。尝试:

if ( !isset($_POST[\'address_noncename\']) || !wp_verify_nonce( $_POST[\'address_noncename\'], plugin_basename(__FILE__) )) {
  return $post->ID;
}
那会return $post->ID; 如果未设置nonce字段或nonce无效。这可能不是您想要的确切逻辑,但这是您需要避免的检查类型,以避免警告和标头错误。

结束

相关推荐

在Metabox中列出带有复选框的页面(并保存它们)

以下是我基本上想要实现的目标:我有一个名为“quotes”的自定义帖子类型,我有许多wordpress页面,我想做的是:每次创建一篇新的“quotes”帖子时,我都希望能够选择该quotes帖子应该放在哪一页上。我决定在“quotes”帖子页面上创建一个新的元框,并在该元框中列出所有页面,前面有一个复选框:一切都很好,但现在我不知道如何保存这些复选框。以下是我用来打印metabox内容的函数:function myplugin_inner_custom_box( $post ) { $cu