WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

(taxonomy)_edit_form_fields хук-событие . WP 3.0

Позволяет добавить дополнительные поля (произвольные поля или метаполя) на страницу редактирования элементов таксономии (термина).

Используйте (taxonomy)_add_form_fields, когда нужно добавить поля на страницу добавления термина.

Использование

add_action( '{$taxonomy}_edit_form_fields', 'action_function_name_6545', 10, 2 );
function action_function_name_6545( $tag, $taxonomy ) {
	// Действие...
}
$tag(объект)
Объект текущей таксономии

Примеры

#1 Добавим метаполя при создании и редактировании элемента таксономии.

В этом примере мы добавим 2 поля «Заголовок» и «Описание», для стандартной таксономии category т.е. для рубрик WordPress.

<?php
$taxname = 'category';

// Поля при добавлении элемента таксономии
add_action("{$taxname}_add_form_fields", 'add_new_custom_fields');
// Поля при редактировании элемента таксономии
add_action("{$taxname}_edit_form_fields", 'edit_new_custom_fields');

// Сохранение при добавлении элемента таксономии
add_action("create_{$taxname}", 'save_custom_taxonomy_meta');
// Сохранение при редактировании элемента таксономии
add_action("edited_{$taxname}", 'save_custom_taxonomy_meta');

function edit_new_custom_fields( $term ) {
	?>
		<tr class="form-field">
			<th scope="row" valign="top"><label>Заголовок</label></th>
			<td>
				<input type="text" name="extra[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>"><br />
				<span class="description">SEO заголовок (title)</span>
			</td>
		</tr>
		<tr class="form-field">
			<th scope="row" valign="top"><label>Описание</label></th>
			<td>
				<input type="text" name="extra[meta_description]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'meta_description', 1 ) ) ?>"><br />
				<span class="description">SEO описание (description)</span>
			</td>
		</tr>
		<tr class="form-field">
			<th scope="row" valign="top"><label>Ключевые слова</label></th>
			<td>
				<input type="text" name="extra[keywords]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'keywords', 1 ) ) ?>"><br />
				<span class="keywords">SEO ключевые слова (keywords)</span>
			</td>
		</tr>
	<?php
}

function add_new_custom_fields( $taxonomy_slug ){
	?>
	<div class="form-field">
		<label for="tag-title">Заголовок</label>
		<input name="extra[title]" id="tag-title" type="text" value="" />
		<p>SEO заголовок (title)</p>
	</div>
	<div class="form-field">
		<label for="tag-description">Описание</label>
		<input name="extra[meta_description]" id="tag-description" type="text" value="" />
		<p>SEO описание (description)</p>
	</div>
	<div class="form-field">
		<label for="tag-keywords">Ключевые слова</label>
		<input name="extra[keywords]" id="tag-keywords" type="text" value="" />
		<p>SEO ключевые слова (keywords)</p>
	</div>
	<?php
}

function save_custom_taxonomy_meta( $term_id ) {
	if ( ! isset($_POST['extra']) ) return;
	if ( ! current_user_can('edit_term', $term_id) ) return;
	if (
		! wp_verify_nonce( $_POST['_wpnonce'], "update-tag_$term_id" ) && // wp_nonce_field( 'update-tag_' . $tag_ID );
		! wp_verify_nonce( $_POST['_wpnonce_add-tag'], "add-tag" ) // wp_nonce_field('add-tag', '_wpnonce_add-tag');
	) return;

	// Все ОК! Теперь, нужно сохранить/удалить данные
	$extra = wp_unslash($_POST['extra']);

	foreach( $extra as $key => $val ){
		// проверка ключа
		$_key = sanitize_key( $key );
		if( $_key !== $key ) wp_die( 'bad key'. esc_html($key) );

		// очистка
		if( $_key === 'tag_posts_shortcode_links' )
			$val = sanitize_textarea_field( strip_tags($val) );
		else
			$val = sanitize_text_field( $val );

		// сохранение
		if( ! $val )
			delete_term_meta( $term_id, $_key );
		else
			update_term_meta( $term_id, $_key, $val );
	}

	return $term_id;
}

Получить эти метаполя затем можно в шаблоне или где-либо еще с помощью функции get_term_meta(). Например ID термина 10, тогда:

$title = get_term_meta( 10, 'title', 1 );
$meta_description = get_term_meta( 10, 'meta_description', 1 );

Список изменений

С версии 3.0.0 Введена.

Где вызывается хук

В файле: /wp-admin/edit-tag-form.php
(taxonomy)_edit_form_fields
wp-admin/edit-tag-form.php 237
do_action( "{$taxonomy}_edit_form_fields", $tag, $taxonomy );

Где используется хук (в ядре WP)

Использование не найдено.
lincaseidhe 81lincaseidhe.ru
Редакторы: Kama 7630
42 коммента
Полезные 3 Все
  • Влад

    Как добавить таким образом например чекбокс?

    1
    Ответить3.7 года назад #
    • Kama7630

      Аналогично:

      <tr class="form-field">
      	<th scope="row" valign="top"><label for="extra1">Мой чекбокс</label></th>
      	<td>
      		<input type="hidden" name="extra[my_name]" value="">
      		<input type="checkbox" name="extra[my_name]" value="1" <?php checked( get_term_meta( $term->term_id, 'my_name', 1 ), 1 ); ?> ><br />
      		<span class="description">Мой чекбокс</span>
      	</td>
      </tr>
      1
      Ответить3.7 года назад #
  • @ campusboy3430 www.youtube.com/c/wpplus

    Ё-май, сразу готовый код. Копируй, вставляй и наслаждайся. Тимур, как всегда на высоте smile Я уже каску приготовил и настойку пустырника, думал воевать как всегда придётся с такой задачей, а тут всё так просто. Просто супер!

    1
    Ответить3.4 года назад #
  • Александр

    Как это вообще может работать?! В $_POST при добавлении терма никак не может приходить мое собственное поле, так как передача идет аяксом, а аякс не получает это поле. Поэтому $_POST на эти хуки будет без моего поля:

    // Сохранение при добавлении элемента таксономии
    add_action("create_{$taxname}", 'save_custom_taxonomy_meta');
    // Сохранение при редактировании элемента таксономии
    add_action("edited_{$taxname}", 'save_custom_taxonomy_meta');
    

    В чем я не прав?

    Ответить3.3 года назад #
  • Дмитрий

    Что делать если в слаге таксономии есть дефис, т.е.

    function save_taxname-name() {
    	// code...
    }

    Как решить? (переименовать таксономию не вариант)

    Ответить3 года назад #
    • Kama7630

      Слаг указывается в названии хука, а не в названии функции. Разберись в том что выше написано... Дефис никак не мешает в результате...

      1
      Ответить3 года назад #
  • Nick

    Не ясно как вывести эти мета поля?

    Ответить2.10 года назад #
    • Kama7630

      Например ID термина 10, тогда:

      $title =  get_term_meta( 10 , 'title', 1 );
      $description =  get_term_meta( 10 , 'description', 1 );
      Ответить2.10 года назад #
  • Дмитрий

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

    Ответить2.8 года назад #
    • Kama7630

      Замени category в $taxname = 'category'; на название нужной тебе таксономии.

      Ответить2.8 года назад #
  • kolshix546 paxtoy.com

    Еле нашел плагин - в тесте ещё не был но на взгляд чистенький и ничего лишнего как в других

    это для тех кому иногда лень ручками заполнять или для таких невнимательных как я

    примеры использования

        // для первого плагина 
    	echo $MetaValue = get_term_meta( 31 , 'slug_name', 1 );
    
    	// для второго плагина (массив)
    	$arrayMetaList = get_all_wp_terms_meta(31); 
    	print_r($arrayMetaList);
    	// для второго плагина (одно поле)
    	echo $MetaValue = wp_get_terms_meta(31, 'slug_name' ,true);
    
    1
    Ответить2 года назад #
  • Дмитрий list-price.ru

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

    (без второй части кода)

    add_action('admin_init', 'cpp_init');
    function cpp_init()
    	{
    	$cpp_taxonomies = get_taxonomies('', 'names');
    	if (is_array($cpp_taxonomies))
    		{
    		foreach($cpp_taxonomies as $taxname)
    			{
    			add_action($taxname . '_add_form_fields', 'add_new_custom_fields');
    			add_action($taxname . '_edit_form_fields', 'edit_new_custom_fields');
    			add_action('create_' . $taxname, 'save_custom_taxonomy_meta');
    			add_action('edited_' . $taxname, 'save_custom_taxonomy_meta');
    			}
    
    		}
    	}
    
    global $cpp_taxonomies_field;
    		$cpp_taxonomies_field = array(
    			'category' => array( //название таксономии
    				array(
    					'label' => 'Название поля 1 для категорий ',
    					'field' => 'hhhffd',
    					'description' => 'Описание поля 1',
    				) ,
    				array(
    					'label' => 'Название поля 2 для категорий ',
    					'field' => 'fgfff',
    					'description' => 'Описание поля 2',
    				)
    			) ,
    			'catalog' => array(//название таксономии
    				array(
    					'label' => 'имя поля',
    					'field' => 'slug_polya',
    					'description' => 'описание',
    				) ,
    			)
    		);
    
    function add_new_custom_fields( $taxonomy_slug ){
    		global $cpp_taxonomies_field;
    	foreach ($cpp_taxonomies_field[$taxonomy_slug] as $cpp_taxonomie ) { ?>
    		<div class="form-field">
    <label for="tag-title"><?php echo $cpp_taxonomie[label];?></label>
    <input name="extra[<?php echo $cpp_taxonomie[field];?>]" id="tag-title" type="text" value="" />
    		<p><?php echo $cpp_taxonomie[description];?></p>
    		</div>
    	<?php
       }    
     }
    
    function edit_new_custom_fields( $term ) {  
     global $cpp_taxonomies_field;
     foreach ($cpp_taxonomies_field[$term->taxonomy] as $cpp_taxonomie ) { ?>
    		<tr class="form-field">
    			<th scope="row" valign="top"><label><?php echo $cpp_taxonomie[label];?></label></th>
    			<td>
    <input type="text" name="extra[<?php echo $cpp_taxonomie[field];?>]" value="<?php echo esc_attr( get_term_meta( $term->term_id, $cpp_taxonomie[field], 1 ) ) ?>"><br />
    			<span><?php echo $cpp_taxonomie[description];?></span>
    			</td>
    		</tr>
    <?php
    } 
    }
    
    4
    Ответить1.8 года назад #
  • В каких-то версиях вордпресс description видимо работает как надо, но в WordPress 4.9.5 description для рубрик и меток не выводится sorry Работает только стандартный description. Может быть какой-то конфликт с вордпрессом? В теме вроде нет ничего, что может влиять на это, а плагины отключены! Description заданный в произвольном поле description для рубрики выводится с помощью кода на https://wp-kama.ru/id_9537/seo-meta-tegi-bez-plaginov.html. А тему эту поднимаю здесь, т.к. пример полей для рубрик здесь, а не на https://wp-kama.ru/id_9537/seo-meta-tegi-bez-plaginov.html crazy

    Ответить1.5 года назад #
    • lincaseidhe81 lincaseidhe.ru

      А какие конкретно описания имеются ввиду? И после чего происходит? После добавления произвольного поля к рубрике/метке?

      1
      Ответить1.5 года назад #
      • Произвольные поля для рубрик и меток в админпанели добавляются. А вот введённый текст в произвольное поле Description не выводится в head (готовом html) scratch_one-s_head Выводится с помощью кода на https://wp-kama.ru/id_9537/seo-meta-tegi-bez-plaginov.html Простите, думал, что здесь в курсе о коде для вывода title, description, robots, Open Graph, twitter...

        Ответить1.5 года назад #
        • @ campusboy3430 www.youtube.com/c/wpplus

          А должен что ли? Вы явно что-то путаете.

          Ответить1.5 года назад #
        • newbie34 yumchief.com

          Ты вывод то сделай, чтобы у тебя вывелось:

          Получить эти метаполя затем можно в шаблоне или где-либо еще с помощью функции get_term_meta().

          1
          Ответить1.5 года назад #
          • Согласен, только не понимаю, почему нужно так выводить - через get_term_meta() в шаблоне? Есть же wp-head() scratch_one-s_head Благодаря коду на https://wp-kama.ru/id_9537/seo-meta-tegi-bez-plaginov.html И если задать описание например рубрики в стандартном для этого метаполе, то оно без проблем выводится через wp-head() unknw Я думаю, что произвольное поле description тоже должно как-то выводится через wp-head(), произвольные поля title и keywords для рубрики выводятся же без проблем в head через wp-head() dash Простите, думал, что здесь в курсе о коде для вывода title, description, robots, Open Graph, twitter...

            Ответить1.5 года назад #
            • lincaseidhe81 lincaseidhe.ru

              Описание рубрики вообще-то под заголовком рубрики выводится) и что у тебя за вордпресс такой, где произвольные поля в админке добавляются, когда плагины отключены?mosking

              1
              Ответить1.5 года назад #
              • О чём вы вообще? crazy Причём тут вывод описания рубрики под заголовком? Я говорю о выводе description в head! dash Причём тут

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

                Тема на данной странице (taxonomy)_edit_form_fields, с помощью которой можно добавить произвольные поля! Был рассмотрен пример добавления:

                В этом примере мы добавим 2 поля «Заголовок» и «Описание», для стандартной таксономии category т.е. для рубрик WordPress.

                Этот код, неважно, подключается он как плагин или ты его прям в function.php вставляешь. Про версию WP или конфликта с какими-либо плагинами я озвучил по причине того, что может быть есть где-то конфликт. Факт остаётся в том, что в head не выводится текст, задаваемый в произвольном поле description для рубрики в админке! А он должен выводится! Посмотрите код на https://wp-kama.ru/id_9537/seo-meta-tegi-bez-plaginov.html shout Понятное дело, что если просто использовать код вывода в админке полей, то ничего не будет выводиться в HEAD dash Простите, думал, что здесь в курсе о коде для вывода title, description, robots, Open Graph, twitter...

                Ответить1.5 года назад #
                • lincaseidhe81 lincaseidhe.ru

                  ну в предыдущих комментариях у тебя видно по паре предложений "на уме" были, а напечатать лень было wink

                  Ответить1.5 года назад #
                • @ campusboy3430 www.youtube.com/c/wpplus

                  Название полей (атрибут name у input и других) в 1 примере должны совпадать с ключом в функции get_term_meta() в статье про сео, тогда всё будет нормально.

                  1
                  Ответить1.5 года назад #
                • Kama7630

                  agree Для того кода ключ должен назваться meta_description.

                  $desc = get_term_meta( $term->term_id, 'meta_description', true );

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

                  Сча поправлю тут пример, чтобы под тот код подходил и тот код тоже дополню чтобы description понимал...

                  1
                  Ответить1.5 года назад #
                  • Огромное спасибо good2
                    Вроде у Вас вот в этой строке ошибка:

                    <input type="text" name="extra[meta_description]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'description', 1 ) ) ?>"><br />

                    Нужно вместо $term->term_id, 'description' писать $term->term_id, 'meta_description', а то введённый текст не сохраняется unknw
                    И вуаля, всё работает bravo

                    Ответить1.5 года назад #
  • Александр

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

    1
    Ответить1.5 года назад #
Здравствуйте, !     Войти . Зарегистрироваться