В основном метабоксы в WordPress нужны для удобства (ну кроме стандартных разумеется), потому что все настройки, которые вы можете добавить в собственном метабоксе, можно заменить использованием произвольных полей.
remove_meta_box( $id, $page, $context );
Простая вставка этой функции куда-либо не прокатит, поэтому привожу пример:
/* * удаляем со страницы редактирования постов метабокс с рубриками и цитатой */ 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 текущей темы.
Для того, чтобы не нужно было париться и рыскать в коде, перечислю айдишники стандартных метабоксов.
Я думаю вы знаете про типы записей в вордпресс, так вот, для их создания используется эта самая функция. В ней же можно сразу и определить какие метабоксы данные тип будет поддерживать.
В примере перечислено лишь минимум необходимых параметров, но он все равно рабочий.
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($taxonomy, $object_type);
Эту функцию тоже просто так не заюзать, поэтому пример:
function true_additional_taxonomies(){ register_taxonomy_for_object_type('post_tag', 'truepost'); } add_action( 'init', 'true_additional_taxonomies' );
Позволяет добавить какой-нибудь из стандартных боксов.
add_post_type_support( $post_type, $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($id, $title, $callback, $post_type, $context, $priority, $args);
В отличие от предыдущих способов, здесь добавление будет проходить в несколько этапов, посмотрим на примере:
<?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 — и всё будет работать, если конечно у вас нет функций, названия которых совпадают с моими.
На самом деле это просто потрясающая штука!
А теперь у меня для вас подарок! Уже готовый класс со всеми необходимыми типами полей.
Расскажу, как его использовать в двух шагах. Первый шаг — скопируйте к себе следующий блок с кодом. Если не знаете куда его засунуть — суйте в 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'] ); } } } } }
Вставили и забыли, если не уверены, лучше в этом коде ничего не менять. Если не пашет — пишите в комментариях или мне на почте, лучше конечно в комментариях. На своем тестовом сайте я протестировал — всё ок.
Теперь шаг второй — создаем объекты и передаем им все параметры метабоксов.
В следующем блоке кода я создаю два метабокса, один по центру с несколькими полями, второй тоже по центру с одним полем — чекбоксом.
$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);
Пример использования — выведем значение произвольного поля meta1_field_1, то есть текстового поля из предыдущего примера:
echo get_post_meta($post->ID, 'meta1_field_1', true);
По мере совершенствования класса содержимое этого поста будет обновляться.
Супер! Спасибо за пост! Очень помог!
Как сделать чтобы для текущего типа данных категории были отдельные и выводились только тут в нужном метабоксе. Видел на нескольких плагинах но пока не нашел как делать.
когда регистрируешь категорию через register_taxonomy там можно указать тип данных, для которых её нужно включить, соответственно появится и метабокс.
сорри, что поменял имя, прост спамерские имена мне тут ни к чему)
Я как раз только научился делать самодельную WP тему, и у меня возник вопрос а как же реализовывать моменты настройки темы из админки. И вот он ответ - метабоксы. Thanks!
рад помочь))
Спасибо, за замечательный урок!
А как можно сделать метабокс для выбора фона? У меня своя фоновая картинка в каждом посте, сейчас её можно задать через произвольное поле выбрав background-image и вставив ссылку на фон. Можно ли сделать такой метабокс?
Пожалуйста)
то есть с загрузкой изображения? да, можно
А как это можно реализовать, в примере только текст, чекбокс, выпадающее меню. Нужно дописывать класс?
да, верно, в wp темах можно найти готовое решение и приспособить его под этот класс
1-й вариант - использовать это:
2-й вариант - сделать прикольный загрузчик на jQuery 🙂
Здравствуйте! Уже все облазила, нигде не могу найти. Как можно к следующему коду
добавить строку для вставки изображения и кнопку "+ещё", чтобы автоматически добавлялись новый строки. То есть нужно чтобы в итоге получилась пошаговая инструкция с фото? Помогите пожалуйста!!
Добрый вечер!
ну, для этого потребуется значительно доработать класс. вы не первая, кто меня об этом просит, возможно я допишу класс и либо обновлю прямо в этом посту, либо опубликую новый.
Спасибочки! Будемс ждать! А то тааак надо))
Я сделала в своем редакторе постов метабокс с добавляющимися полями, правда пока без изображений. Но никак не могу отобразить текст из полей на сайте. Это тоже тяжело сделать?
так не выводятся?
нет, почему то не выводится.
Регина, добавляйтесь ко мне в скайп. я конечно в последнее время нечасто там появляюсь, но как буду в сети, обязательно постараемся вместе разобраться)
ок. спасибо!
Доброго дня.
Спасибо за отличный код.
Я использую данные метабоксы ( последний вариант ) в медиафайлах.
После заполнения нужных полей, данные просто не сохраняются, помогите пожалуйста решить проблему.
Используя данные метабоксы в простых постах, данные сохраняются.
медиафайлы это другой тип постов, что у вас в этой строчке?
'attachment'
имеется ввиду
отображается все на странице медиафайла корректно, вот только данные не сохраняются. Пробовал как-то редактировать участок save, никак не получалось.
из функции save() можно попробовать удалить вот эти строчки.
не помогает 🙁
Может быть есть еще какие-то предположения ?
попробуй эту статью) ток она на англ. net.tutsplus.com/tutorials/wordpress/creating-custom-fields-for-attachments-in-wordpress/
Не помогает ...
и это тоже - http://indysite.ru/manuals/wordpress-metaboxes
Данные не сохраняются как бы я с ними не боролся ... Но если делать такие поля для простых постов либо страниц все работает отлично.
Только вот мне для галереи необходимы эти метабоксы именно в медиафайлах)
что-т у меня пока что нет идей)возможно я напишу об этом пост. итак, уточню, значит метабоксы на страницы редактирования аттачментов добавляются, но не сохраняют данные, верно?
именно так ! перепробовал много разных версий добавления метабоксов, но никакой из них не сохраняет мета данные ! Только на страницах аттачментов !
ок! мне уже самому интересно стало в этом разобраться) буду держать тебя в курсе.
Спасибо)
wordpress - forum
Вот) подсказали еще один вариант, все работает)
http://wordpress.stackexchange.com/questions/14500/custom-fields-for-attachments
ну понятно, значит по сути нужно было заменить
на
Доброе утро).
Я в админке (все посты) создала дополнительную колонку, там вывожу значение произвольного поля для каждой записи в виде поля для ввода данных.
echo ''
Но бьюсь с update_post_meta и никак не могу сделать, чтобы значение этого поля можно было бы обновить сразу из админки, без перехода в саму запись..
Есть идеи как это можно сделать ))?
Доброе утро) через ajax
А можете дать ссылку на мануал по ajax у ВП?
или может подскажете какой запрос необходимо передать? Пожааалуйста, *умоляющий смайлик* .. Всю ночь просидела, уже шарики за ролики заклинило.. Один раз получилось сохранить изменения, но присвоилась одна цена(последнего пункта) на ВСЕ товары, я в панике отменила изменения и потом так и не смогла восстановить как это сработало.. зато вручную сидела цены обратно перебивала :-/
боюсь, что в данном случае всё, что я могу - это поделиться этой ссылкой: codex.wordpress.org/AJAX_in_Plugins
честно говоря, особо не приходилось юзать ajax через админку стандартными возможностями WordPress.
Но уверен, это заслуживает отдельного поста)) если нужно, могу завтра в течение дня опубликовать)
подождете до завтра?
да-да! 🙂 буду премного благодарна 🙂
готово https://misha.agency/blog/wordpress/admin-ajax.html как раз взял пример, который, на мой взгляд, является ответом на ваш вопрос 🙂
А можно Вас еще побеспокоить?
Понадобилось мне добавить в админке на страницу редактирования категории произвольное поле с загрузкой медиафайла. Код собрала такой
Все прекрасно, можно выбрать картинку и даже сохранить.. но при сохранении перед кавычками автоматом ставится обратный слеш \
Как можно это победить?
VRS, подскажите, пожалуйста, какой код выводит изображение на страницу категории?
Сама нашла, у Вас же, wp_kses_stripslashes() :)))... Спасибо!
Здравствуйте Михаил.
Большое спасибо за отличные примеры, я хоть немного начал разбираться в использовании метабоксов.
Есть еще такой вопрос: у меня в дополнительном поле содержится ссылка на изображение. Но в разных постах количество таких ссылок разное и их приходится добавлять, выбирая добавить поле в "Произвольных полях".
Как можно в Вашем примере с "Доп. настройками" реализовать динамическое добавление определенного поля?
Станислав, если я правильно Вас поняла, то можно сделать как я чуть выше написала по добавлению в категории.
У меня поле как редактор с кнопкой "Добавить медиафайл", я ее нажимаю и могу вставить в одно произвольное поле несколько картинок.
Добрый день, Станислав,
есть два способа - попроще и посложнее
1. Я так понимаю, что в посту надо вывести несколько (в разных постах - разное количество) изображений? для этого можно использовать механизм, описанный в этом посту: https://misha.agency/blog/wordpress/slider-for-post-images.html
2. есть способ посложнее, но он более наглядный и удобный уже впоследствии при использовании, но там нужно добавлять различные jQuery-скрипты и CSS-стили в админке. Думаю скоро напишу об этом пост.
VRS, спасибо. Попробую разобраться в Вашем примере
Добрый день! Может быть Вы сумеете мне помочь? Вот этот код
Выводит у меня на сайте метабокс рубрик, в которых может писать автор. Каждому автору свои рубрики. Беда только в том, что если автор по забывчивости не выберет рубрику для записи, она будет опубликована в рубрике блога по умолчанию, которая автору по идее должна быть недоступна. Как можно сделать проверку на то, что хотя бы одна рубрика в метабоксе выбрана?
Добрый день!
рассмотрим сразу цикл foreach, который начинается с 5й строчки:
О! Большое спасибо. Не совсем то, что я имел ввиду, но так уже значительно лучше.
Добрый день!
Как можно сделать созданный metabox обязательным для заполнения?
Добрый день!
Сорри за долгий ответ.
Наверн лучший вариант будет - наколдовать что-то с помощью jQuery.
Спасибо, с jquery разберусь.
А ещё такой вопрос: каким образом получить имя селекта.
Вот так я задал селект:
Вот так забираю в шаблоне:
И вот так вывожу на странице:
При этом получаю значение "value". По всей видимости "name" вообще в базу не пишется.
Подскажите пожалуйста как это можно исправить ?
ну как вариант можно всё затолкать в value через какой-нибудь разделитель, например name:value а потом при получении данных мы можем разделить их через php-функцию
explode()
Спасибо, попробую.
Сохранение селекта:
Отображение в админке:
Ну и парсер для удобства:
Подскажите как можно расширить class до добавления изображения.Нашел пример через add_meta_box()
но хотелось бы все же сделать это через class. Заранее спасибо.
этот функционал пока что в разработке
Возможно это решение: CMB class (Custom-Metaboxes-and-Fields-for-WordPress: https://github.com/WebDevStudios/Custom-Metaboxes-and-Fields-for-WordPress)
а как сделать чтобы checkbox был по умолчанию всегда включен?
поменять
на
при этом надо немного доработать сохранение значений, так, чтобы когда чекбокс не отмечен, ему присваивалось off
Миша подскажите, как при добавлении записи в редактор editor, эта же запись автоматически добавлялась в созданный мною add_meta_box.
Спасибо.
То есть, если что-нибудь напечатать в основном редакторе, то после сохранение поста оно сохранится и в качестве значения поля в метабоксе? Я правильно понимаю?
Ну можно в функцию сохранения добавить следующий код:
Миша спасибо за ответ. Ну не совсем то, что нужно. Чтобы не засорять комментарии долгими изложениями, я отправил свой денежный вопрос Вам в контакты.
Миш, а есть ли способ регулировать очередность вывода метабоксов в админке WP? К примеру сразу после поля ТITLE.
Думаю тут есть два варианта:
1) параметр $priority функции
add_meta_box()
,2) третий параметр функции
add_action()
(приоритет задействования хука), например можно попробовать поставить туда единицу.Миш, может быть сталкивался с таким: как можно ограничить видимость метабокса в админ панели? ( метабокс отображается если пользователь админ).
Функция
current_user_can()
. В примерах выше она есть.Всем привет! Столкнулся на своем сайте с такой проблемкой...после добавления метабокса
в ((functions.php)) перестали отображаться настройки самой темы, остается только кнопка "сбросить". при удалении данного кода из ((functions.php)) все настройки отображаются как и раньше.
Помогите с решением проблемы, не хочется при настройке темы стирать код и потом снова его вставлять. Может проблема в самом коде??
Привет!
Попробуйте поменять названия переменных, функций и классов (которые вы используете для добавления метабокса).
Например:
$options
на$options1
и так далее.Большое спасибо. Помогло:)
Отлично, рад помочь 🙂
Спасибо, Миша!
До этого юзала функциями.
Кстати, таким кодом вывела в твоем классе стандартный wp_editor (мне он нужен, чтобы вставлять встроенную галерею в доп.поле)
Круто, спасибо за код 🙂
А если у меня уже есть произвольные поля с определенными названиями. Как мне сделать, чтобы они добавлялись через метабокс? Получается, если я создам метабокс с id=meta1 и произвольным полем с id=address, то, чтобы вызвать его мне нужно будет прописывать meta1_address, а у меня сейчас произвольное поле называется просто address.
Как быть в этом случае?
Можно просто подогнать префиксы, либо вообще их удалить из имён полей. Это не повлияет на работоспособность кода.
Добрый день, Михайл! Подскажите пожалуйста, как сделать так, чтобы в админке wp метабокс при указании $post_type (post) отображался не во всех постах, а только в постах необходимых рубрик?
Добрый день!
Используйте функцию in_category().
Но тут конечно при создании нового поста метабокс никогда не будет отображаться — только после присвоения ему рубрики И сохранения.
Спасибо! Буду пробовать, жаль конечно, что мета боксы появятся лишь после сохранения.
Миша, добрый вечер.
Скажи, возможно ли изменить твой код, чтобы добавлялись поля с одинаковыми ключами, чтобы можно было вывести через цикл. Например, поле с размером товара, товаров несколько одной коллекции, в каждой их разное количество.
Пришлось переписать код вывода и нумеровать ключи.
Я где-то на зарубежных сайтах встречала пост, как через аякс или jquery вордпресса по клику на кнопке дублировать поля в метабоксе. Не подскажешь, где можно почитать, не получается найти, закладки сгорели вместе с ноутом =(.
Доброе утро!
=((
Блин, что-то мне не приходилось с этим сталкиваться.
Привет, Миш.
Включила дебаг и при сохранении меню выпали ошибки
и оно обрезалось до 90 пунктов.
Привет!
Тут да, этот класс писался очень давно и не прогонялся через дебаг. Нуждается в оптимизации, согласен. Руки не дошли.
Решила проблему тем, что добавила проверку на пустое значение
А можешь еще подсказать
Что это за параметр 'std' ?
Ну типо значение по умолчанию.
Привет Миша. Вопрос такой: правильно ли будет заменить
на
Просто там получается что неправильно отображаются данные из-за кавычек, если в метабокс вводить к примеру не просто какой-то текст, а теги с какими-либо атрибутами . Мне кажется нужно заменить на преобразователь, тогда ошибка исчезает, вот только точно я не знаю скажется ли это как-то негативно на работе или наоборот.
P.S. - я плохо знаю php.
Привет, в этой статье код старый — как раз сейчас занимаюсь разработкой нового класса, который будет поддерживать разные плюшки вроде загрузчика медиафайлов и гугл карт.
И спасибо за вопрос.
В данном случае правильнее такой вариант:
OK! Спасибо.
Огромное спасибо за класс с метабоксом, лучей добра вам и литр чая!
Пожалуйста! 🙂 Я его давно делал, если найдёте какие-нибудь недоработки, пожалуйста, дайте знать.
Всё работает как часы 🙂
Правда пришлось повозиться, зато много нового узнал :3
Привет, Миша.
Я снова к тебе на огонек)).
Пытаюсь добавить метабоксы на страницу редактирования комментариев.
Все чудесно - появились, сохраняются значения, но почему-то чекбокс не отображается включенным, если снова зайти в редактирование.
Пробовала по аналогии добавить так:
Но тогда чекбокс отображается всегда включенным.
Как бы сделать, чтобы флажок отображался правильно?
Подвела невнимательность
работает.
Привет,
да, у меня тоже постоянно с невнимательностью проблемы 🙂
нет, что-то у меня не складывается ((...
Я добавила
в full
и функцию сохранения
получается, что значения в полях метабоксах показываются только для того типа, который стоит выше в коде.
И мета поля комментариев не сохраняются (((
Подскажи, пожалуйста, в чем ошибка?
*facepalm* надо же так лохануться и забыть по цикл.
Остается только первый вопрос - как подружить comment_meta и post_meta
Что-то я пока что не допираю 🙂 Зачем их дружить?
Ну чтобы не переписывать отдельно full для comment_meta.
Эти строчки
одновременно не работают, т.е. сохраненные значения показываются либо для комментариев, либо для постов, смотря какая строчка написана выше.
Пробовала
вообще и там, и там пусто.
А, то есть первым приоритетом - значение данных комментария, а вторым — поста?
Сработало!
Подскажите пожалуйста, а как к производьному полю добавить еще и html редактор?
Спасибо..
Я чуть выше в комментариях писала =)
Спасибо, сейчас буду разбираться 🙂
Как переопределить адрес поста при помощи произвольных полей? Спасибо
Вам нужно копать в эту сторону.
Доброго времени суток.
Подскажите, пожалуйста, нубу что я делаю не так:
Мне нужен всего 1 checkbox, результатом которого будет получение id поста, в котором он чекнут. Использую код, приведенный вами выше.
Извините, провтыкал, вопрос в том, что значение checkbox не сохраняется при обновлении страницы, в результате ничего не выводится(
Доброго времени. Что-то недопонял задачу.
Мне нужно на странице редактирования поста в админке добавить checkbox, если он checked, то на главной будет выводиться данный пост.
on
, допустим у него атрибут name будетfeatured
.meta_key
равныйfeatured
иmeta_value
равынйon
.Я вроде так и сделал, взяв кусок кода приведенный Вами выше, но в админке не сохраняется "флажок" чекбокса, после того, как я сохраняю изменения.
Если проблема еще актуальна, напишите мне доступ к сайту по email или вк, гляну и поправлю.
Миша, доброе утро.
Пытаюсь приспособить твой класс. Дописала еще один вариант
Скриптик работает - можно динамически создавать еще полей и удалять.
Только вот сохраняется одно значение (последнего поля). Подскажи, пожалуйста, что прописать в функции сохранения, чтобы сохранялись поля с одинаковым ключом и разными значениями.
name у input'a сделать массивом добавив [] то есть
Однако необходимо будет полностью изменить вывод - цикл написать для вывода всех значений.
а да...
и как выводить все уже существующие значения поля с этим ключом =)
Здравствуй, Миша. У меня такая тема, собираю сейчас сайтик, задумка добавления своего изображения вместо шапки сайта для каждой страницы индивидуально..
Я сделал, чтобы custom-header.php выводил заданное изображение только на главной.
И добавил возможность прикрепления своей якобы шапки (на самом деле это часть страницы). А визуально изображение заменяет шапку.
Вобщем добавил дополнительно, помимо миниатюры выбор еще одной миниатюры. В редакторе.
Теперь не могу разобраться, как можно кроме страниц в массив еще и записи вставить чтобы было и в записях и в страницах.
Получается что нужно выбирать, либо пост, либо страницы.
Все, догнал как передать в массив и страницы и записи.
Выдаёт нотисы если не задавать std.
Перед свитчем и проверкой этого std вставить бы
Вставьте 🙂 В данный момент код не идеален (конечно, он был написан мной ещё 4 года назад), в данный момент я работаю над новым.
Ну я и написал для тех, кто использует 🙂 И было бы здорово в будущей версии множественный выбор сделать))
Решение (пусть и не идеальное) для текущего кода.
Привет! Подскажи, как расширить класс, а именно:
У меня на сайте посты добавляются не только с бэкэнда, но и с фронтэнда. Как бы мне вызвать форму в лицевой части адмикни? Т.е. хочу код, что генерирует функция fill() вывести во фронтэнде.
Я пока додумался до добавления в класс
и вызываю ее на странице сайта через truemetabox::fields_front();
Но явно этого мало... Подскажешь?
Привет!
а конкретней — это что-нибудь дало?
Блин. На самом деле чет нифига толком не дало(( Просто убрались ошибки и если в функцию fill() к примеру вставить обычное echo - то он покажет его содержимое.
Кстати, слушай, вот чего точно в классе не хватает, так это загрузки файлов!
Вот ты уже отдельно подобное показывал https://misha.agency/blog/wordpress/uploader-metabox-option-pages.html
это как-то бы прикрутить сюда (в твой класс)!
Причем неплохо бы реализовать возможность, чтобы линки лежали в одном произвольном поле. Чтобы картинок неограниченное количество грузить. Тут вот что-то нашел, но чет не смог прикрутить к твоему классу http://onwp.ru/question/kak-sdelat-blok-dlya-zagruzki-izobrazhenij-v-adminke
А еще я в твой класс добавил 1 параметр.
<tr class="">
Это удобно, т.к бывают случаи, когда нужно делать зависимости. Т.е. в первом доп-поле к примеру у нас селектор, выбор которого влияет на отображение других допполей. (чтоб не все выводить, а нужные). И тогда как-раз за классы удобно цепляться.
PS Сделай плиз в классе возможность подгружать файлы! Это пожалуй, самая важная штука, которой не хватает!
Подгрузка файлов вообще готова, но по сути это новый класс уже, постараюсь его докончить и опубликовать к концу месяца.
А можешь пока то-что есть показать? Я может сам допилить смогу подргузку... а то оч надо... т.к. твоим классом очень удобно пользоваться и ради подгрузки от него отказываться не охота... а до конца месяца - это очень долго(( я понимаю, что у тебя работы куча и времени нет... мне б хоть кусочек начального кода, чтоб понять с какой стороны подойти...
только это 🙂
А вот знаешь какая трабла. А как wp_enqueue_media() к старницам подлкючить? Стоит Т.е. если к примеру подгрузку картинок переключить на page - все, не пашет! Т.е. метабокс добавляется, но на этом все... т.е. wp_enqueue_media() только для записей работает. А как же быть со страницами?
Странно, по идее, если выполнить все инструкции из той статьи, то должно помочь. У меня работает 🙂
и с произвольными типами постов тоже работает? Там же вроде в мануале самой функции написано, что если без параметров, то ток для записей работает wp_enqueue_media() , если добавляем параметр - то тогда id страниц, но я так понял, что конкретных страниц, а не всех.
Т.е. если я напишу wp_enqueue_media( array( 'post' => 5 ) );
то медиа скрипты подгрузятся для всех записей и для страницы с id=5. А если мне нужны все страницы (вновь создаваемые, id неизвестен) ? А если произвольный тип страниц? или я может что-то неверно понял.
PS Хотел еще спросить - а разве нужен нам в классе verify_nonce если он у нас заточен под фронтэнд.
Может достаточно вынести в отдельный файл и прописать
ведь в админку то оп идее у нас левые люди не должны пролезать.... (просто дебаг ругается иногда)
PPS дебаг срабатывает когда мы добавляем новую страницу.
Я попробовал добавить в функцию save это:
Но видимо при создании нового поста срабатывает что-то еще.
Михаил, создал метабокс и вывел там два радиобаттона.
Я должен выбрать, добавлять статью в важные или нет. Но не совсем понятно, как можно получить значение именно радиобатаннов через
get_post_meta
и чтобы выбор не сбрасывался, после перезагрузки страницы.
То есть если выбран первый, то добавлять, если второй то нет. Но это потом. Сначала нужно решить проблему выше. Помогите, пожалуйста.
Добый день, Иван!
А для радио-кнопок всё работает так же, как и для текстовых полей, просто значения value полей фиксированные.
Спасибо за ответ. Что тогда не так делаю?
Создаю новый метабокс:
Потому вывожу два радиобатона:
И сохраняю
Мне нужно чтобы после перезагрузки страницы оставался выбраный радиобаттон, а также нужно получить его значение. Я не понимаю как это сделать.
PS. В параметрах к функциям вы передаете переменные $post и $post_id. Зачем?
На самом деле всё просто — неправильно используешь HTML-элемент радио-кнопки. Думаю проблему решит почитать про неё в каком-нибудь HTML-буке.
Зачем получать значение, если оно и так известно?
Тут поможет функция
checked()
. Примерно как-то так:P.S.
$post
и$post_id
передаются в функции, потому что они в них используются :OP.P.S. дай знать, если всё заработает, и сорри за задержку с ответом, дел полно в последнее время 🙂
Спасибо за ответ. Так не работает, однако если вот эту строчку:
Заменить на вот эту:
То есть через get_post_meta почему то не работает(. Не знаю, как исправить.
И почему то не выводится значение радиобаттона вот так:
Не подскажешь почему?
Могу подсказать алгоритм:
global $post;
true_save_box_data()
поискать проблему, в какой именно части кода у нас не то, что нужно, это можно сделать при помощиecho( $переменная ); exit;
Спасибо, буду пробовать. Последнее спрошу: в какой таблице искать это значение?
wp_postmeta
А вариант, предложенный на generatewp.com/the-meta-box-generator/ , чем хуже? Я использую этот вариант, т.к. изначально с ним столкнулся. Есть в нем у меня проблема - при публикации поста автоматически создаются все пользовательские поля из метабокса, включая поля с пустыми значениями. подскажите пожалуйста как от этого избавиться и оставить сохранение только заполненных пользовательских полей?
По поводу сторонних решений меня не спрашивайте 🙂
эх... а то я боюсь жуткой нагрузки на сервер(, т.к. этих полей у меня очень много..
Не думаю, что большое количество полей как-то сильно навредит. Навредить может только плагин, их неоптимально использующий.
Приветствую. Посдскажите, как добавить к метабоксу собственный id, чтобы потом его можно было в javascript использовать?
Добрый вечер, у каждого метабокса есть свой ID, его можно глянуть в браузере в меню "Проинспектировать элемент".
Добрый вечер, я не понимаю. при выводе во фронтенде мне надо указать id поста, правильно?
get_post_meta( тут надо указать id поста, 'тут надо указать id поля', true )
ВОПРОС: Как я могу указать id поста, если поле у меня для записи ( это поле "автор" и выводится оно в цикле , соответственно на странице audio-page.php у меня оно всего один раз. Как для каждого поста я могу его указывать?
Здравствуйте, например функцией get_the_id()
Снова требуется помощь. У меня есть метабокс с загрузчиком аудиофайла. Так вот, когда я вывожу его на сайт, тем же способом, что выводил текст, то выводится ссылка на файл, а как сделать, чтобы выводился плеер , ну как когда добавляешь медиафайл в пост?
Спасибо, заранее.
Так, выводом медиафайла я разобрался, но при выводе открывается родной плеер браузера, а не встроенный в wordpress. И вот теперь я точно не знаю что делать
Вывожу в шаблоне так:
"zbplayer" это я случайно написал, эксперементировал с тем как можно вывести плагин.
Короче я со всем разобрался, теперь вопрос:
в html верстке в коде, когда f12 нажимаешь id не отображается, а мне нужно чтобы там было class="" id="id метаполя"
как решить этот вопрос?
Не знаю, f12 не использую) Через контекстное меню "проинспектировать элемент" всё отлично.
Добрый вечер! у меня возникла следующая проблема. Я делаю фотоальбомы, чтобы они выглядели "как в контакте". Так вот, там под названием фотоальбома при наведении появляется его описание если оно добавлена. Я сделал отдельный метабокс для описания альбома. Как я могу добавить html класс, чтобы при выводе данных они выводились в внутри этого класса. А если данных ( описания альбома ) нет, то и этого класса тоже бы не выводилось.
Добрый вечер!
Если я правильно понял, то:
Не очень понял. Я добавляю метабокс через класс, почти как у вас.
И вывожу его на странице
Как мне сюда прикрутить добавление класса?
Сделал
Класс добаляется даже если поле пустое
Ура, спасибо! Все-таки я разобрался ! Сделал:
Вы молодец 🙂
Так вы же изначально хотели вывести описание альбома при наведении на него курсора, то есть нужно было загнать $desc в title ? А в таком исполнении описание у вас будет выводится автоматом при наличии метаполя, без наведения.
У меня какя задумка была. Я сделал стили для .description и описание появляется если оно есть. А есди нет то и стили, получается применять не к чему. В контакте это с помощью jquery сделано. Но мне сейчас некогда разбираться с этим. Сейчас все работает. Вот. пожалуйста, посмотрите, вроде получилось. В первом фотоальбоме есть блок описание, а во втором нет.
http://piskarevskiyhram.ru/foto-i-video-arxiv
А как можно вывести значение радиокнопки или чекбокса? задумка такая, вертикальная миниатюра поста должна в шаблоне отображаться не так как горизонтальная. Я придумал такой выход под выбором миниатюры в админке я сделал чекбокс , который надо отметить, если фотография вертикальная. И теперь хочу, чтобы в шаблоне у меня выводился дополнительный класс.
Вот, а у меня вместо этого выводится "page".
Вот кусок кода functions.php
Привет! Идея такова:клиент сначала выбирает стиль услуги(в селект)!в каждом стиле услуги разное количество изображений и их размер!Как будет правильно и лучше ,сделать так, что бы в данном стиле выводилось нужное количество полей для изображений и с разными id ,так ,что бы можно было прописать им тумбы ? буду очень признателен!благодарю!