0

我正在尝试创建一个元框,它应该很简单,但我弄错了。它与旅游自定义帖子有关,并添加了该旅游的价格:

所以最初我创建了这个自定义帖子类型(这有效):

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);

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

谢谢

4

2 回答 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函数将更新帖子元或创建它,如果它不存在,所以不要打扰 usind add_post_meta

于 2013-06-18T11:47:15.570 回答
0

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

function save_tours_meta($tour_id, $tour) {

但你正在使用 (eg) $post->ID$post在这种情况下,不是全局变量,而是函数参数。尝试使用$tour->ID或只是$tour_id代替。

其他一些(不相关的)事情:

  1. 您可以调用update_post_meta()它,如果它不存在,它将添加密钥,因此您可以删除您的if语句(只是减少代码行)。
  2. 您的“修订”检查应该返回帖子 ID(并且可以移到您的循环之外)
于 2013-06-18T11:53:42.607 回答