ГлавнаяНе WordPress → Блок произвольных полей в админке WordPress своими руками

Блок произвольных полей в админке WordPress своими руками

Комментариев: 31Блок произвольных полей в админке WordPress своими руками
  • Что касается произвольных полей, то меня устраивает плагин Magic-fields. На базе него спокойно создаются каталоги товаров smile

    ОТВЕТИТЬ ↓
  • Пару месяцев назад искал подобное решение, но в рунете не нашел. Зато у буржуев было то что я искал. Но там используется несколько другой метод чем у вас - поля задаются через массив:

    <?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);
      		}
      	};
      
      });
      ОТВЕТИТЬ ↓
      • Не, не, не, я совершенно "за" *crazy* Умничайте на пользу smile

        ОТВЕТИТЬ ↓
  • А зачем использовать плагины?... каждый плагин - это море запросов в БД.. лучше приведенные функции вставлять сразу в тему)

    ОТВЕТИТЬ ↓
  • Очень нужна ваша помощь.
    Пользуюсь плагином WP-PostRatings, нужно чтобы популярные посты выводились с произвольными полями. Возможно реализовать как-то ?

    ОТВЕТИТЬ ↓
  • Метаблок - это хорошо *ok*, но желателен пример который позволяет дополнять таблицы wp_posts. Можешь показать такой пример?

    ОТВЕТИТЬ ↓
    • В смысле добавлять колонки в таблицу с выводом постов в админке? Я как нужно понял?

      ОТВЕТИТЬ ↓
  • У меня не получается составить код, который выводил бы блок дополнительных полей и в записях и на страницах.

    Тимур, можете подробнее рассказать, как это сделать?

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

    ОТВЕТИТЬ ↓
    • Подробнее чем в статье у меня вряд ли получиться, я плохо представляю на чем акцентировать внимание.

      ОТВЕТИТЬ ↓
Форма комментирования

¤ Вставляйте код кнопкой: "Код" (php, js, html, css, sql);
¤ Выделяйте HTML код кнопкой: "Выделить" (<div>);
¤ Перед отправкой комментария используйте "Превью";
¤ Не пишите спам/бред — бесполезно!

Подписаться на комментарии без комментирования:

X

Забыли пароль?