未定义的索引:添加meta box时发布通知

时间:2015-07-18 作者:terminator

我试图在id为62的特定页面上添加元框。但我收到通知了Undefined index: post in 第5行,即$post_id= $_GET[\'post\'] ? $_GET[\'post\'] : $_POST[\'post_ID\'];

下面是我正在使用的代码。

<?php 
add_action(\'admin_init\',\'contact_meta_init1\');

function contact_meta_init1(){   
    $post_id= $_GET[\'post\'] ? $_GET[\'post\'] : $_POST[\'post_ID\'];    
    if($post_id==\'62\'){
      add_meta_box(\'contact_meta11\',\'Social icons\',\'social_icon\',\'page\',\'normal\',\'high\');       
    }
  }

function social_icon()
  {      
    global $post;    
    echo \'<input type="hidden" name="contactmeta_noncename" id="contactmeta_noncename" value="\' . 
    wp_create_nonce( plugin_basename(__FILE__) ) . \'" />\';     
    $contact_no = get_post_meta($post->ID, \'_contact_no\', true);        
     echo \'<label >\';?><?php _e( \'contact_no:\' );?></label>
    <?php echo \'<br><textarea name=_contact_no rows="1" cols="90">\'.$contact_no.\'</textarea>\';   
}

function contact_meta_save1($post_id, $post) {  
  if ( !wp_verify_nonce( ($_POST[\'contactmeta_noncename\']), plugin_basename(__FILE__) )) {
  return $post->ID;
  }
  if ( !current_user_can( \'edit_post\', $post->ID ))
    return $post->ID;   
  $contact_meta[\'_contact_no\'] = $_POST[\'_contact_no\'];  

  foreach ($contact_meta as $key => $value) { 
    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); 
  }
}
add_action(\'save_post\', \'contact_meta_save1\', 1, 2);
?>  
我做了一些研究,然后我用这样的isset

$post_id= isset($_GET[\'post\']) ? isset($_GET[\'post\']) : isset($_POST[\'post_ID\']);
这有助于消除通知,但随后会将此元数据库添加到所有页面。

我已经多次使用此代码,但这次不要告诉我出了什么问题。请帮忙。

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

你会得到那个错误,因为$_GET$_POST 并不是每个管理页面上都填写了这些数据。此外,您的代码绝不应该依赖全局变量,它们可以被任何其他代码更改,因此它们是不可靠的。所以不要使用global $post;, $_POST$_GET 当你可以从这里这样更好的渠道获得信息时。

使用操作add_meta_boxes 添加元数据库。如果要将metabox限制为仅一种post类型,请使用操作add_meta_boxes_$post_type.

下面是如何为post类型注册metaboxpage, 以及如何访问WP_Post 回调函数中的对象:

add_action( \'add_meta_boxes_page\', function( \\WP_Post $post ) {

    if ( 62 === (int) $post->ID ) {
        add_meta_box( \'contact_meta11\',\'Social icons\',\'social_icon\',\'page\',\'normal\',\'high\' );
    }
});

function social_icon( \\WP_Post $post ) {

}
注意:在我的示例中,我写道\\WP_Post, 不仅仅是WP_Post, 因为该类存在于全局namespace. 我希望您在代码中使用自己的名称空间。在这种情况下,您必须像我一样编写它,因为其他明智的PHP会尝试在您的命名空间中找到类,但失败了。

结束

相关推荐

获取Metabox复选框值有问题

我有一个自定义的帖子类型,附带两个元框:$offerPrice = isset( $productValuesl[\'offer_box\'] ) ? esc_attr( $productValuesl[\'offer_box\'][0] ) : \'\'; $offer = isset( $productValuesl[\'is_offered\'] ) ? esc_attr( $productValuesl[\'is_offered\'][0] ) : \'\'; &