Метабоксы в WordPress, удаление стандартных и добавление собственных

В основном метабоксы в WordPress нужны для удобства (ну кроме стандартных разумеется), потому что все настройки, которые вы можете добавить в собственном метабоксе, можно заменить использованием произвольных полей.

remove_meta_box() — удаление метабоксов

remove_meta_box( $id, $page, $context );
  • $id (строка)
    идентификатор метабокса, его можно найти в исходном коде странице, чуть ниже я перечислю айдишники всех стандартных метабоксов.
  • $page (строка)
    тип постов, на странице создания/редактирования которых нужно удалить метабокс, например post, page.
  • $context (строка)
    расположение метабокса, например normal, advanced или side

Простая вставка этой функции куда-либо не прокатит, поэтому привожу пример:

/*
 * удаляем со страницы редактирования постов метабокс с рубриками и цитатой
 */
function remove_category_div() {
	remove_meta_box( 'categorydiv' , 'post' , 'side' ); // рубрики
	remove_meta_box( 'postexcerpt' , 'post' , 'normal' ); // цитата
}
add_action( 'admin_menu' , 'remove_category_div' );

Код вставлять в functions.php текущей темы.

Описание стандартных метабоксов в WordPress

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

  • commentstatusdiv — настройки обсуждения,
    метабокс commentstatusdiv
  • commentsdiv — отображает комментарии к текущему посту,
    метабокс commentsdiv в WordPress
  • slugdiv — ярлык записи,
    slugdiv метабокс
  • revisionsdiv — редакции,
    метабокс с редакциями, revisionsdiv
  • authordiv — автор записи,
    authordiv метабокс
  • postcustom — добавление/редактирование произвольных полей,
    postcustom, метабокс произвольных полей
  • postexcerpt — цитата,
    postexcerpt, метабокс цитаты
  • trackbacksdiv — обратные ссылки,
    метабокс trackbacksdiv в WordPress
  • categorydivсписок рубрик,
    categorydiv, метабокс с рубриками
  • tagsdiv-post_tag — метки,
    tagsdiv-post_tag
  • postimagediv — миниатюра записи,
    postimagediv, миниатюра записи
  • pageparentdiv — метабокс с выбором родительской страницы и шаблона страниц,
    pageparentdiv, атрибуты страницы
  • submitdiv — блок с кнопкой «опубликовать».
    submitdiv, метабокс в WordPress

Способы добавления метабоксов

register_post_type()

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

В примере перечислено лишь минимум необходимых параметров, но он все равно рабочий.

function true_register_post_type_example(){
	$args = array(
		'hierarchical' => true,
		'show_ui' => true, 
		/*
		 * присвоив таксономию для поста, мы автоматически подключаем метабокс этой таксономии
		 */
		'taxonomies' => array('category'),
		/*
		 * а теперь прописываем уже сами названия метабоксов,
		 * названия для register_post_type() и для remove_meta_box() будут отличаться!!
		 */
		'supports' => array( 'title', 'editor' )
		/*
		 * Возможные варианты содержимого массива "supports":
		 *
		 * title - заголовок,
		 * editor - редактор,
		 * author - автор записи,
		 * thumbnail - миниатюра записи,
		 * excerpt - поле для цитаты,
		 * trackbacks - обратные ссылки,
		 * custom-fields - произвольные поля,
		 * comments - комментарии,
		 * revisions - редакции,
		 * page-attributes - атрибуты поста, только при 'hierarchical' => true
		 *
		 */
	);
	register_post_type('truepost', $args);
}
 
add_action( 'init', 'true_register_post_type_example' );

register_taxonomy_for_object_type()

Функция приписывает таксономию к уже созданному типу записей, а значит, добавляется и метабокс:

register_taxonomy_for_object_type($taxonomy, $object_type);
  • $taxonomy (строка) (обязательное)
    название таксономии, например post_tag,
  • $object_type (строка) (обязательное)
    тут укажите тип поста, для которого нужно присвоить таксономию, например post, page, game;

Эту функцию тоже просто так не заюзать, поэтому пример:

function true_additional_taxonomies(){
	register_taxonomy_for_object_type('post_tag', 'truepost');
}
 
add_action( 'init', 'true_additional_taxonomies' );

add_post_type_support()

Позволяет добавить какой-нибудь из стандартных боксов.

add_post_type_support( $post_type, $supports )
  • $post_type (строка) (обязательное)
    тип поста (максимум 20 символов кстати),
  • $supports (строка|массив)
    названия стандартных метабоксов, которые перечислены двумя примерами выше;
function add_some_std_metaboxes() {
	add_post_type_support('game', 'excerpt'); // цитата
	add_post_type_support('truepost', array('excerpt', 'thumbnail')); // цитата и миниатюра
}
 
add_action('init', 'add_some_std_metaboxes');

add_meta_box()

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

add_meta_box($id, $title, $callback, $post_type, $context, $priority, $args);
  • $id (строка) (обязательное)
    HTML-атрибут id для блока div будущего метабокса,
  • $title (строка) (обязательное)
    заголовок,
  • $callback (функция) (обязательное)
    функция которая будет заполнять метабокс, нужно указать название функции в виде строки,
  • $post_type (строка) (обязательное)
    тип записей,
  • $context (строка)
    в какой части страницы вставить метабокс (normal, side, advanced), по умолчанию — advanced,
  • $priority (строка)
    приоритет, чем он выше, тем ближе к верхней части страницы будет располагаться метабокс, (high, core, default или low), по умолчанию — default,
  • $args (массив)
    аргументы для callback-функции.

В отличие от предыдущих способов, здесь добавление будет проходить в несколько этапов, посмотрим на примере:

<?php
/*
 * Этап 1. Добавление
 */
function true_meta_boxes() {
	add_meta_box('truediv', 'Настройки', 'true_print_box', 'post', 'normal', 'high');
}
 
add_action( 'admin_menu', 'true_meta_boxes' );
/*
 * также можно использовать и другие хуки:
 * add_action( 'add_meta_boxes', 'tr_meta_boxes' );
 * если версия WordPress ниже 3.0, то
 * add_action( 'admin_init', 'tr_meta_boxes', 1 );
 */
 
/*
 * Этап 2. Заполнение
 */
function true_print_box($post) {
	wp_nonce_field( basename( __FILE__ ), 'seo_metabox_nonce' );
	/*
	 * добавляем текстовое поле
	 */
	$html .= '<label>Заголовок <input type="text" name="seotitle" value="' . get_post_meta($post->ID, 'seo_title',true) . '" /></label> ';
	/*
	 * добавляем чекбокс
	 */
	$html .= '<label><input type="checkbox" name="noindex"';
	$html .= (get_post_meta($post->ID, 'seo_noindex',true) == 'on') ? ' checked="checked"' : '';
	$html .= ' /> Скрыть запись от поисковиков?</label>';
 
	echo $html;
}
 
/*
 * Этап 3. Сохранение
 */
function true_save_box_data ( $post_id ) {
	// проверяем, пришёл ли запрос со страницы с метабоксом
	if ( !isset( $_POST['seo_metabox_nonce'] )
	|| !wp_verify_nonce( $_POST['seo_metabox_nonce'], basename( __FILE__ ) ) )
        return $post_id;
	// проверяем, является ли запрос автосохранением
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
		return $post_id;
	// проверяем, права пользователя, может ли он редактировать записи
	if ( !current_user_can( 'edit_post', $post_id ) )
		return $post_id;
	// теперь также проверим тип записи	
	$post = get_post($post_id);
	if ($post->post_type == 'post') { // укажите собственный
		update_post_meta($post_id, 'seo_title', esc_attr($_POST['seotitle']));
		update_post_meta($post_id, 'seo_noindex', $_POST['noindex']);
	}
	return $post_id;
}
 
add_action('save_post', 'true_save_box_data');

В итоге на странице редактирования поста получаем вот такой метабоксик:

собственный метабокс с настройками в вордпресс

Код можно вставить прямо в таком виде в functions.php — и всё будет работать, если конечно у вас нет функций, названия которых совпадают с моими.

Добавление метабоксов с использованием класса

На самом деле это просто потрясающая штука!

  • достаточно один раз описать класс и затем сколько угодно использовать его для добавления метабоксов на сайте,
  • не придется каждый раз париться по поводу HTML полей ввода, как в случае с функцией add_meta_box(),
  • все, что потребуется для создания нового метабокса — добавить несколько параметров в массив;

А теперь у меня для вас подарок! Уже готовый класс со всеми необходимыми типами полей.

Расскажу, как его использовать в двух шагах. Первый шаг — скопируйте к себе следующий блок с кодом. Если не знаете куда его засунуть — суйте в functions.php, не ошибетесь.

<?php
class trueMetaBox {
	function __construct($options) {
		$this->options = $options;
		$this->prefix = $this->options['id'] .'_';
		add_action( 'add_meta_boxes', array( &$this, 'create' ) );
		add_action( 'save_post', array( &$this, 'save' ), 1, 2 );
	}
	function create() {
		foreach ($this->options['post'] as $post_type) {
			if (current_user_can( $this->options['cap'])) {
				add_meta_box($this->options['id'], $this->options['name'], array(&$this, 'fill'), $post_type, $this->options['pos'], $this->options['pri']);
			}
		}
	}
	function fill(){
		global $post; $p_i_d = $post->ID;
		wp_nonce_field( $this->options['id'], $this->options['id'].'_wpnonce', false, true );
		?>
		<table class="form-table"><tbody><?php
		foreach ( $this->options['args'] as $param ) {
			if (current_user_can( $param['cap'])) {
			?><tr><?php
				if(!$value = get_post_meta($post->ID, $this->prefix .$param['id'] , true)) $value = $param['std'];
				switch ( $param['type'] ) {
					case 'text':{ ?>
						<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
						<td>
							<input name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $this->prefix .$param['id'] ?>" value="<?php echo $value ?>" placeholder="<?php echo $param['placeholder'] ?>" class="regular-text" /><br />
							<span class="description"><?php echo $param['desc'] ?></span>
						</td>
						<?php
						break;							
					}
					case 'textarea':{ ?>
						<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
						<td>
							<textarea name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $this->prefix .$param['id'] ?>" value="<?php echo $value ?>" placeholder="<?php echo $param['placeholder'] ?>" class="large-text" /><?php echo $value ?></textarea><br />
							<span class="description"><?php echo $param['desc'] ?></span>
						</td>
						<?php
						break;							
					}
					case 'checkbox':{ ?>
						<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
						<td>
							<label for="<?php echo $this->prefix .$param['id'] ?>"><input name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $this->prefix .$param['id'] ?>"<?php echo ($value=='on') ? ' checked="checked"' : '' ?> />
							<?php echo $param['desc'] ?></label>
						</td>
						<?php
						break;							
					}
					case 'select':{ ?>
						<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
						<td>
							<label for="<?php echo $this->prefix .$param['id'] ?>">
							<select name="<?php echo $this->prefix .$param['id'] ?>" id="<?php echo $this->prefix .$param['id'] ?>"><option>...</option><?php
								foreach($param['args'] as $val=>$name){
									?><option value="<?php echo $val ?>"<?php echo ( $value == $val ) ? ' selected="selected"' : '' ?>><?php echo $name ?></option><?php
								}
							?></select></label><br />
							<span class="description"><?php echo $param['desc'] ?></span>
						</td>
						<?php
						break;							
					}
				} 
			?></tr><?php
			}
		}
		?></tbody></table><?php
	}
	function save($post_id, $post){
		if ( !wp_verify_nonce( $_POST[ $this->options['id'].'_wpnonce' ], $this->options['id'] ) ) return;
		if ( !current_user_can( 'edit_post', $post_id ) ) return;
		if ( !in_array($post->post_type, $this->options['post'])) return;
		foreach ( $this->options['args'] as $param ) {
			if ( current_user_can( $param['cap'] ) ) {
				if ( isset( $_POST[ $this->prefix . $param['id'] ] ) && trim( $_POST[ $this->prefix . $param['id'] ] ) ) {
					update_post_meta( $post_id, $this->prefix . $param['id'], trim($_POST[ $this->prefix . $param['id'] ]) );
				} else {
					delete_post_meta( $post_id, $this->prefix . $param['id'] );
				}
			}
		}
	}
}

Вставили и забыли, если не уверены, лучше в этом коде ничего не менять. Если не пашет — пишите в комментариях или мне на почте, лучше конечно в комментариях. На своем тестовом сайте я протестировал — всё ок.

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

Теперь шаг второй — создаем объекты и передаем им все параметры метабоксов.

В следующем блоке кода я создаю два метабокса, один по центру с несколькими полями, второй тоже по центру с одним полем — чекбоксом.

$options = array(
	array( // первый метабокс
		'id'	=>	'meta1', // ID метабокса, а также префикс названия произвольного поля
		'name'	=>	'Доп. настройки 1', // заголовок метабокса
		'post'	=>	array('post'), // типы постов для которых нужно отобразить метабокс
		'pos'	=>	'normal', // расположение, параметр $context функции add_meta_box()
		'pri'	=>	'high', // приоритет, параметр $priority функции add_meta_box()
		'cap'	=>	'edit_posts', // какие права должны быть у пользователя
		'args'	=>	array(
			array(
				'id'			=>	'field_1', // атрибуты name и id без префикса, например с префиксом будет meta1_field_1
				'title'			=>	'Текст', // лейбл поля
				'type'			=>	'text', // тип, в данном случае обычное текстовое поле
				'placeholder'		=>	'плейсхолдер, например введите email', // атрибут placeholder
				'desc'			=>	'пример использования текстового поля ввода в метабоксе', // что-то типа пояснения, подписи к полю
				'cap'			=>	'edit_posts'
			),
			array(
				'id'			=>	'terms',
				'title'			=>	'Чекбокс',
				'type'			=>	'checkbox', // чекбокс
				'desc'			=>	'пример чекбокса',
				'cap'			=>	'edit_posts'
			),
			array(
				'id'			=>	'textfield',
				'title'			=>	'Текстовое поле',
				'type'			=>	'textarea', // большое текстовое поле
				'placeholder'		=>	'сюда тоже можно забацать плейсхолдер',
				'desc'			=>	'пример использования большого текстового поля ввода в метабоксе',
				'cap'			=>	'edit_posts'
			),
			array(
				'id'			=>	'select1',
				'title'			=>	'Выпадающий список',
				'type'			=>	'select', // выпадающий список
				'desc'			=>	'тут тоже можно написать пояснение к полю, значения же задаются через ассоциативный массив',
				'cap'			=>	'edit_posts',
				'args'			=>	array('value_1' => 'Значение 1', '2' => 'Значение 2', 'Значение_3' => 'Значение 3' ) // элементы списка задаются через массив args, по типу value=>лейбл
			)
		)
	),
	array( // второй метабокс
		'id'	=>	'meta2',
		'name'	=>	'Доп. настройки 2',
		'post'	=>	array('post', 'page'), // не только для постов, но и для страниц
		'pos'	=>	'normal',
		'pri'	=>	'high',
		'cap'	=>	'edit_posts',
		'args'	=>	array(
			array(
				'id'			=>	'featured',
				'title'			=>	'На главную',
				'desc'			=>	'Отображать пост на главной странице',
				'type'			=>	'checkbox',
				'cap'			=>	'edit_posts'
			)
		)
	)
);
 
foreach ($options as $option) {
	$truemetabox = new trueMetaBox($option);
}

Вот скриншот получившихся метабоксов из админки, со страницы редактирования записи:

метабоксы в вордпресс

Обращение к метаданным поста/страницы

Понятное дело, что потом все эти настройки нужно как-то задействовать на сайте. Для этого отлично подойдет функция:

get_post_meta($post_id, $key, $single);
  • $post_id (целое) (обязательное)
    ID поста или страницы,
  • $key (строка) (обязательное)
    значение произвольного поля,
  • $single (логическое)
    если true — возвращает строку, false — массив, по умолчанию — false;

Пример использования — выведем значение произвольного поля meta1_field_1, то есть текстового поля из предыдущего примера:

echo get_post_meta($post->ID, 'meta1_field_1', true);

По мере совершенствования класса содержимое этого поста будет обновляться.

По теме

Комментарии 163

  • Денис27 мая 2012 в 01:05 #

    Супер! Спасибо за пост! Очень помог!

  • Максим3 декабря 2012 в 05:12 #

    Как сделать чтобы для текущего типа данных категории были отдельные и выводились только тут в нужном метабоксе. Видел на нескольких плагинах но пока не нашел как делать.

    • Миша3 декабря 2012 в 05:12 #

      когда регистрируешь категорию через register_taxonomy там можно указать тип данных, для которых её нужно включить, соответственно появится и метабокс.
      сорри, что поменял имя, прост спамерские имена мне тут ни к чему)

  • Dmitry18 января 2013 в 00:01 #

    Я как раз только научился делать самодельную WP тему, и у меня возник вопрос а как же реализовывать моменты настройки темы из админки. И вот он ответ - метабоксы. Thanks!

  • Анна22 января 2013 в 12:01 #

    Спасибо, за замечательный урок!

    А как можно сделать метабокс для выбора фона? У меня своя фоновая картинка в каждом посте, сейчас её можно задать через произвольное поле выбрав background-image и вставив ссылку на фон. Можно ли сделать такой метабокс?

    • Миша22 января 2013 в 13:01 #

      Пожалуйста)
      то есть с загрузкой изображения? да, можно

      • Анна22 января 2013 в 13:01 #

        А как это можно реализовать, в примере только текст, чекбокс, выпадающее меню. Нужно дописывать класс?

      • Миша22 января 2013 в 14:01 #

        да, верно, в wp темах можно найти готовое решение и приспособить его под этот класс
        1-й вариант - использовать это:

        <input type="file" />

        2-й вариант - сделать прикольный загрузчик на jQuery :)

  • Регина7 февраля 2013 в 19:02 #

    Здравствуйте! Уже все облазила, нигде не могу найти. Как можно к следующему коду

    //DIRECTIONS - TEXTAREA
       array(
        'name' => __( 'Инструкции', 'Instructions', 'culinary_recipes' ),
        'desc' => __( 'Пошаговая инструкция', 'Put each instruction in seaprate line.', 'culinary_recipes' ),
        'id'   => $prefix . 'instructions',
        'type' => 'wysiwyg',
        'options' => array(	'textarea_rows' => 5, ),
    ),

    добавить строку для вставки изображения и кнопку "+ещё", чтобы автоматически добавлялись новый строки. То есть нужно чтобы в итоге получилась пошаговая инструкция с фото? Помогите пожалуйста!!

    • Миша7 февраля 2013 в 21:02 #

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

      • Регина7 февраля 2013 в 21:02 #

        Спасибочки! Будемс ждать! А то тааак надо))

      • Регина22 февраля 2013 в 14:02 #

        Я сделала в своем редакторе постов метабокс с добавляющимися полями, правда пока без изображений. Но никак не могу отобразить текст из полей на сайте. Это тоже тяжело сделать?

      • Миша22 февраля 2013 в 16:02 #
        echo get_post_meta($post->ID, 'название_поля', true);

        так не выводятся?

      • Регина23 февраля 2013 в 01:02 #

        нет, почему то не выводится.

      • Миша23 февраля 2013 в 21:02 #

        Регина, добавляйтесь ко мне в скайп. я конечно в последнее время нечасто там появляюсь, но как буду в сети, обязательно постараемся вместе разобраться)

      • Регина24 февраля 2013 в 17:02 #

        ок. спасибо!

  • Валентин20 февраля 2013 в 21:02 #

    Доброго дня.
    Спасибо за отличный код.
    Я использую данные метабоксы ( последний вариант ) в медиафайлах.
    После заполнения нужных полей, данные просто не сохраняются, помогите пожалуйста решить проблему.
    Используя данные метабоксы в простых постах, данные сохраняются.

    • Миша21 февраля 2013 в 07:02 #

      медиафайлы это другой тип постов, что у вас в этой строчке?

      5
      
      'post'	=>	array('post'), // типы постов для которых нужно отобразить метабокс
      • Валентин21 февраля 2013 в 07:02 #

        'attachment'

      • Валентин21 февраля 2013 в 21:02 #

        имеется ввиду

        'post'	=>	array('attachment'),

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

      • Миша22 февраля 2013 в 16:02 #
        if ( !wp_verify_nonce( $_POST[ $this->options['id'].'_wpnonce' ], $this->options['id'] ) ) return;
        if ( !current_user_can( 'edit_post', $post_id ) ) return;
        if ( !in_array($post->post_type, $this->options['post'])) return;

        из функции save() можно попробовать удалить вот эти строчки.

  • Валентин22 февраля 2013 в 16:02 #

    из функции save() можно попробовать удалить вот эти строчки.

    не помогает :(

    • Валентин24 февраля 2013 в 17:02 #

      Может быть есть еще какие-то предположения ?

      • Миша25 февраля 2013 в 07:02 #

        попробуй эту статью) ток она на англ. net.tutsplus.com/tutorials/wordpress/creating-custom-fields-for-attachments-in-wordpress/

      • Валентин28 февраля 2013 в 21:02 #

        попробуй эту статью) ток она на англ. net.tutsplus.com/tutorials/wordpress/creating-custom-fields-for-attachments-in-wordpress/

        Не помогает ...
        и это тоже - http://indysite.ru/manuals/wordpress-metaboxes

        Данные не сохраняются как бы я с ними не боролся ... Но если делать такие поля для простых постов либо страниц все работает отлично.

        Только вот мне для галереи необходимы эти метабоксы именно в медиафайлах)

        • Миша1 марта 2013 в 06:03 #

          что-т у меня пока что нет идей)возможно я напишу об этом пост. итак, уточню, значит метабоксы на страницы редактирования аттачментов добавляются, но не сохраняют данные, верно?

        • Валентин1 марта 2013 в 06:03 #

          метабоксы на страницы редактирования аттачментов добавляются, но не сохраняют данные, верно?

          именно так ! перепробовал много разных версий добавления метабоксов, но никакой из них не сохраняет мета данные ! Только на страницах аттачментов !

  • VRS6 марта 2013 в 08:03 #

    Доброе утро).
    Я в админке (все посты) создала дополнительную колонку, там вывожу значение произвольного поля для каждой записи в виде поля для ввода данных.

    echo ''

    Но бьюсь с update_post_meta и никак не могу сделать, чтобы значение этого поля можно было бы обновить сразу из админки, без перехода в саму запись..

    Есть идеи как это можно сделать ))?

  • VRS6 марта 2013 в 15:03 #

    А можете дать ссылку на мануал по ajax у ВП?
    или может подскажете какой запрос необходимо передать? Пожааалуйста, *умоляющий смайлик* .. Всю ночь просидела, уже шарики за ролики заклинило.. Один раз получилось сохранить изменения, но присвоилась одна цена(последнего пункта) на ВСЕ товары, я в панике отменила изменения и потом так и не смогла восстановить как это сработало.. зато вручную сидела цены обратно перебивала :-/

    • Миша6 марта 2013 в 16:03 #

      боюсь, что в данном случае всё, что я могу - это поделиться этой ссылкой: codex.wordpress.org/AJAX_in_Plugins
      честно говоря, особо не приходилось юзать ajax через админку стандартными возможностями WordPress.
      Но уверен, это заслуживает отдельного поста)) если нужно, могу завтра в течение дня опубликовать)

    • Миша6 марта 2013 в 16:03 #

      подождете до завтра?

  • VRS19 сентября 2013 в 01:09 #

    А можно Вас еще побеспокоить?
    Понадобилось мне добавить в админке на страницу редактирования категории произвольное поле с загрузкой медиафайла. Код собрала такой

    <?php
    // добавляет вызов функции при инициализации административного раздела
    add_action('admin_init', 'category_custom_fields', 1);
    // функция расширения функционала административного раздела
    function category_custom_fields()
        {
            // добавления действия после отображения формы ввода параметров категории
            add_action('edit_category_form_fields', 'category_custom_fields_form');
            // добавления действия при сохранении формы ввода параметров категории
            add_action('edited_category', 'category_custom_fields_save');
        }
     
    function category_custom_fields_form($tag)
        {
            $t_id = $tag->term_id;
            $cat_meta = get_option("category_$t_id");
    ?>
            <tr class="form-field">
            <th scope="row" valign="top"><label for="extra1"><?php _e('Фон рубрики'); ?></label></th>
            <td>
     
     
    		<?php $args = array( 'wpautop' => 0  
        ,'media_buttons' => 1  
        ,'textarea_name' => 'Cat_meta[cat_title]' //нужно указывать!  
        ,'textarea_rows' => 1
    	,'teeny ' => 0
    	,'tinymce' => 0
    	,'quicktags' => 0
    );  
     
    $val = $cat_meta['cat_title'] ; 
     
    wp_editor( $val, 'editbackgroundcategory', $args ); ?>
    		</td>
            </tr>
            <?php
        }
     
    function category_custom_fields_save($term_id)
        {
            if (isset($_POST['Cat_meta'])) {
                $t_id = $term_id;
                $cat_meta = get_option("category_$t_id");
                $cat_keys = array_keys($_POST['Cat_meta']);
                foreach ($cat_keys as $key) {
                    if (isset($_POST['Cat_meta'][$key])) {
                        $cat_meta[$key] = $_POST['Cat_meta'][$key];
                    }
                }
                //save the option array
                update_option("category_$t_id", $cat_meta);
            }
        }

    Все прекрасно, можно выбрать картинку и даже сохранить.. но при сохранении перед кавычками автоматом ставится обратный слеш \
    Как можно это победить?

    • Arevapasht7 января 2014 в 02:01 #

      VRS, подскажите, пожалуйста, какой код выводит изображение на страницу категории?

  • VRS19 сентября 2013 в 02:09 #

    Сама нашла, у Вас же, wp_kses_stripslashes() :)))... Спасибо!

  • Станислав23 октября 2013 в 08:10 #

    Здравствуйте Михаил.

    Большое спасибо за отличные примеры, я хоть немного начал разбираться в использовании метабоксов.

    Есть еще такой вопрос: у меня в дополнительном поле содержится ссылка на изображение. Но в разных постах количество таких ссылок разное и их приходится добавлять, выбирая добавить поле в "Произвольных полях".

    Как можно в Вашем примере с "Доп. настройками" реализовать динамическое добавление определенного поля?

    • VRS23 октября 2013 в 10:10 #

      Станислав, если я правильно Вас поняла, то можно сделать как я чуть выше написала по добавлению в категории.
      У меня поле как редактор с кнопкой "Добавить медиафайл", я ее нажимаю и могу вставить в одно произвольное поле несколько картинок.

    • Миша26 октября 2013 в 09:10 #

      Добрый день, Станислав,
      есть два способа - попроще и посложнее
      1. Я так понимаю, что в посту надо вывести несколько (в разных постах - разное количество) изображений? для этого можно использовать механизм, описанный в этом посту: https://truewp.ru/blog/wordpress/slider-for-post-images.html
      2. есть способ посложнее, но он более наглядный и удобный уже впоследствии при использовании, но там нужно добавлять различные jQuery-скрипты и CSS-стили в админке. Думаю скоро напишу об этом пост.

  • Станислав23 октября 2013 в 11:10 #

    VRS, спасибо. Попробую разобраться в Вашем примере

  • Лёша6 января 2014 в 14:01 #

    Добрый день! Может быть Вы сумеете мне помочь? Вот этот код

    function apc_category() {
      global $current_user;
      get_currentuserinfo();
      $cats = unserialize(get_user_meta($current_user->ID,'personal_authors_category_meta',true));
      foreach($cats as $cat ){
        $c = get_category($cat);
        echo '<label><input name="post_category[]" type="checkbox"'.$checked.' value="'.$c->term_id.'"> '.$c->name .'</label><br />';
    }
    }
     
    // Displays a block with the personal categories user if the user is not an administrator.
    if (is_admin()) {
    function add_meta_box1() {
      if(!current_user_can('administrator')) {
      add_meta_box('apcatcat', __('metatitle', 'personal-authors-category'),'apc_category','post' ,'side','low');
    }
    }
    add_action('admin_menu', 'personal_authors_category_add_admin_pages');
    add_action( 'add_meta_boxes', 'add_meta_box1');
    }

    Выводит у меня на сайте метабокс рубрик, в которых может писать автор. Каждому автору свои рубрики. Беда только в том, что если автор по забывчивости не выберет рубрику для записи, она будет опубликована в рубрике блога по умолчанию, которая автору по идее должна быть недоступна. Как можно сделать проверку на то, что хотя бы одна рубрика в метабоксе выбрана?

    • Миша7 января 2014 в 08:01 #

      Добрый день!
      рассмотрим сразу цикл foreach, который начинается с 5й строчки:

      5
      6
      7
      8
      9
      10
      11
      12
      
      $i=1;
      foreach($cats as $cat ){
      	$checked = ($i == 1) ? ' checked="checked"' : '';
       	$c = get_category($cat);
      	echo '<label><input name="post_category[]" type="checkbox"'.$checked.' value="'.$c->term_id.'"> '.$c->name .'</label><br />';
      	$i++;
      }
      unset($i);
      • Лёша7 января 2014 в 14:01 #

        О! Большое спасибо. Не совсем то, что я имел ввиду, но так уже значительно лучше.

  • Сергей26 февраля 2014 в 17:02 #

    Добрый день!
    Как можно сделать созданный metabox обязательным для заполнения?

    • Миша1 марта 2014 в 09:03 #

      Добрый день!
      Сорри за долгий ответ.
      Наверн лучший вариант будет - наколдовать что-то с помощью jQuery.

  • Сергей19 марта 2014 в 10:03 #

    Спасибо, с jquery разберусь.
    А ещё такой вопрос: каким образом получить имя селекта.
    Вот так я задал селект:

    array(
                    'id'            =>  'residential',
                    'title'         =>  'Проживание',
                    'type'          =>  'select',
                    'cap'           =>  'edit_posts',
                    'args'          =>  array(
                                            'residential' => 'Жилое', 
                                            'non_residential' => 'Нежилое'
                                        ) 
                )

    Вот так забираю в шаблоне:

    $meta_kind = get_post_meta( $post->ID, 'estate_required_meta_kind', true);

    И вот так вывожу на странице:

    <div class="value"><?php echo $meta_kind ?></div>

    При этом получаю значение "value". По всей видимости "name" вообще в базу не пишется.
    Подскажите пожалуйста как это можно исправить ?

    • Миша20 марта 2014 в 22:03 #

      ну как вариант можно всё затолкать в value через какой-нибудь разделитель, например name:value а потом при получении данных мы можем разделить их через php-функцию explode()

      • Сергей21 марта 2014 в 12:03 #

        Спасибо, попробую.

      • Сергей28 марта 2014 в 17:03 #

        Сохранение селекта:

        function save($post_id, $post){
                if ( !wp_verify_nonce( $_POST[ $this->options['id'].'_wpnonce' ], $this->options['id'] ) ) return;
                if ( !current_user_can( 'edit_post', $post_id ) ) return;
                if ( !in_array($post->post_type, $this->options['post'])) return;
                foreach ( $this->options['args'] as $param ) {
                    if ( current_user_can( $param['cap'] ) ) {
                        if ( isset( $_POST[ $this->prefix . $param['id'] ] ) && trim( $_POST[ $this->prefix . $param['id'] ] ) ) {
                            if ($param['type'] == 'select') {
         
                                foreach($param['args'] as $val=>$name) {
                                    if ($val == trim($_POST[ $this->prefix . $param['id'] ])) {
                                        update_post_meta( $post_id, $this->prefix . $param['id'], trim($_POST[ $this->prefix . $param['id'] ]) . '%' . $name );
                                    }
                                }
                            } else {
                                update_post_meta( $post_id, $this->prefix . $param['id'], trim($_POST[ $this->prefix . $param['id'] ]) );
                            }
                        } else {
                            delete_post_meta( $post_id, $this->prefix . $param['id'] );
                        }
                    }
                }
            }

        Отображение в админке:

        case 'select':{ ?>
                                <th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
                                <td>
                                    <label for="<?php echo $this->prefix .$param['id'] ?>">
                                    <select name="<?php echo $this->prefix .$param['id'] ?>" id="<?php echo $this->prefix .$param['id'] ?>"><option></option><?php
                                        foreach($param['args'] as $val=>$name){
                                            ?><option value="<?php echo $val ?>"<?php echo ( $value == $val.'%'.$name ) ? ' selected="selected"' : '' ?>><?php echo $name ?></option><?php
                                        }
                                    ?></select></label><br />
                                    <span class="description"><?php echo $param['desc'] ?></span>
                                </td>
                                <?php
                                break;                          
                            }

        Ну и парсер для удобства:

        function parse_meta_select ( $val, $wdyw ) {
            $arr = explode("%", $val);
            if ($wdyw == "value") {
                return $arr[0];
            } else if ($wdyw == "name") {
                return $arr[1];
            } else {
                return $arr;
            }
        }
  • Артем21 марта 2014 в 17:03 #

    Подскажите как можно расширить class до добавления изображения.Нашел пример через add_meta_box()

    // image
    case 'image':
        $image = get_template_directory_uri().'/images/image.png'; 
        echo '<span class="custom_default_image" style="display:none">'.$image.'</span>';
        if ($meta) { $image = wp_get_attachment_image_src($meta, 'medium'); $image = $image[0]; }              
        echo    '<input name="'.$field['id'].'" type="hidden" class="custom_upload_image" value="'.$meta.'" />
                    <img src="'.$image.'" class="custom_preview_image" alt="" /><br />
                        <input class="custom_upload_image_button button" type="button" value="Choose Image" />
                        <small> <a href="#" class="custom_clear_image_button">Remove Image</a></small>
                        <br clear="all" /><span class="description">'.$field['desc'].'';
    break;

    но хотелось бы все же сделать это через class. Заранее спасибо.

  • benjamin27 марта 2014 в 05:03 #

    а как сделать чтобы checkbox был по умолчанию всегда включен?

    • Миша28 марта 2014 в 11:03 #

      поменять

      echo ($value=='on') ? ' checked="checked"' : ''

      на

      echo ($value=='off') ? '' : ' checked="checked"';

      при этом надо немного доработать сохранение значений, так, чтобы когда чекбокс не отмечен, ему присваивалось off

  • Николай2 июня 2014 в 00:06 #

    Миша подскажите, как при добавлении записи в редактор editor, эта же запись автоматически добавлялась в созданный мною add_meta_box.

    add_action( 'add_meta_boxes', 'my_custom_box' ); 
     add_action( 'save_post', 'saving_my_data' ); 
     
     function my_custom_box() { 
     add_meta_box( 'my_box', 'My Custom Field Editor Box', 'my_wp_editor' ); 
     } 
     
     function my_wp_editor( $post ) { 
     $field_value = get_post_meta( $post-&gt;ID, 'dp_video_url', false ); 
     wp_editor( $field_value[0], 'dp_video_url' ); 
     } 
     
     function saving_my_data( $post_id ) { 
     if ( isset ( $_POST['dp_video_url'] ) ) { 
     update_post_meta( $post_id, 'dp_video_url', $_POST['dp_video_url'] ); 
     } 
     
     }

    Спасибо.

    • Миша2 июня 2014 в 06:06 #

      То есть, если что-нибудь напечатать в основном редакторе, то после сохранение поста оно сохранится и в качестве значения поля в метабоксе? Я правильно понимаю?

      Ну можно в функцию сохранения добавить следующий код:

      $post = get_post( $post_id );
      update_post_meta( $post_id, 'content_duplication', $post->post_content );
      • Николай2 июня 2014 в 22:06 #

        Миша спасибо за ответ. Ну не совсем то, что нужно. Чтобы не засорять комментарии долгими изложениями, я отправил свой денежный вопрос Вам в контакты.

  • Артем4 июля 2014 в 13:07 #

    Миш, а есть ли способ регулировать очередность вывода метабоксов в админке WP? К примеру сразу после поля ТITLE.

    • Миша4 июля 2014 в 14:07 #

      Думаю тут есть два варианта:
      1) параметр $priority функции add_meta_box(),
      2) третий параметр функции add_action() (приоритет задействования хука), например можно попробовать поставить туда единицу.

      • Артем5 июля 2014 в 16:07 #

        Миш, может быть сталкивался с таким: как можно ограничить видимость метабокса в админ панели? ( метабокс отображается если пользователь админ).

  • Benjamin17 июля 2014 в 17:07 #

    Всем привет! Столкнулся на своем сайте с такой проблемкой...после добавления метабокса

    $options = array(
    	array( // первый метабокс
    		'id'	=>	'meta',
    		'name'	=>	'Дополнительные функции',
    		'post'	=>	array('post', 'page'), // не только для постов, но и для страниц
    		'pos'	=>	'normal',
    		'pri'	=>	'high',
    		'cap'	=>	'edit_posts',
    		'args'	=>	array(
    			array(
    				'id'			=>	'pimg',
    				'title'			=>	'Миниатюра на странице записи',
    				'desc'			=>	'Включить отображение миниатюры в полной версии страницы записи',
    				'type'			=>	'checkbox',
    				'cap'			=>	'edit_posts'
    			),
    			array(
    				'id'			=>	'social',
    				'title'			=>	'Социальные закладки в записи',
    				'desc'			=>	'',
    				'type'			=>	'checkbox',
    				'cap'			=>	'edit_posts'
    			),
    			array(
    				'id'			=>	'chtsh',
    				'title'			=>	'Читайте так же',
    				'desc'			=>	'',
    				'type'			=>	'checkbox',
    				'cap'			=>	'edit_posts'
    			)
    		)
    	)
    );
     
    foreach ($options as $option) {
    	$truemetabox = new trueMetaBox($option);
    }

    в ((functions.php)) перестали отображаться настройки самой темы, остается только кнопка "сбросить". при удалении данного кода из ((functions.php)) все настройки отображаются как и раньше.

    Помогите с решением проблемы, не хочется при настройке темы стирать код и потом снова его вставлять. Может проблема в самом коде??

  • VRS8 февраля 2015 в 01:02 #

    Спасибо, Миша!
    До этого юзала функциями.

    Кстати, таким кодом вывела в твоем классе стандартный wp_editor (мне он нужен, чтобы вставлять встроенную галерею в доп.поле)

    case 'textarea_editor':{  
     
     
    							$args = array( 'wpautop' => 1  
    								,'media_buttons' => 1  
    								,'textarea_name' =>  $this->prefix.$param['id']//нужно указывать!  
    								,'textarea_rows' => 15
    								,'teeny ' => 1
    								,'tinymce' =>  array('theme_advanced_buttons1' => '')
    								,'quicktags' => array('buttons' => ' ')
    							);  
     
     
     
    							wp_editor( $value, $this->prefix.$param['id'] , $args );	
    							echo '<br /><span class="description">'.$param['desc'].'</span>';  	
     
     
    						break;}
  • Виталий12 февраля 2015 в 17:02 #

    А если у меня уже есть произвольные поля с определенными названиями. Как мне сделать, чтобы они добавлялись через метабокс? Получается, если я создам метабокс с id=meta1 и произвольным полем с id=address, то, чтобы вызвать его мне нужно будет прописывать meta1_address, а у меня сейчас произвольное поле называется просто address.
    Как быть в этом случае?

    • Миша13 февраля 2015 в 08:02 #

      Можно просто подогнать префиксы, либо вообще их удалить из имён полей. Это не повлияет на работоспособность кода.

  • Дмитрий16 февраля 2015 в 10:02 #

    Добрый день, Михайл! Подскажите пожалуйста, как сделать так, чтобы в админке wp метабокс при указании $post_type (post) отображался не во всех постах, а только в постах необходимых рубрик?

    • Миша17 февраля 2015 в 07:02 #

      Добрый день!
      Используйте функцию in_category().

    • Миша17 февраля 2015 в 07:02 #

      Но тут конечно при создании нового поста метабокс никогда не будет отображаться — только после присвоения ему рубрики И сохранения.

      • Дмитрий17 февраля 2015 в 08:02 #

        Спасибо! Буду пробовать, жаль конечно, что мета боксы появятся лишь после сохранения.

  • VRS18 февраля 2015 в 22:02 #

    Миша, добрый вечер.
    Скажи, возможно ли изменить твой код, чтобы добавлялись поля с одинаковыми ключами, чтобы можно было вывести через цикл. Например, поле с размером товара, товаров несколько одной коллекции, в каждой их разное количество.

    • VRS19 февраля 2015 в 03:02 #

      Пришлось переписать код вывода и нумеровать ключи.
      Я где-то на зарубежных сайтах встречала пост, как через аякс или jquery вордпресса по клику на кнопке дублировать поля в метабоксе. Не подскажешь, где можно почитать, не получается найти, закладки сгорели вместе с ноутом =(.

  • VRS4 марта 2015 в 18:03 #

    Привет, Миш.
    Включила дебаг и при сохранении меню выпали ошибки

    Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'trueMetaBox' does not have a method 'save' in /home/=========/public_html/wp-includes/plugin.php on line 496

    и оно обрезалось до 90 пунктов.

    • Миша5 марта 2015 в 01:03 #

      Привет!
      Тут да, этот класс писался очень давно и не прогонялся через дебаг. Нуждается в оптимизации, согласен. Руки не дошли.

      • VRS5 марта 2015 в 02:03 #

        Решила проблему тем, что добавила проверку на пустое значение

        if ( !isset($_POST[$this->options['id'].'_wpnonce' ]) || !wp_verify_nonce( $_POST[ $this->options['id'].'_wpnonce' ], $this->options['id'] ) ) return;
      • VRS5 марта 2015 в 03:03 #

        А можешь еще подсказать

        if(!$value = get_post_meta($post->ID, $param['id'] , true)) $value = $param['std'];

        Что это за параметр 'std' ?

        • Миша5 марта 2015 в 11:03 #

          Ну типо значение по умолчанию.

          • Влад5 ноября 2015 в 17:11 #

            Привет Миша. Вопрос такой: правильно ли будет заменить

            textarea и input  value="<?php echo $value ?>"

            на

            textarea и input  value="<?php echo esc_attr($value) ?>"

            Просто там получается что неправильно отображаются данные из-за кавычек, если в метабокс вводить к примеру не просто какой-то текст, а теги с какими-либо атрибутами . Мне кажется нужно заменить на преобразователь, тогда ошибка исчезает, вот только точно я не знаю скажется ли это как-то негативно на работе или наоборот.
            P.S. - я плохо знаю php.

            • Миша6 ноября 2015 в 06:11 #

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

              И спасибо за вопрос.

              В данном случае правильнее такой вариант:

              <input type="text" value="<?php echo esc_attr( $value ) ?>" />
              <textarea><?php echo esc_html( $value ) ?></textarea>
  • Aamonorias1 апреля 2015 в 15:04 #

    Огромное спасибо за класс с метабоксом, лучей добра вам и литр чая!

    • Миша1 апреля 2015 в 16:04 #

      Пожалуйста! :) Я его давно делал, если найдёте какие-нибудь недоработки, пожалуйста, дайте знать.

      • Aamonorias14 апреля 2015 в 01:04 #

        Всё работает как часы :)
        Правда пришлось повозиться, зато много нового узнал :3

  • VRS19 мая 2015 в 02:05 #

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

    global $post, $comment; 
     
    if(!$value = get_post_meta($post->ID, $param['id'] , true)  || !$value = get_comment_meta($comment->ID, $param['id'] , true)    ) $value = $param['std'];

    Но тогда чекбокс отображается всегда включенным.

    Как бы сделать, чтобы флажок отображался правильно?

  • VRS3 июня 2015 в 06:06 #

    нет, что-то у меня не складывается ((...
    Я добавила

    add_action( 'edit_comment', array( &$this, 'save_comment' ), 1, 2 );

    в full

    global $post, $comment; 
    		$p_i_d = $post->ID;
    		$comment_id = $comment->comment_ID;
     
    ...
     
    if(!$value = get_comment_meta($comment->comment_ID, $param['id'] , true))  $value = $param['std'];
    if(!$value = get_post_meta($post->ID, $param['id'] , true))  $value = $param['std'];
    // пробовала добавлять условия по типу $this->options['post']

    и функцию сохранения

    function save_comment($comment) {
     
    		 if ( current_user_can( $param['cap'] ) ) {
    				if ( isset( $_POST[  $param['id'] ] ) && trim( $_POST[  $param['id'] ] ) ) {
    					update_comment_meta( $comment->comment_ID,  $param['id'], trim($_POST[  $param['id'] ]) );
    				} else {
    					delete_comment_meta( $comment->comment_ID,  $param['id'] );
    				}
    			}
    		update_comment_meta( $comment_id, 'its_type', $_POST['its_type'] ); 
     
    		}

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

    Подскажи, пожалуйста, в чем ошибка?

  • VRS3 июня 2015 в 14:06 #

    Ну чтобы не переписывать отдельно full для comment_meta.
    Эти строчки

    if(!$value = get_comment_meta($comment->comment_ID, $param['id'] , true))  $value = $param['std'];
    if(!$value = get_post_meta($post->ID, $param['id'] , true))  $value = $param['std'];

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

    Пробовала

    if(!$value = get_post_meta($post->ID, $param['id'] , true)  || !$value = get_comment_meta($comment->ID, $param['id'] , true)    ) $value = $param['std'];

    вообще и там, и там пусто.

    • Миша3 июня 2015 в 23:06 #

      А, то есть первым приоритетом - значение данных комментария, а вторым — поста?

      $value = get_comment_meta( $comment->comment_ID, $param['id'] , true);
      if( !$value ) {
      	$value = get_post_meta($post->ID, $param['id'] , true);
      }
      if( !$value ) {
      	$value = $param['std'];
      }
  • Евгений29 июля 2015 в 20:07 #

    Подскажите пожалуйста, а как к производьному полю добавить еще и html редактор?

    array(
      'id' => 'some_field', // атрибуты name и id без префикса, например с префиксом будет meta1_field_1
      'title'=> 'Описание', // лейбл поля
      'type' => 'textarea', // тип, в данном случае обычное текстовое поле
      'cap'=> 'edit_posts'
    )

    Спасибо..

    • VRS29 июля 2015 в 20:07 #

      Я чуть выше в комментариях писала =)

       
      case 'textarea_editor':{  
       
       
      							$args = array( 'wpautop' => 1  
      								,'media_buttons' =>   $param['media_buttons']
      								,'textarea_name' =>  $param['id']//нужно указывать!  
      								,'textarea_rows' => $param['textarea_rows']
      								,'teeny ' => 1
      								,'tinymce' =>  array('theme_advanced_buttons1' => '')
      								,'quicktags' => array('buttons' => ' ')
      							);  
       
       
      							echo '<tr><th scope="row">' . $param['title'] . '</th><td>'; 
      							wp_editor( $value, $param['id'] , $args );	
      							echo '<br /><span class="description">'.$param['desc'].'</span></td></tr>';  	
       
       
      						break;}
      array(
      				'id'			=>	'slider_title', // атрибуты name и id без префикса, например с префиксом будет meta1_field_1
      				'title'			=>	'Заголовок слайда', // лейбл поля
      				'type'			=>	'textarea_editor', // тип, в данном случае обычное текстовое поле
      				'media_buttons'	=>	'0', 
      				'textarea_rows'	=>	'2', 
      				'placeholder'	=>	'', // атрибут placeholder
      				'desc'			=>	'', // что-то типа пояснения, подписи к полю
      				'cap'			=>	'edit_posts'
      			),
  • Олег26 октября 2015 в 16:10 #

    Как переопределить адрес поста при помощи произвольных полей? Спасибо

  • Роман30 октября 2015 в 22:10 #

    Доброго времени суток.
    Подскажите, пожалуйста, нубу что я делаю не так:
    Мне нужен всего 1 checkbox, результатом которого будет получение id поста, в котором он чекнут. Использую код, приведенный вами выше.

    /* Этап 1. Добавление */
    function true_meta_boxes() {
    	add_meta_box('truediv', 'Featured post', 'true_print_box', 'post', 'normal', 'high');
    }
    add_action( 'admin_menu', 'true_meta_boxes' );
    /* Этап 2. Заполнение */
    function true_print_box($post) {
    	wp_nonce_field( basename( __FILE__ ), 'seo_metabox_nonce' );
    	/* добавляем чекбокс */
    	$html .= '<label><input type="checkbox" name="featured"';
    	$html .= (get_post_meta($post->ID, 'show_post',true) == 'on') ? ' checked="checked"' : '';
    	$html .= ' /> Выводить пост на странице?</label>';
    	echo $html;
    }
    /* Этап 3. Сохранение */
    function true_save_box_data ( $post_id ) {
    	// проверяем, пришёл ли запрос со страницы с метабоксом
    	if ( !isset( $_POST['seo_metabox_nonce'] )
    	|| !wp_verify_nonce( $_POST['seo_metabox_nonce'], basename( __FILE__ ) ) )
            return $post_id;
    	// проверяем, является ли запрос автосохранением
    	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
    		return $post_id;
    	// проверяем, права пользователя, может ли он редактировать записи
    	if ( !current_user_can( 'edit_post', $post_id ) )
    		return $post_id;
    	// теперь также проверим тип записи	
    	$post = get_post($post_id);
    	if ($post->post_type == 'post') {
    		update_post_meta($post_id, 'show_post', $_POST['noindex']);
    	}
    	return $post_id;
    }
     
    add_action('save_post', 'true_save_box_data');
     
    $true_print_box=get_post_meta( $post->ID, 'truediv', true );
    echo $true_print_box;
    • Роман30 октября 2015 в 22:10 #

      Извините, провтыкал, вопрос в том, что значение checkbox не сохраняется при обновлении страницы, в результате ничего не выводится(

    • Миша31 октября 2015 в 08:10 #

      1 checkbox, результатом которого будет получение id поста, в котором он чекнут.

      Доброго времени. Что-то недопонял задачу.

      • Роман2 ноября 2015 в 12:11 #

        Мне нужно на странице редактирования поста в админке добавить checkbox, если он checked, то на главной будет выводиться данный пост.

        • Миша4 ноября 2015 в 09:11 #
          1. Делаете самый обычный чекбокс со значением on, допустим у него атрибут name будет featured.
          2. Затем в параметрах цикла на главной странице указываете meta_key равный featured и meta_value равынй on.
          • Роман4 ноября 2015 в 15:11 #

            Я вроде так и сделал, взяв кусок кода приведенный Вами выше, но в админке не сохраняется "флажок" чекбокса, после того, как я сохраняю изменения.

            • Миша5 ноября 2015 в 07:11 #

              Если проблема еще актуальна, напишите мне доступ к сайту по email или вк, гляну и поправлю.

  • VRS8 декабря 2015 в 09:12 #

    Миша, доброе утро.
    Пытаюсь приспособить твой класс. Дописала еще один вариант

    case 'text_dinamic':{ ?>
     
    						<script type="text/javascript">
    									jQuery(document).ready(function($) {
    									$('#add-row').on('click', function() {
    									var inin = $(this).parents('tr');	
    									var row = $('.empty-row.screen-reader-text').clone(true);
    									row.removeClass('empty-row screen-reader-text');
    									row.insertBefore(inin);
    									return false;
    									});
    									$('.remove-row').on('click', function() {
    									$(this).parents('tr').remove();
    									return false;
    									});
    									});
    						</script>
     
    						<tr class="empty-row screen-reader-text"><th scope="row"><a class="button remove-row" href="#">-</a> <label for="<?php echo $param['id'] ?>"><?php echo $param['title'] ?></label></th>
    						<td>
    							<input name="<?php echo $param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $param['id'] ?>" value="" placeholder="<?php echo $param['placeholder'] ?>" class="regular-text" /><br />								
    						</td></tr>
     
    						<tr class="<?php echo $param['id'] ?>"><th scope="row"><a class="button remove-row" href="#">-</a> <label for="<?php echo $param['id'] ?>"><?php echo $param['title'] ?></label></th>
    						<td>
    							<input name="<?php echo $param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $param['id'] ?>" value="<?php echo $value ?>" placeholder="<?php echo $param['placeholder'] ?>" class="regular-text" /><br />
    						</td></tr>
     
    						<tr>
    							<td colspan="2">
    								<a id="add-row" class="button" href="#">Добавить</a>
    							</td>
    						</tr>
     
    						<?php
    						break;							
    					}

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

    • Семён11 января 2016 в 16:01 #

      name у input'a сделать массивом добавив [] то есть

      name="<?php echo $param['id'] ?>[]"

      Однако необходимо будет полностью изменить вывод - цикл написать для вывода всех значений.

  • VRS8 декабря 2015 в 09:12 #

    а да...
    и как выводить все уже существующие значения поля с этим ключом =)

  • Егор21 декабря 2015 в 17:12 #

    Здравствуй, Миша. У меня такая тема, собираю сейчас сайтик, задумка добавления своего изображения вместо шапки сайта для каждой страницы индивидуально..

    Я сделал, чтобы custom-header.php выводил заданное изображение только на главной.
    И добавил возможность прикрепления своей якобы шапки (на самом деле это часть страницы). А визуально изображение заменяет шапку.

    Вобщем добавил дополнительно, помимо миниатюры выбор еще одной миниатюры. В редакторе.

    if (class_exists('PageHeaderBanner')) {
     
    new PageHeaderBanner(array(
    'label' => 'Header Image',
    'id' => 'myheader-image',
    'post_type' => 'page'
     
     ) );
     
     }

    Теперь не могу разобраться, как можно кроме страниц в массив еще и записи вставить чтобы было и в записях и в страницах.

    'post_type' => 'post'

    Получается что нужно выбирать, либо пост, либо страницы.

  • Егор21 декабря 2015 в 18:12 #
           if (class_exists('PageHeaderBanner')) {
                $types = array('post', 'page', 'my_post_type');
                foreach($types as $type) {
                    new PageHeaderBanner(array(
                        'label' => 'Secondary Image',
                        'id' => 'secondary-image',
                        'post_type' => $type
                        )
                    );
                }
            }

    Все, догнал как передать в массив и страницы и записи.

  • Семён7 января 2016 в 13:01 #

    Выдаёт нотисы если не задавать std.
    Перед свитчем и проверкой этого std вставить бы

    if (!isset($param['std'])) { $param['std'] = ''; }
    • Миша9 января 2016 в 05:01 #

      Вставьте :) В данный момент код не идеален (конечно, он был написан мной ещё 4 года назад), в данный момент я работаю над новым.

      • Семён11 января 2016 в 16:01 #

        Ну я и написал для тех, кто использует :) И было бы здорово в будущей версии множественный выбор сделать))
        Решение (пусть и не идеальное) для текущего кода.

        case 'select_m':{ if (!$value) { $value = array(); } ?>
        	<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
        		<td>
        			<label for="<?php echo $this->prefix .$param['id'] ?>">
        			<select  name="<?php echo $this->prefix .$param['id'] ?>[]" id="<?php echo $this->prefix .$param['id'] ?>" multiple><?php
        			foreach($param['args'] as $val=>$name){
        				?><option value="<?php echo $val ?>"<?php echo ( in_array($val, $value) ) ? ' selected="selected"' : '' ?>><?php echo $name ?></option><?php
        			}
        			?></select></label><br />
        			<span class="description"><?php echo $param['desc'] ?></span>
        		</td>
        	<?php
        	break;
        }
  • Максим26 января 2016 в 13:01 #

    Привет! Подскажи, как расширить класс, а именно:
    У меня на сайте посты добавляются не только с бэкэнда, но и с фронтэнда. Как бы мне вызвать форму в лицевой части адмикни? Т.е. хочу код, что генерирует функция fill() вывести во фронтэнде.
    Я пока додумался до добавления в класс

    public static function fields_front() {
    	self::fill();
    }

    и вызываю ее на странице сайта через truemetabox::fields_front();
    Но явно этого мало... Подскажешь?

    • Миша27 января 2016 в 09:01 #

      Привет!

      Но явно этого мало...

      а конкретней — это что-нибудь дало?

      • Максим31 января 2016 в 14:01 #

        Блин. На самом деле чет нифига толком не дало(( Просто убрались ошибки и если в функцию fill() к примеру вставить обычное echo - то он покажет его содержимое.
        Кстати, слушай, вот чего точно в классе не хватает, так это загрузки файлов!
        Вот ты уже отдельно подобное показывал https://truewp.ru/blog/wordpress/uploader-metabox-option-pages.html
        это как-то бы прикрутить сюда (в твой класс)!
        Причем неплохо бы реализовать возможность, чтобы линки лежали в одном произвольном поле. Чтобы картинок неограниченное количество грузить. Тут вот что-то нашел, но чет не смог прикрутить к твоему классу http://onwp.ru/question/kak-sdelat-blok-dlya-zagruzki-izobrazhenij-v-adminke

        А еще я в твой класс добавил 1 параметр.
        <tr class="">
        Это удобно, т.к бывают случаи, когда нужно делать зависимости. Т.е. в первом доп-поле к примеру у нас селектор, выбор которого влияет на отображение других допполей. (чтоб не все выводить, а нужные). И тогда как-раз за классы удобно цепляться.

        PS Сделай плиз в классе возможность подгружать файлы! Это пожалуй, самая важная штука, которой не хватает!

        • Миша2 февраля 2016 в 08:02 #

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

          • Максим2 февраля 2016 в 15:02 #

            А можешь пока то-что есть показать? Я может сам допилить смогу подргузку... а то оч надо... т.к. твоим классом очень удобно пользоваться и ради подгрузки от него отказываться не охота... а до конца месяца - это очень долго(( я понимаю, что у тебя работы куча и времени нет... мне б хоть кусочек начального кода, чтоб понять с какой стороны подойти...

            • Миша3 февраля 2016 в 09:02 #

              только это :)

              • Максим4 февраля 2016 в 11:02 #

                А вот знаешь какая трабла. А как wp_enqueue_media() к старницам подлкючить? Стоит Т.е. если к примеру подгрузку картинок переключить на page - все, не пашет! Т.е. метабокс добавляется, но на этом все... т.е. wp_enqueue_media() только для записей работает. А как же быть со страницами?

                • Миша5 февраля 2016 в 11:02 #

                  Странно, по идее, если выполнить все инструкции из той статьи, то должно помочь. У меня работает :)

                  • Максим5 февраля 2016 в 14:02 #

                    и с произвольными типами постов тоже работает? Там же вроде в мануале самой функции написано, что если без параметров, то ток для записей работает wp_enqueue_media() , если добавляем параметр - то тогда id страниц, но я так понял, что конкретных страниц, а не всех.
                    Т.е. если я напишу wp_enqueue_media( array( 'post' => 5 ) );
                    то медиа скрипты подгрузятся для всех записей и для страницы с id=5. А если мне нужны все страницы (вновь создаваемые, id неизвестен) ? А если произвольный тип страниц? или я может что-то неверно понял.

                  • Максим5 февраля 2016 в 16:02 #

                    PS Хотел еще спросить - а разве нужен нам в классе verify_nonce если он у нас заточен под фронтэнд.
                    Может достаточно вынести в отдельный файл и прописать

                    if ( ! defined('ABSPATH') ) { exit; }

                    ведь в админку то оп идее у нас левые люди не должны пролезать.... (просто дебаг ругается иногда)

                  • Максим5 февраля 2016 в 16:02 #

                    PPS дебаг срабатывает когда мы добавляем новую страницу.
                    Я попробовал добавить в функцию save это:

                    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE  ) return false;

                    Но видимо при создании нового поста срабатывает что-то еще.

  • Иван25 августа 2016 в 13:08 #

    Михаил, создал метабокс и вывел там два радиобаттона.

    $html1 .= '<input type="radio" name="importantarticles" value="yes">';
    $html1 .= '<input type="radio" name="importantarticles" value="no">';

    Я должен выбрать, добавлять статью в важные или нет. Но не совсем понятно, как можно получить значение именно радиобатаннов через

    get_post_meta

    и чтобы выбор не сбрасывался, после перезагрузки страницы.

    То есть если выбран первый, то добавлять, если второй то нет. Но это потом. Сначала нужно решить проблему выше. Помогите, пожалуйста.

    • Миша26 августа 2016 в 14:08 #

      Добый день, Иван!

      А для радио-кнопок всё работает так же, как и для текстовых полей, просто значения value полей фиксированные.

      • Иван26 августа 2016 в 19:08 #

        Спасибо за ответ. Что тогда не так делаю?

        Создаю новый метабокс:

        function register_metabox() {
        	add_meta_box( 'example_link', 'Ссылка на живой пример', 'display_example_link_meta_box', 'my_portfolio', 'normal', 'high' );
         
        	add_meta_box( 'important_articles', 'Добавить в важные посты?', 'display_important_articles_meta_box', 'post', 'normal', 'high' );
        }
        add_action( 'admin_init', 'register_metabox' );

        Потому вывожу два радиобатона:

        function display_important_articles_meta_box($post) {
        	wp_nonce_field( basename( __FILE__ ), 'meta_box_none' );
        	$html1 .= '<input type="radio" name="importantarticles" value="yes">';
        	$html1 .= "Конечно!";
        	$html1 .= '<input type="radio" name="importantarticles"' . get_post_meta($post->ID, 'important_articles', true) . '">';
        	$html1 .= "Нет, не надо";
         
        	echo $html1;
        }

        И сохраняю

        function true_save_box_data ( $post_id ) {
        	if ( !isset( $_POST['meta_box_none'] )
        	|| !wp_verify_nonce( $_POST['meta_box_none'], basename( __FILE__ ) ) )
                return $post_id;
         
        	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
        		return $post_id;
         
        	if ( !current_user_can( 'edit_post', $post_id ) )
        		return $post_id;
         
        	$post = get_post($post_id);
        	if ($post->post_type == 'my_portfolio') {
        		update_post_meta($post_id, 'important_articles', esc_attr($_POST['importantarticles']));
        	}
        	return $post_id;
        }
        add_action('save_post', 'true_save_box_data');

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

        PS. В параметрах к функциям вы передаете переменные $post и $post_id. Зачем?

        • Миша28 августа 2016 в 08:08 #

          На самом деле всё просто — неправильно используешь HTML-элемент радио-кнопки. Думаю проблему решит почитать про неё в каком-нибудь HTML-буке.

          Зачем получать значение, если оно и так известно?

          $html1 .= '<input type="radio" name="importantarticles"' . get_post_meta($post->ID, 'important_articles', true) . '">';

          Тут поможет функция checked(). Примерно как-то так:

          $html1 .= '<input type="radio" name="importantarticles" ' . checked( 'yes', get_post_meta($post->ID, 'important_articles', true), false) . '>';

          P.S. $post и $post_id передаются в функции, потому что они в них используются :O

          P.P.S. дай знать, если всё заработает, и сорри за задержку с ответом, дел полно в последнее время :)

          • Иван28 августа 2016 в 10:08 #

            Спасибо за ответ. Так не работает, однако если вот эту строчку:

            $html1 .= '<input type="radio" value="yes" name="importantarticles" ' . checked( 'yes', get_post_meta($post->ID, 'important_articles', true), false) . '>';

            Заменить на вот эту:

            $html1 .= '<input type="radio" value="yes" name="importantarticles" ' . checked( 'yes', 'yes', false) . '>';

            То есть через get_post_meta почему то не работает(. Не знаю, как исправить.

            И почему то не выводится значение радиобаттона вот так:

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

            Не подскажешь почему?

            • Миша28 августа 2016 в 22:08 #

              Могу подсказать алгоритм:

              1. Заглянуть в базу и проверить, сохраняется ли значение.
              2. Если сохраняется, то перед его получением добавить global $post;
              3. Если не сохраняется, то нужно в true_save_box_data() поискать проблему, в какой именно части кода у нас не то, что нужно, это можно сделать при помощи echo( $переменная ); exit;
  • Дмитрий20 сентября 2016 в 10:09 #

    А вариант, предложенный на generatewp.com/the-meta-box-generator/ , чем хуже? Я использую этот вариант, т.к. изначально с ним столкнулся. Есть в нем у меня проблема - при публикации поста автоматически создаются все пользовательские поля из метабокса, включая поля с пустыми значениями. подскажите пожалуйста как от этого избавиться и оставить сохранение только заполненных пользовательских полей?

  • Дмитрий20 сентября 2016 в 11:09 #

    эх... а то я боюсь жуткой нагрузки на сервер(, т.к. этих полей у меня очень много..

    • Миша21 сентября 2016 в 13:09 #

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

  • alex morozov2 февраля 2017 в 18:02 #

    Приветствую. Посдскажите, как добавить к метабоксу собственный id, чтобы потом его можно было в javascript использовать?

    • Миша3 февраля 2017 в 17:02 #

      Добрый вечер, у каждого метабокса есть свой ID, его можно глянуть в браузере в меню "Проинспектировать элемент".

  • alex morozov4 февраля 2017 в 00:02 #

    Добрый вечер, я не понимаю. при выводе во фронтенде мне надо указать id поста, правильно?
    get_post_meta( тут надо указать id поста, 'тут надо указать id поля', true )

    ВОПРОС: Как я могу указать id поста, если поле у меня для записи ( это поле "автор" и выводится оно в цикле , соответственно на странице audio-page.php у меня оно всего один раз. Как для каждого поста я могу его указывать?

  • alex morozov4 февраля 2017 в 18:02 #

    Снова требуется помощь. У меня есть метабокс с загрузчиком аудиофайла. Так вот, когда я вывожу его на сайт, тем же способом, что выводил текст, то выводится ссылка на файл, а как сделать, чтобы выводился плеер , ну как когда добавляешь медиафайл в пост?
    Спасибо, заранее.

  • alex morozov4 февраля 2017 в 21:02 #

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

    <?php 
        if ( get_post_meta( get_the_ID(), 'advanced_options_audio', true) ) {
            echo '<audio controls="zbplayer">
                    <source src="' . get_post_meta( get_the_ID(), 'advanced_options_audio', true ) . '" />
                    </audio>'; 
        }
    ?>
  • alex morozov4 февраля 2017 в 21:02 #

    "zbplayer" это я случайно написал, эксперементировал с тем как можно вывести плагин.

  • alex morozov5 февраля 2017 в 23:02 #

    Короче я со всем разобрался, теперь вопрос:
    в html верстке в коде, когда f12 нажимаешь id не отображается, а мне нужно чтобы там было class="" id="id метаполя"
    как решить этот вопрос?

    • Миша6 февраля 2017 в 07:02 #

      Не знаю, f12 не использую) Через контекстное меню "проинспектировать элемент" всё отлично.

  • alex morozov21 февраля 2017 в 22:02 #

    Добрый вечер! у меня возникла следующая проблема. Я делаю фотоальбомы, чтобы они выглядели "как в контакте". Так вот, там под названием фотоальбома при наведении появляется его описание если оно добавлена. Я сделал отдельный метабокс для описания альбома. Как я могу добавить html класс, чтобы при выводе данных они выводились в внутри этого класса. А если данных ( описания альбома ) нет, то и этого класса тоже бы не выводилось.

    • Миша22 февраля 2017 в 08:02 #

      Добрый вечер!
      Если я правильно понял, то:

      if( $opisanie )
      	echo '<div class="htmlclass">' . $opisanie . '</div>' ;
      • alex morozov22 февраля 2017 в 13:02 #

        Не очень понял. Я добавляю метабокс через класс, почти как у вас.

        class Desc_Meta_Box {
        	private $screens = array(
        		'fotoalbum',
        	);
        	private $fields = array(
        		array(
        			'id' => 'desc',
        			'label' => 'Описание фотоальбома',
        			'type' => 'textarea',
        		),
        	);
         
         
         
        	public function __construct() {
        		add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
        		add_action( 'save_post', array( $this, 'save_post' ) );
         
        	}
         
        	/**
        	 * Hooks into WordPress' add_meta_boxes function.
        	 * Goes through screens (post types) and adds the meta box.
        	 */
        	public function add_meta_boxes() {
        		foreach ( $this->screens as $screen ) {
        			add_meta_box(
        				'-',
        				__( 'Описание фотоальбома', 'fotoalbum_description' ),
        				array( $this, 'add_meta_box_callback' ),
        				$screen,
        				'side',
        				'high'
        			);
         
        		}
        	}
         
        	/**
        	 * Generates the HTML for the meta box
        	 * 
        	 * @param object $post WordPress post object
        	 */
        	public function add_meta_box_callback( $post ) {
        		wp_nonce_field( '__data', '__nonce' );
        		$this->generate_fields( $post );
        	}
         
        	/**
        	 * Generates the field's HTML for the meta box.
        	 */
        	public function generate_fields( $post ) {
        		$output = '';
        		foreach ( $this->fields as $field ) {
        			$label = '<label for="' . $field['id'] . '">' . $field['label'] . '</label>';
        			$db_value = get_post_meta( $post->ID, '__' . $field['id'], true );
        			switch ( $field['type'] ) {
        				case 'textarea':
        					$input = sprintf(
        						'<textarea id="%s" name="%s" rows="5">%s</textarea>',
        						$field['id'],
        						$field['id'],
        						$db_value
        					);
        					break;
        				default:
        					$input = sprintf(
        						'<input id="%s" name="%s" type="%s" value="%s">',
        						$field['id'],
        						$field['id'],
        						$field['type'],
        						$db_value
        					);
        			}
        			$output .= '<p>' . $label . '<br>' . $input . '</p>';
        		}
        		echo $output;
        	}
         
        	/**
        	 * Hooks into WordPress' save_post function
        	 */
        	public function save_post( $post_id ) {
        		if ( ! isset( $_POST['__nonce'] ) )
        			return $post_id;
         
        		$nonce = $_POST['__nonce'];
        		if ( !wp_verify_nonce( $nonce, '__data' ) )
        			return $post_id;
         
        		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        			return $post_id;
         
        		foreach ( $this->fields as $field ) {
        			if ( isset( $_POST[ $field['id'] ] ) ) {
        				switch ( $field['type'] ) {
        					case 'email':
        						$_POST[ $field['id'] ] = sanitize_email( $_POST[ $field['id'] ] );
        						break;
        					case 'text':
        						$_POST[ $field['id'] ] = sanitize_text_field( $_POST[ $field['id'] ] );
        						break;
        				}
        				update_post_meta(  $post_id, '__' . $field['id'], $_POST[ $field['id'] ]  );
        			} else if ( $field['type'] === 'checkbox' ) {
        				update_post_meta( $post_id, '__' . $field['id'], '0' );
        			}
        		}
        	}
        }
        new Desc_Meta_Box;

        И вывожу его на странице

        <?php echo get_post_meta( 537, '___desc', true );  ?>

        Как мне сюда прикрутить добавление класса?

  • alex morozov22 февраля 2017 в 20:02 #

    Сделал

    <?php echo '<div class="class" . 'get_post_meta( 537, '___desc', true )  . '</div>';  ?>

    Класс добаляется даже если поле пустое

  • alex morozov22 февраля 2017 в 21:02 #

    Ура, спасибо! Все-таки я разобрался ! Сделал:

    <?php
     
    $desc = get_post_meta( get_the_ID(), '__desc', true );
     
    if( $desc )
    	echo '<div class="description">' . $desc . '</div>' ;
     
    ?>
    • Миша23 февраля 2017 в 10:02 #

      Вы молодец :)

    • Дмитрий23 февраля 2017 в 11:02 #

      Так вы же изначально хотели вывести описание альбома при наведении на него курсора, то есть нужно было загнать $desc в title ? А в таком исполнении описание у вас будет выводится автоматом при наличии метаполя, без наведения.

  • alex morozov23 февраля 2017 в 15:02 #

    У меня какя задумка была. Я сделал стили для .description и описание появляется если оно есть. А есди нет то и стили, получается применять не к чему. В контакте это с помощью jquery сделано. Но мне сейчас некогда разбираться с этим. Сейчас все работает. Вот. пожалуйста, посмотрите, вроде получилось. В первом фотоальбоме есть блок описание, а во втором нет.
    http://piskarevskiyhram.ru/foto-i-video-arxiv

  • alex morozov23 февраля 2017 в 22:02 #

    А как можно вывести значение радиокнопки или чекбокса? задумка такая, вертикальная миниатюра поста должна в шаблоне отображаться не так как горизонтальная. Я придумал такой выход под выбором миниатюры в админке я сделал чекбокс , который надо отметить, если фотография вертикальная. И теперь хочу, чтобы в шаблоне у меня выводился дополнительный класс.

    <div class="img box-shadow-inner article-img  <?php echo get_post_meta( get_the_ID(), '_____vert', '0' ); ?>"</div>

    Вот, а у меня вместо этого выводится "page".
    Вот кусок кода functions.php

    switch ( $field['type'] ) {
    				case 'checkbox':
    					$input = sprintf(
    						'<input %s id="%s" name="%s" type="checkbox" value="vert">',
    						$db_value === 'vert' ? 'checked' : '',
    						$field['id'],
    						$field['id']
    					);
    					break;

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

phpjsHTMLCSSSQLПросто код
  Комментарии закрыты.