Произвольные поля в WordPress

Произвольные поля в вордпресс - шаг первый

Понравилась статья? Оставьте оценку:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(2 голоса, в среднем: 5 из 5)

Стандартный функционал произвольных полей в вордпрессе

Сегодня попробуем запилить произвольные метаполя к записи. Произвольные поля в wordpress — это вообще архиважный функционал, позволяющий добавить к посту (и не только) практически любые данные.

Первым делом включим отображение произвольных полей внутри поста:

custom-fields

 

Теперь внизу появился блок с произвольными полями. Добавим к посту произвольное поле «Подзаголовок»(subtitle) со значением «Это стандартная вордпресс запись»:

custom-fields-2

Произвольное поле добавлено — теперь его можно вывести в теме. Делается это так:

<h2><?php echo get_post_meta($post->ID, 'subtitle', true); ?></h2>

Теперь ясно как добавить произвольное поле к посту. Минус данного подхода — мы не можем создать поля типа «селект», «чекбокс» или «радиобокс» к примеру. К тому же каждый раз мы видим ключи метаполей («subtitle») и при заполнении можем ошибиться.

Расширенные произвольные поля.

В первой части статьи я добавлял произвольные поля с помощью стандартного функционала вордпресса. Такой подход хорош но не очень удобен пользователю. Теперь попробуем видоизменить админку таким образом, чтобы наши произвольные поля стали удобнее и функциональнее. В результате типы полей расширятся до select, checkbox, textarea, text input. Также объединим все наши поля в отдельный метабокс и научим вордпресс сохранять их.

Первым делом создадим массив, в котором опишем наши будущие метаполя.

$cs_meta_fields = array(  
    array(  
        'label' => 'Текстовое поле',  
        'desc'  => 'Описание для поля.',  
        'id'    => 'cs_text', // даем идентификатор.
        'type'  => 'text'  // Указываем тип поля.
    ),  
    array(  
        'label' => 'Большое текстовое поле',  
        'desc'  => 'Описание для поля.',  
        'id'    => 'cs_textarea',  // даем идентификатор.
        'type'  => 'textarea'  // Указываем тип поля.
    ),  
    array(  
        'label' => 'Чекбоксы (флажки)',  
        'desc'  => 'Описание для поля.',  
        'id'    => 'cs_checkbox',  // даем идентификатор.
        'type'  => 'checkbox'  // Указываем тип поля.
    ),  
    array(  
        'label' => 'Выпадающий список',  
        'desc'  => 'Описание для поля.',  
        'id'    => 'cs_select',  
        'type'  => 'select',  
        'options' => array (
            'one' => array (  
                'label' => 'Выбор 1',  // Название поля
                'value' => '1'  // Значение
            ),  
            'two' => array (  
                'label' => 'Выбор 2',  // Название поля
                'value' => '2'  // Значение
            ),  
            'three' => array (  
                'label' => 'Выбор 3',  // Название поля
                'value' => '3'  // Значение
            )  
        )  
    )  
);

Теперь создадим отдельный метабокс в админке для отображения наших произвольных полей.

// Добавляем дополнительное поле
function cs_meta_box() {  
    add_meta_box(  
        'cs_meta_box', // Идентификатор(id)
        'CS Meta Box', // Заголовок области с мета-полями(title)
        'display_cs_metabox', // Функция для отображения полей, каллбэк
        'post', // посттайп (page - страница, post-запись, или кастомный тип постов)
        'normal', 
        'high');
}  
add_action('add_meta_boxes', 'cs_meta_box'); // Запускаем функцию

Важно! Используйте уникальные идентификаторы для произвольных полей и уникальные названия функций. В нашем примере уникальность обеспечивается префиксом cs_

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

// Вызов метаполей  
function display_cs_metabox() {  
global $cs_meta_fields; // Обозначим наш массив с полями глобальным
global $post;  // Глобальный $post для получения id создаваемого/редактируемого поста
// Выводим скрытый input, для верификации.
echo '<input type="hidden" name="cs_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';  

    // Начинаем выводить таблицу с полями через цикл
    echo '<table class="form-table">';  
    foreach ($cs_meta_fields as $field) {  
        // Получаем значение если оно есть для этого поля 
        $meta = get_post_meta($post->ID, $field['id'], true);  
        // Начинаем выводить таблицу
        echo '<tr> 
                <th><label for="'.$field['id'].'">'.$field['label'].'</label></th> 
                <td>';  
                switch($field['type']) {  

                    // Текстовое поле
					case 'text':  
						echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" /> 
							<br /><span class="description">'.$field['desc'].'</span>';  
					break;

					// Зона Текста 
					case 'textarea':  
						echo '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea> 
							<br /><span class="description">'.$field['desc'].'</span>';  
					break;

					// Чекбокс  
					case 'checkbox':  
						echo '<input type="checkbox" name="'.$field['id'].'" id="'.$field['id'].'" ',$meta ? ' checked="checked"' : '','/> 
							<label for="'.$field['id'].'">'.$field['desc'].'</label>';  
					break;

					// Всплывающий список  
					case 'select':  
						echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';  
						foreach ($field['options'] as $option) {  
							echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';  
						}  
						echo '</select><br /><span class="description">'.$field['desc'].'</span>';  
					break;

                }
        echo '</td></tr>';  
    }  
    echo '</table>'; 
}

Остановимся чуть подробнее. Циклом пробегаем по нашему массиву с метаполями, и в зависимости от типа произвольного поля выводим html разметку text input, textarea, checkbox или select. Ничего сложного. Теперь метабокс отображается в админке, в нем выведены произвольные поля, осталось закодить сохранение произвольных полей. Для этого существует хук ‘save_post’ — на него повесим функцию сохранения.

// Функция сохранения
function save_cs_meta_fields($post_id) {  
    global $cs_meta_fields;  // Массив с нашими полями

    // проверяем наш проверочный код 
    if (!wp_verify_nonce($_POST['cs_custom_meta_box_nonce'], basename(__FILE__)))   
        return $post_id;  
    // Проверяем авто-сохранение 
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)  
        return $post_id;  
    // Проверяем права доступа  
    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
    foreach ($meta_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 foreach  
}  
add_action('save_post', 'save_cs_meta_fields'); // Запускаем функцию сохранения

Теперь при сохранении поста произвольные поля будут сохраняться, (или удаляться, если нет данных.)

Вывести наши произвольные поля можно точно так же, как и в первом случае — функцией get_post_meta, но есть некоторые нюансы. Для полей type=text и textarea — в метаполе будет храниться значение, все просто. Выводим это значение:

<?php echo get_post_meta($post->ID, 'field_name', true) ?>

Для полей типа <checkbox> будет храниться значение ‘on’, если чекбокс выбран, или ничего не будет храниться, если чекбокс не выбран. Поэтому вывести произвольное поле в этом случае можно примерно так:

<?php 
$checbox_value = get_post_meta($post->ID, 'field_name', true); 
if($checkbox_value){
  echo 'Чекбокс выбран';
} else{
  echo 'Чекбокс не выбран';
}
?>

Для поля типа <select> в метаполе будет сохранено value выбранного <option>, поэтому если у вас селект вида:

<select>
<option value='red' selected>Красный</option>
<option value='blue'>Синий</option>
</select>

и выбрано значение красный (red), то вывод будет таким:

switch($select_value){
	case 'red' :
	  echo 'Красный';
	  break;
	case 'blue' :
	  echo 'Синий';
	  break;
	default :
		echo 'Ничего не выбрано';
		break;
}

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

Присоединиться к обсуждению 2 комментария

Оставить комментарий