Статьи

Проводка через интерфейс: расширенная отправка

Сегодня мы продолжим нашу мини-серию по вставке постов через интерфейс, но в этой части мы будем исключительно изучать, как управлять пользовательскими мета-полями, которые мы можем иметь в нашем типе постов. Итак, давайте подготовимся и начнем!


Сейчас мы находимся в третьей части нашего мини-сериала, и если вы еще не прочитали две другие части, то я советую вам это сделать, потому что мы начнем с того места, где остановились. Наша цель после завершения этого мини-сериала — позволить пользователю отправлять посты через интерфейс, а также редактировать и отправлять пост в корзину; все без присутствия на панели управления WordPress. Эти методы могут использоваться как в теме, так и в плагине, и могут быть легко адаптированы для получения очень сложных и сложных представлений.

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

Так что откройте ваш любимый текстовый редактор и начнем!


Начнем с создания папки с именем include , в этой папке мы создадим файл с именем post-meta.php . Мы будем создавать наш собственный мета-блок внутри этого файла. Я буду проходить через это довольно быстро, но если вы хотите прочитать обо всех чудесах, которых вы можете достичь с помощью пользовательских мета-блоков, Тэмми Харт написал удивительную серию уроков под названием « Многоразовые пользовательские мета-боксы» .

Внутри нашего post-meta.php мы создадим префикс, чтобы гарантировать, что у нас есть уникальный идентификатор для всех наших полей, а также мы начнем с создания массива, в котором будет храниться вся наша информация, для создания собственного мета-блока. Следующий код предназначен для создания идентификатора для пользовательского мета-блока, установки заголовка, где будет отображаться мета-поле (какой тип записи) и какие поля у него будут:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Field Array
$prefix = ‘vsip_’;
 
$vsip_post_meta_box = array(
    ‘id’ => ‘vsip-post-meta-box’,
    ‘title’ => __(‘Custom Meta’, ‘framework’),
    ‘page’ => ‘post’,
    ‘context’ => ‘normal’,
    ‘priority’ => ‘high’,
    ‘fields’ => array(
        array(
            ‘name’ => __(‘Custom Input One: ‘, ‘framework’),
            ‘desc’ => __(‘Enter your custom meta 1’, ‘framework’),
            ‘id’ => $prefix.’custom_one’,
            ‘type’ => ‘text’
        ),
        array(
            ‘name’ => __(‘Custom Input Two: ‘, ‘framework’),
            ‘desc’ => __(‘Enter your custom meta 2’, ‘framework’),
            ‘id’ => $prefix.’custom_two’,
            ‘type’ => ‘text’
        ),
    )
);

Далее мы создадим наш мета-блок и сделаем это, создав функцию. Внутри этой функции мы будем использовать функцию WordPress: add_meta_box .

В следующем коде показано, как мы создали наш мета-блок, а также с помощью ловушки действия add_meta_boxes :

1
2
3
4
5
6
7
8
9
// Custom Meta Box
add_action( ‘add_meta_boxes’, ‘vsip_project_add_meta’);
 
function vsip_project_add_meta() {
    global $vsip_post_meta_box;
 
    add_meta_box($vsip_post_meta_box[‘id’], $vsip_post_meta_box[‘title’], ‘vsip_display_post_meta’, $vsip_post_meta_box[‘page’], $vsip_post_meta_box[‘context’], $vsip_post_meta_box[‘priority’]);
 
} // END OF Function: vsip_project_add_meta

Теперь, когда мы создали наш мета-блок, вместе со всеми полями, установленными с информацией, которую мы хотим сохранить, нам нужно отобразить наш мета-блок. Мы делаем это, создавая другую функцию с тем же именем, что и наш третий параметр в нашей функции add_meta_box . В нашем случае мы создаем функцию с именем: vsip_display_post_meta .

Следующий код получает каждое поле внутри нашего массива, которое содержит всю нашу информацию, проверяет тип поля и выводит правильный тип поля:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function vsip_display_post_meta() {
    global $vsip_post_meta_box, $post;
 
    // Use nonce for verification
    echo ‘<input type=»hidden» name=»vsip_meta_box_nonce» value=»‘, wp_create_nonce(basename(__FILE__)), ‘» />’;
 
    echo ‘<table class=»form-table»>’;
 
    foreach ($vsip_post_meta_box[‘fields’] as $field) {
 
        // get current post meta data
        $meta = get_post_meta($post->ID, $field[‘id’], true);
 
        switch($field[‘type’]) {
 
            // If Text
            case ‘text’:
 
                echo ‘<tr style=»border-top:1px solid #eeeeee;»>’,
                    ‘<th style=»width:25%»><label for=»‘, $field[‘id’], ‘»><strong>’, $field[‘name’], ‘</strong><span style=» display:block; color:#999; line-height: 20px; margin:5px 0 0 0;»>’.
                    ‘<td>’;
                echo ‘<input type=»text» name=»‘, $field[‘id’], ‘» id=»‘, $field[‘id’], ‘» value=»‘, $meta ? $meta : stripslashes(htmlspecialchars(( $field[‘std’]), ENT_QUOTES)), ‘» size=»30″ style=»width:75%; margin-right: 20px; float:left;»
 
                break;
 
        }
 
    }
 
    echo ‘</table>’;
 
} // END Of Function: vsip_display_post_meta

Мы создали наш пользовательский мета-блок и отобразили его содержимое. Все, что нам осталось сделать, — это сохранить данные, как только пользователь вставит содержимое для полей. Мы делаем это путем создания одной последней функции, которая будет правильно сохранять наши данные. Код выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Save Meta Data
add_action(‘save_post’, ‘vsip_post_save_data’);
 
function vsip_post_save_data($post_id) {
    global $vsip_post_meta_box;
 
    // verify nonce
    if (!isset($_POST[‘vsip_meta_box_nonce’]) || !wp_verify_nonce($_POST[‘vsip_meta_box_nonce’], basename(__FILE__))) {
        return $post_id;
    }
 
    // check autosave
    if (defined(‘DOING_AUTOSAVE’) && DOING_AUTOSAVE) {
        return $post_id;
    }
 
    // check permissions
    if (‘page’ == $_POST[‘post_type’]) {
        if (!current_user_can(‘edit_page’, $post_id)) {
            return $post_id;
        }
    } elseif (!current_user_can(‘edit_post’, $post_id)) {
        return $post_id;
    }
 
    foreach ($vsip_post_meta_box[‘fields’] as $field) {
        $old = get_post_meta($post_id, $field[‘id’], true);
        $new = $_POST[$field[‘id’]];
 
        if ($new && $new != $old) {
            update_post_meta($post_id, $field[‘id’], $new);
        } elseif (» == $new && $old) {
            delete_post_meta($post_id, $field[‘id’], $old);
        }
    }
 
} // END Of Function: vsip_post_save_data

Хорошо, я знаю, что мы прошли это очень быстро, но основное внимание в этом руководстве уделяется тому, как управлять пользовательской мета через внешний интерфейс. Теперь, когда все закончилось, и у нас есть настроенный мета-блок в наших сообщениях, мы продолжим рассказ о том, как вставлять поля в наш пост-вставку и редактировать пользовательские мета-поля.


Мы будем редактировать страницу вставки постов, чтобы компенсировать добавленные нами новые поля. Давайте откроем наш шаблон-insert-posts.php и вставим несколько дополнительных полей. Поскольку наши пользовательские мета-поля являются текстовыми полями, мы добавим в нашу форму два дополнительных поля ввода текста:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<fieldset>
 
    <label for=»customMetaOne»><?php _e(‘Custom Meta One:’, ‘framework’) ?></label>
 
    <input type=»text» name=»customMetaOne» id=»customMetaOne» value=»<?php if(isset($_POST[‘customMetaOne’])) echo $_POST[‘customMetaOne’];?>» class=»required» />
 
</fieldset>
 
<fieldset>
 
    <label for=»customMetaTwo»><?php _e(‘Custom Meta Two:’, ‘framework’) ?></label>
 
    <input type=»text» name=»customMetaTwo» id=»customMetaTwo» value=»<?php if(isset($_POST[‘customMetaTwo’])) echo $_POST[‘customMetaTwo’];?>» class=»required» />
 
</fieldset>

Нам нужно, чтобы, когда пользователь нажимал «Отправить», он вставлял пользовательскую мета-информацию в соответствующие поля. Чтобы сделать это, нам нужно использовать функцию WordPress: update_post_meta , эта функция позволяет нам обновлять update_post_meta поста, и мы можем обновлять мета поста только после того, как мы создали пост и имеем идентификатор.

Итак, мы пойдем туда, где мы используем функцию: wp_insert_post и чуть выше нашей ссылки перенаправления, где мы будем вставлять нашу собственную мету.

Следующий код выполняет наш тест, чтобы проверить, создали ли мы сообщение, а затем мы используем функцию update_post_meta и передаем post_id этой функции вместе с идентификатором поля, которое мы хотим обновить, и, наконец, значением из нашей формы, которое мы разместим в мета-поле:

1
2
3
4
5
6
7
8
9
if($post_id) {
    // Update Custom Meta
    update_post_meta($post_id, ‘vsip_custom_one’, esc_attr(strip_tags($_POST[‘customMetaOne’])));
    update_post_meta($post_id, ‘vsip_custom_two’, esc_attr(strip_tags($_POST[‘customMetaTwo’])));
 
    // Redirect
    wp_redirect(home_url());
    exit;
}

Это оно! Мы создали специальный мета-блок и обновили нашу форму публикации вставки, чтобы убедиться, что мы нацелены на эти поля, и они будут сохранены правильно. Далее мы перейдем к тому, как редактировать нашу пользовательскую мету.


Теперь нам нужно иметь возможность редактировать пользовательскую мету через внешний интерфейс, поэтому мы начнем с открытия нашего шаблона-edit-posts.php и вставки двух новых полей ввода, которые мы добавили в нашу форму публикации вставки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<fieldset>
 
    <label for=»customMetaOne»><?php _e(‘Custom Meta One:’, ‘framework’) ?></label>
 
    <input type=»text» name=»customMetaOne» id=»customMetaOne» value=»<?php if(isset($_POST[‘customMetaOne’])) echo $_POST[‘customMetaOne’];?>» class=»required» />
 
</fieldset>
 
<fieldset>
 
    <label for=»customMetaTwo»><?php _e(‘Custom Meta Two:’, ‘framework’) ?></label>
 
    <input type=»text» name=»customMetaTwo» id=»customMetaTwo» value=»<?php if(isset($_POST[‘customMetaTwo’])) echo $_POST[‘customMetaTwo’];?>» class=»required» />
 
</fieldset>

Затем нам нужно получить нашу собственную мета-запись определенного поста, мы делаем это с помощью функции WordPress: get_post_meta внутри нашего цикла WordPress. Прокрутите туда, где у нас есть наш WordPress Loop, и вставьте следующий код чуть ниже, где мы получили информацию для нашего заголовка и контента.

1
2
$custom_one = get_post_meta($current_post, ‘vsip_custom_one’, true);
$custom_two = get_post_meta($current_post, ‘vsip_custom_two’, true);

Теперь, когда у нас есть информация о пользовательской мета-записи, мы теперь выведем ее значения в поля ввода нашей формы. Следующий код является обновленной версией двух пользовательских мета-полей, которые мы вставили:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<fieldset>
 
    <label for=»customMetaOne»><?php _e(‘Custom Meta One:’, ‘framework’) ?></label>
 
    <input type=»text» name=»customMetaOne» id=»customMetaOne» value=»<?php echo $custom_one; ?>» class=»required» />
 
</fieldset>
 
<fieldset>
 
    <label for=»customMetaTwo»><?php _e(‘Custom Meta Two:’, ‘framework’) ?></label>
 
    <input type=»text» name=»customMetaTwo» id=»customMetaTwo» value=»<?php echo $custom_two; ?>» class=»required» />
 
</fieldset>

Как вы можете видеть из кода, который мы только что вставили, значения для обоих наших входных данных являются переменными нашей пользовательской мета, которую мы создали в нашем цикле WordPress, вы могли заметить, что он может выводить наши поля, но когда мы вносим изменения, никаких реальных обновления сделаны. Это потому, что мы не вставили код для обновления сообщения после того, как пользователь нажал кнопку обновления.

Точно так же, как мы добавляли нашу мета-запись при вставке новых публикаций, мы будем делать это внутри нашего шаблона редактирования, поэтому добавьте следующий код:

1
2
3
4
5
6
7
8
9
if($post_id) {
    // Update Custom Meta
    update_post_meta($post_id, ‘vsip_custom_one’, esc_attr(strip_tags($_POST[‘customMetaOne’])));
    update_post_meta($post_id, ‘vsip_custom_two’, esc_attr(strip_tags($_POST[‘customMetaTwo’])));
 
    // Redirect
    wp_redirect(home_url());
    exit;
}

Это оно! Мы сделали это! Теперь мы можем создать собственный мета-блок, вставить мету с постом вставки через внешний интерфейс и редактировать мета через внешний интерфейс.


Это часть 3 завершена, вы сделали это! Отлично, теперь вы можете вставлять посты, редактировать и удалять посты через интерфейс, а также обрабатывать любые ваши собственные мета-меты.

Это конец этой серии публикаций через интерфейс, и я рад, что вы остались со мной, пока мы проходили наше путешествие.

Я хотел бы сказать ОГРОМНОЕ спасибо за то, что вы потратили время на чтение моей серии уроков, надеюсь, это помогло. Пожалуйста, не стесняйтесь оставлять комментарии, и я сделаю все возможное, чтобы помочь и ответить на них. Вы всегда можете связаться со мной напрямую через мой сайт: www.VinnySingh.co или Twitter @VinnySinghUK .