2013-06-18 20 views
0

我想创建一个元框,它应该很好,很容易,但我错了。它涉及到一个旅游自定义后,并加入价格为旅游:WordPress的 - 创建元框和保存

所以最初我创建这个自定义文章类型(这工作):

register_post_type('tours', 
      array(
       'labels' => array(
        'name' => __('Tours'), 
        'singular_name' => __('Tour'), 
        'add_new' => 'Add New Tour Instance', 
        'add_new_item' => 'Add New Tour Instance', 
        'edit' => 'Edit', 
        'edit_item' => 'Edit Tour Instance', 
        'new_item' => 'New Tour Instance', 
        'view' => 'View', 
        'view_item' => 'View Tour Instance', 
        'search_items' => 'Search Tour Instances', 
        'not_found' => 'No Tour Instances found', 
        'not_found_in_trash' => 'No Tour Instances found in Rubbish', 
        'parent' => 'Parent Tour Instance' 
       ), 
      'public' => true, 
      'supports' => array('title', 'editor', 'thumbnail'), 
      'taxonomies' => array(''), 
      //'menu_icon' => plugins_url('images/image.png', __FILE__), 
      'capability_type' => 'post', 
      'rewrite' => array("slug" => "tours") // Permalinks format 
      ) 
     ); 

然后,我创建盒子本身(这也工程):

add_action('admin_init', 'tour_meta'); 
     function tour_meta() { 
      add_meta_box(
       'tours_meta_box', 
       'Tour Price', 
       'display_tours_price_meta_box', 
       'tours', 
       'side', 
       'high' 
      ); 
     } 

现在,整体功能中,然后我试图让细节,并将其保存:

function display_tours_price_meta_box() { 
      global $post; 
      // Noncename needed to verify where the data originated 
      echo '<input type="hidden" name="tourmeta_noncename" id="tourmeta_noncename" value="' . 
      wp_create_nonce(plugin_basename(__FILE__)) . '" />'; 

      // Get the price data if its already been entered 
      $price = get_post_meta($post->ID, '_price', true); 
      echo 'Add the total cost for this tour here, do not include monetary characters like £ or $'; 
      echo '<input type="text" name="_price" ' . $price . '" class="widefat" />'; 
     } 
     function save_tours_meta($tour_id, $tour) { 
      if (!wp_verify_nonce($_POST['tourmeta_noncename'], plugin_basename(__FILE__))) { 
      return $post->ID; 
      } 
      // Is the user allowed to edit the post or page? 
      if (!current_user_can('edit_post', $post->ID)) 
       return $post->ID; 

      $tour_meta['_price'] = $_POST['_price']; 

      // Add values of $tour_meta as custom fields 
      foreach ($tour_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', 'save_tours_meta', 1, 2); 

出现实际框,并且信息被回显。但它不能保存。我没有模糊的原因。它必须与我最后的功能有关,但我不明白发生了什么问题。

感谢

回答

1

你应该更好地简化您的保存过程是这样的:

function save_tours_meta($post_id) { 
     if (!wp_verify_nonce($_POST['tourmeta_noncename'], plugin_basename(__FILE__)))  { 
     // You don't need to return anything 
     return; 
     } 
     // Is the user allowed to edit the post or page? 
     if (!current_user_can('edit_post', $post_id) && !isset($_POST['_price'])) 
      return; 

     // If you just have 1 value 
     update_post_meta($post_id, '_price', $_POST['_price']); 
    } 

就注意到update_post_meta功能将更新后间或创建它,如果它不存在所以不要打扰我们​​3210。

0

我认为这是你的观点。您声明函数为

function save_tours_meta($tour_id, $tour) { 

但您正在使用(例如)$post->ID。在这种情况下,$post不是全局变量,而是函数参数。请尝试使用$tour->ID或仅使用$tour_id

一对夫妇的其他(无关)的东西:

  1. 你可以调用update_post_meta(),它会添加键值,如果不存在的话,这样你就可以删除你if声明(只是减少的线码)。
  2. 您的“修订版”检查应该返回帖子ID(并且可以在您的循环之外移动)