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

Появляется фактическое окно, и информация отображается эхом. Однако это не спасает. Я не знаю, почему. Должно быть, это относится к моей последней функции, но я не понимаю, что происходит не так.

Спасибо


person David G    schedule 18.06.2013    source источник


Ответы (2)


Вам лучше упростить процесс сохранения следующим образом:

    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 будет обновлять метаданные сообщения или создавать его, если он не существует, поэтому не беспокойтесь об использовании add_post_meta.

person Strategio    schedule 18.06.2013

Я думаю, это ваши аргументы. Вы объявляете функцию как

function save_tours_meta($tour_id, $tour) {

но вы используете (например) $post->ID. $post в данном случае не глобальная переменная, а аргумент функции. Попробуйте вместо этого использовать $tour->ID или просто $tour_id.

Несколько других (не связанных) вещей:

  1. Вы можете вызвать update_post_meta(), и он добавит ключ, если он не существует, поэтому вы можете удалить свой оператор if (просто сократив количество строк кода).
  2. Ваша проверка «ревизии» должна возвращать идентификатор сообщения (и может быть перемещена за пределы вашего цикла)
person Hobo    schedule 18.06.2013