Предположим, что мы делаем сайт на заказ, и при этом на сайте используются произвольные поля. Объяснять заказчику, какое поле выбирать из списка, чтобы добавить ту или иную информацию к посту, проблематично, к тому же это быстро забывается. Именно поэтому уже давно написаны плагины, благодаря которым можно легко создать блок произвольных полей, ...
- Предыдущие по меткам
- Предыдущие записи
Ранее: Администрирование
- Sypex Dumper 2 for WordPress ← 16.Дек.2010 // 6
- Удаление виджетов из Консоли WordPress ← 4.Ноя.2010 // 20
- Плагин для легкого управления сайтом на WordPress (версия 3) ← 30.Июл.2010 // 76
- Плагин для легкого управления сайтом на WordPress ← 23.Апр.2010 // 37
- Динамический архив блога с использованием jQuery (Ajax) ← 12 Май 2011 // 34
- Самые Хлебные крошки (breabcrumbs для WordPress) ← 19 Апрель 2011 // 99
- Плагин для подсчета количества загрузок файла – Kama’s Click Counter ← 28 Март 2011 // 48
Что касается произвольных полей, то меня устраивает плагин Magic-fields. На базе него спокойно создаются каталоги товаров
Пару месяцев назад искал подобное решение, но в рунете не нашел. Зато у буржуев было то что я искал. Но там используется несколько другой метод чем у вас - поля задаются через массив:
<?php //-------------------------------------BETTER--META--BOX-------------------------// $prefix = '1_'; $meta_box = array( 'id' => 'my-meta-box', 'title' => 'Информация об организации', 'page' => 'post', 'context' => 'normal', 'priority' => 'high', 'fields' => array( array( 'name' => 'Адрес:', 'id' => $prefix . 'adr', 'type' => 'text' ), array( 'name' => 'Телефон:', 'id' => $prefix . 'tel', 'type' => 'text' ), array( 'name' => 'E-mail:', 'id' => $prefix . 'mail', 'type' => 'text' ), array( 'name' => 'Сайт:', 'desc' => 'С http://', 'id' => $prefix . 'url', 'type' => 'text' ) ) ); add_action('admin_menu', 'mytheme_add_box'); // Add meta box function mytheme_add_box() { global $meta_box; add_meta_box($meta_box['id'], $meta_box['title'], 'mytheme_show_box', $meta_box['page'], $meta_box['context'], $meta_box['priority']); } // Callback function to show fields in meta box function mytheme_show_box() { global $meta_box, $post; // Use nonce for verification echo '<input type="hidden" name="mytheme_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />'; echo '<table class="form-table">'; foreach ($meta_box['fields'] as $field) { // get current post meta data $meta = get_post_meta($post->ID, $field['id'], true); echo '<tr>', '<th style="width:20%"><label for="', $field['id'], '">', $field['name'], '</label></th>', '<td>'; switch ($field['type']) { case 'text': echo '<input type="text" name="', $field['id'], '" id="', $field['id'], '" value="', $meta ? $meta : $field['std'], '" size="30" style="width:97%" />', '<br />', $field['desc']; break; case 'textarea': echo '<textarea name="', $field['id'], '" id="', $field['id'], '" cols="60" rows="4" style="width:97%">', $meta ? $meta : $field['std'], '</textarea>', '<br />', $field['desc']; break; case 'select': echo '<select name="', $field['id'], '" id="', $field['id'], '">'; foreach ($field['options'] as $option) { echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>'; } echo '</select>'; break; case 'radio': foreach ($field['options'] as $option) { echo '<input type="radio" name="', $field['id'], '" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' />', $option['name']; } break; case 'checkbox': echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' />'; break; } echo '<td>', '</tr>'; } echo '</table>'; } add_action('save_post', 'mytheme_save_data'); // Save data from meta box function mytheme_save_data($post_id) { global $meta_box; // verify nonce if (!wp_verify_nonce($_POST['mytheme_meta_box_nonce'], basename(__FILE__))) { return $post_id; } // check autosave if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; } // check permissions if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) { return $post_id; } } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } foreach ($meta_box['fields'] as $field) { $old = get_post_meta($post_id, $field['id'], true); $new = $_POST[$field['id']]; if ($new && $new != $old) { update_post_meta($post_id, $field['id'], $new); } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); } } } ?>Я встречал подобное на англ. Интересное решение, хорошая альтернатива, потому что в чем-то более универсальное, чем пример из этой статьи.
Из отличий вижу:
1. в моем примере блок создается полностью вручную и поэтому его можно по-разному стилизовать. Если надо использовать javascript обработку и т.п. Полный кастом иногда удобнее.
2. в моем примере как-то удобнее создавать несколько блоков для разных типов записей. В этом примере для этого придется дублировать весь код для каждого блока и переписывать переменную $meta_box.
П.С. спасибо за хороший пример!
Спасибо за статью, на вашем сайте всегда можно найти оригинальные, нужные и понятные решения.
А можно ли добавить блок произвольных полей к записям только определенной рубрики?
Пожалуйста!
Так сделать можно, но разумеется не для новой статьи, потому что у новой статьи еще нет рубрики... Вы учли этот момент? Раз для новой такое не делается, то если логика вообще такое делать?
Если все-таки нужно, то покопайте в сторону проверки переменной $post на странице редактирования. Через нее можно будет получить категорию записи и соответственно условием потом проверить: если категория "наша", то выводим блок (активируем фильтр).
Логика есть на стороне клиента - если в одной рубрике нужно специально выделять реквизиты компании, например, а в других - они не нужны...(стало быть и показывать не нужно). Вижу два выхода - или сначала новую запись сохранить (не хочется так), либо записи этой рубрики сделать отдельным новым типом записей.
как ты обворачиваешь <var>$post</var>
Не понял
Подскажите, как в блоке произвольных полей создать еще одно - кнопка загрузки изображений
К сожалению я не знаю ответ на этот вопрос.
либо плагины, либо пишите код (jquery в помощь)
Кама, я надеюсь ты не против что я у тебя в комментариях по умничаю)))
Константин, я тут поковырялся и нашел решение по вашему вопросу. Ниже представлен немного модифицированный код господина Камы
// подключаем функцию активации мета блока (my_extra_fields) add_action('admin_init', 'my_extra_fields', 1); function my_extra_fields() { add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high' ); } // код блока function extra_fields_box_func( $post ){ ?> <p><label><input type="text" name="extra[title]" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:50%" /> < заголовок страницы (title)</label></p> <p>Описание статьи (description): <textarea type="text" name="extra[description]" style="width:100%;height:50px;"><?php echo get_post_meta($post->ID, 'description', 1); ?></textarea> </p> <p>Видимость поста: <?php $mark_v = get_post_meta($post->ID, 'robotmeta', 1); ?> <label><input type="radio" name="extra[robotmeta]" value="" <?php checked( $mark_v, '' ); ?> /> index,follow</label> <label><input type="radio" name="extra[robotmeta]" value="nofollow" <?php checked( $mark_v, 'nofollow' ); ?> /> nofollow</label> <label><input type="radio" name="extra[robotmeta]" value="noindex" <?php checked( $mark_v, 'noindex' ); ?> /> noindex</label> <label><input type="radio" name="extra[robotmeta]" value="noindex,nofollow" <?php checked( $mark_v, 'noindex,nofollow' ); ?> /> noindex,nofollow</label> </p> <p><select name="extra[select]" /> <?php $sel_v = get_post_meta($post->ID, 'select', 1); ?> <option value="0">----</option> <option value="1" <?php selected( $sel_v, '1' )?> >Выбери меня</option> <option value="2" <?php selected( $sel_v, '2' )?> >Нет, меня</option> <option value="3" <?php selected( $sel_v, '3' )?> >Лучше меня</option> </select> < выбор за вами</p> // Загрузка изображения для поста <p> <label for="upload_image">URL картинки: </label><br/> <input id="upload_image" type="text" size="90" name="extra[image]" value="<?php get_post_meta($post->ID, 'image', true); ?>" /> <input class="upload_image_button" type="button" value="Загрузить" /><br/> </p> <input type="hidden" name="extra_fields_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php } // включаем обновление полей при сохранении add_action('save_post', 'my_extra_fields_update', 0); /* Сохраняем данные, при сохранении поста */ function my_extra_fields_update( $post_id ){ if ( !wp_verify_nonce($_POST['extra_fields_nonce'], __FILE__) ) return false; // проверка if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return false; // если это автосохранение if ( !current_user_can('edit_post', $post_id) ) return false; // если юзер не имеет право редактировать запись if( !isset($_POST['extra']) ) return false; // Все ОК! Теперь, нужно сохранить/удалить данные $_POST['extra'] = array_map('trim', $_POST['extra']); foreach( $_POST['extra'] as $key=>$value ){ if( empty($value) ) continue delete_post_meta($post_id, $key); // удаляем поле если значение пустое update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически } return $post_id; } //Создаём функйию подключения ява скриптов к админке function upload_scripts() { wp_enqueue_script('media-upload'); wp_enqueue_script('thickbox'); wp_register_script('my-upload', get_bloginfo('template_directory').'/js/custom_uploader.js', array('jquery','media-upload','thickbox')); wp_enqueue_script('my-upload'); } //Создаём функйию подключения стилей thickbox function upload_styles() { wp_enqueue_style('thickbox'); } add_action('admin_print_scripts', 'upload_scripts'); //Регистрируем скрипты в админке add_action('admin_print_styles', 'upload_styles'); //Регестрируем стили в админкеИ собственно сам java скрипт который нужно пометить в папку вашей темы с названием js (если такой папки нету создайте её).
P.S. файл с java скриптом в нашем случае необходимо назвать custom_uploader.js
Вот код:
jQuery(document).ready(function() { var fileInput = ''; jQuery('.upload_image_button').click(function() { fileInput = jQuery(this).prev('input'); formfield = jQuery('#upload_image').attr('name'); post_id = jQuery('#post_ID').val(); tb_show('', 'media-upload.php?post_id='+post_id+'&type=image&TB_iframe=true'); return false; }); window.original_send_to_editor = window.send_to_editor; window.send_to_editor = function(html){ if (fileInput) { fileurl = jQuery('img',html).attr('src'); fileInput.val(fileurl); tb_remove(); } else { window.original_send_to_editor(html); } }; });Не, не, не, я совершенно "за"
Умничайте на пользу 
А зачем использовать плагины?... каждый плагин - это море запросов в БД.. лучше приведенные функции вставлять сразу в тему)
Очень нужна ваша помощь.
Пользуюсь плагином WP-PostRatings, нужно чтобы популярные посты выводились с произвольными полями. Возможно реализовать как-то ?
Метаблок - это хорошо
, но желателен пример который позволяет дополнять таблицы wp_posts. Можешь показать такой пример?
В смысле добавлять колонки в таблицу с выводом постов в админке? Я как нужно понял?
У меня не получается составить код, который выводил бы блок дополнительных полей и в записях и на страницах.
Тимур, можете подробнее рассказать, как это сделать?
P.S. Могла бы написать в комментарии код, который у меня получился - но не хочется засорять комментарий.
Подробнее чем в статье у меня вряд ли получиться, я плохо представляю на чем акцентировать внимание.