(taxonomy)_edit_form_fields
Позволяет добавить дополнительные поля (произвольные поля или метаполя) на страницу редактирования элементов таксономии (термина).
Используйте (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(строка)
- Название таксономии.
Примеры
#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 );
#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 | Введена. |
Где вызывается хук
do_action( "{$taxonomy}_edit_form_fields", $tag, $taxonomy );