WordPress как на ладони

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

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

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

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

add_action( '(taxonomy)_edit_form_fields', 'wp_kama_taxonomy_edit_form_fields_action', 10, 2 );

/**
 * Function for `(taxonomy)_edit_form_fields` action-hook.
 * 
 * @param WP_Term $tag      Current taxonomy term object.
 * @param string  $taxonomy Current taxonomy slug.
 *
 * @return void
 */
function wp_kama_taxonomy_edit_form_fields_action( $tag, $taxonomy ){

	// action...
}
$tag(WP_Term)
Объект текущей таксономии
$taxonomy(строка)
Название таксономии.

Примеры

0

#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 );
0

#2 SEO мета-поля для термина

Этот класс предоставляет функциональность для добавления пользовательских мета-полей к терминам таксономии (категориям, тегам и т.д.) в WordPress. Эти поля используются для SEO, в частности, для указания метатегов title и keywords для каждого термина таксономии.

Класс определяет два статических массива: $metabox и $fields. Массив $metabox содержит одну запись для заголовка метабокса, а массив $fields содержит массив данных полей для каждого пользовательского поля.

Класс предоставляет несколько методов:

  • init(): Инициализирует класс и подключается к WordPress для добавления пользовательских полей в таксономии.

  • init_hooks(): Подключается к WordPress для добавления пользовательских полей в таксономии.

  • add_new_custom_fields(): Отображает пользовательские поля на странице добавления термина таксономии.

  • edit_new_custom_fields(): Отображает пользовательские поля на странице редактирования термина таксономии.

  • save_term_meta(): Сохраняет значения пользовательских полей при создании или редактировании термина таксономии.

Класс проверяет, имеет ли текущий пользователь необходимые разрешения для редактирования термина таксономии, и проверяет nonce для предотвращения несанкционированного доступа к пользовательским полям.

В целом, этот класс предоставляет удобный и настраиваемый способ добавления мета-полей SEO к терминам таксономии в WordPress.

final class Term_Seo_Meta_Fields {

	private static array $metabox = [
		'title' => 'SEO заголовки',
	];

	private static array $fields = [
		'title' => [
			'title' => 'SEO Title <title>',
			'desc' => '',
			'show_on_add' => true,
		],
		'keywords' => [
			'title' => 'SEO keywords <keywords>',
			'desc' => '',
			'show_on_add' => false,
		]
	];

	public static function init(): void {

		// Init later to have all taxonomies registered
		add_action( 'init', [ __CLASS__, 'init_hooks' ], 20 );
	}

	public static function init_hooks(): void {

		$taxes = get_taxonomies( [
			'public' => true,
			'publicly_queryable' => true,
		] );

		foreach( $taxes as $taxname ){

			// Fields when adding a taxonomy element
			add_action( "{$taxname}_add_form_fields", [ __CLASS__, 'add_new_custom_fields' ] );
			// Fields when editing a taxonomy element
			add_action( "{$taxname}_edit_form_fields", [ __CLASS__, 'edit_new_custom_fields' ] );

			// Saving when adding a taxonomy element
			add_action( "create_{$taxname}", [ __CLASS__, 'save_term_meta' ] );
			// Saving when editing a taxonomy element
			add_action( "edited_{$taxname}", [ __CLASS__, 'save_term_meta' ] );
		}
	}

	public static function add_new_custom_fields( $taxonomy ): void {

		$fields = array_filter( self::$fields, static fn( $fdata ) => ! empty( $fdata['show_on_add'] ) );

		if( ! $fields ){
			return;
		}

		?>
		<div class="form-field">
			<h4><?= self::$metabox['title'] ?></h4>
			<p><?= hl_placeholders()->names_html( 'global' ) ?></p>
		</div>
		<?php

		foreach( $fields as $name => $fdata ){
			?>
			<div class="form-field">
				<label for="tag-title"><?= $fdata['title'] ?></label>
				<input name="seotermmeta[<?= $name ?>]" id="tag-title" type="text" value=""/>
				<?php if( ! empty( $fdata['desc'] ) ){ ?>
					<p><?= $fdata['desc'] ?></p>
				<?php } ?>
			</div>
			<?php
		}

	}

	public static function edit_new_custom_fields( $term ): void {

		?>
		<tr class="form-field">
			<th colspan="2" style="padding: 0; font-weight: normal;">
				<h3><?= self::$metabox['title'] ?></h3>
				<p class="description">
					Плейсхолдеры: <?= hl_placeholders()->names_html( 'global' ) ?>
					<br><br>
					<code>description</code> указывается в поле "Описание" (плейсхолдеры там так же работают).
				</p>
			</th>
		</tr>
		<?php

		foreach( self::$fields as $name => $fdata ){
			?>
			<tr class="form-field">
				<th scope="row"><label><?= $fdata['title'] ?></label></th>
				<td>
					<input type="text" name="seotermmeta[<?= $name ?>]"
						   value="<?= esc_attr( get_term_meta( $term->term_id, $name, true ) ) ?>"
					>
					<?php if( ! empty( $fdata['desc'] ) ){ ?>
						<p class="description"><?= $fdata['desc'] ?></p>
					<?php } ?>
				</td>
			</tr>
			<?php
		}
	}

	public static function save_term_meta( $term_id ): void {

		if(
			empty( $_POST['seotermmeta'] ) ||
			! current_user_can( 'edit_term', $term_id ) ||
			(
				! wp_verify_nonce( $_POST['_wpnonce'], "update-tag_$term_id" )
				&&
				! wp_verify_nonce( $_POST['_wpnonce_add-tag'], "add-tag" )
			)
		){
			return;
		}

		$seometa = wp_unslash( $_POST['seotermmeta'] );

		foreach( $seometa as $meta_key => $val ){

			if( ! isset( self::$fields[ $meta_key ] ) ){
				/** @noinspection ForgottenDebugOutputInspection */
				wp_die( 'bad key' . esc_html( $meta_key ) );
			}

			$val = sanitize_text_field( $val );
			if( $val ){
				update_term_meta( $term_id, $meta_key, $val );
			}
			else{
				delete_term_meta( $term_id, $meta_key );
			}
		}
	}

}

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

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

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

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

Где используется хук в WordPress

Использование не найдено.
lincaseidhe 94lincaseidhe.ru
Редакторы: Kama 9648
39 комментариев
Полезные 3Вопросы 1 Все
    Войти