Произвольный заголовок H1 для категорий WordPress/Woocommerce

Комментариев: 11

Каждый сайт, который сталкивается с задачей SEO-оптимизации нуждается в альтернативных заголовках H1 для страниц сайта. Например, есть у вас категория "Плитка", и вложенная в неё категория "Керамическая". Вроде бы всё логично, но если человек попадает на страницу "Керамическая", то здесь так и просится " Керамическая плитка". В хлебных крошах тоже не хочется отображать Плитка -> Керамическая плитка, а хочет просто "Плитка ->Керамическая".

Короче, что-то я тут объясняю, вы всё это уже понимаете, поэтому вот вам очень простое решение, которое я использую на своих проектах (решение не моё, где-то находил). Вставляем в functions.php:

<?php
$taxname = 'product_cat'; //В данном случае сработает для Woocommerce.

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>Заголовок H1</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 заголовок (h1)</span>
			</td>
		</tr>
		
	<?php
}

function add_new_custom_fields( $taxonomy_slug ){
	?>
	<div class="form-field">
		<label for="tag-title">Заголовок H1</label>
		<input name="extra[title]" id="tag-title" type="text" value="" />
		<p>SEO заголовок (h1)</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;
}
?>

Ну и теперь осталось вывести его в замен текущему заголовку. Но, было бы правильно выводить обычное название, если не указано альтернативное, как-то так:

<?php
if (!empty(get_queried_object()->term_id)) {
	$id = get_queried_object()->term_id;
        $taxomony = get_queried_object()->taxonomy;
}				
$title =  get_term_meta($id , 'title', 1 ); // Теперь в этой переменной h1 заголовок
	if ($title) {
	    echo $title;
	} elseif ($taxomony == 'product_cat' & !$title) {
	   echo woocommerce_page_title(); //Для Woocommerce
	} else {
           echo 'Здесь функция вывода, в разных шаблонах она разная, посмотрите, как выводится у вас и вставьте сюда стандартную функцию или переменную для вывода заголовка';
}
?>

Этот кусок кода нужно вставлять в шаблон архива и таксономии, для Woocommerce сюда: /wp-content/themes/тема/woocommerce/archive-product.php

Метки:
Уведомлять о новых комментариях
Уведомлять
guest
11 комментариев
Inline Feedbacks
View all comments
Дмитрий
Дмитрий
4 лет назад

Поле выводится, но когда вставляю вторую часть 🙁 Сайт ложится. В чем может быть причина? Помогите.

Александр
3 лет назад

Добрый день, спасибо за код, в админке доп поле появлось, однако при замене переменной заголовка в шаблоне, ничего не происходит. Кроме того ничего не происходит даже если удалить archive-product.php, и в файлах плагинах и в папке темы. Страница с категорией отображается без изменений.

Александр
3 лет назад

Проблему удалось решить. Всё из-за строчки <?php woocommerce_content(); ?>, в файле woocommerce.php

Илья
Илья
3 лет назад

Очень интересное решение. Но здесь не учтено, что в таком случае title страницы тоже тоже быть перезаписан

Igor-Basharin
3 лет назад

Спасибо за код, все просто и элегантно

Bogdan
3 лет назад

Применил более простой способ. Получилось случайно.
После первой функции, в файл functions.php вставляем следующий код:
/* Вывод title для категорий товаров */
add_filter(‘single_term_title’, ‘mayak_filter_single_cat_title’, 10, 1);
add_filter( ‘single_term_title’, ‘mayak_poduct_cat_title’, 10, 1);
function mayak_filter_single_cat_title() {
  $pci = get_queried_object()->term_id;
  return get_term_meta ($pci, ‘title’, true);
}
function mayak_poduct_cat_title($pct){
  if(empty($pct)){
    $pct = get_queried_object()->name;
  }
  return $pct;
}

Андрей
Андрей
3 лет назад

Подскажите, а как такое сделать для тегов и товаров?

Артем
Артем
3 лет назад

Привет! А можно сделать и как шорткод просто, чтоб выводить заголовок? Чтоб не ползать в сам шаблон, поскольку сейчас все на конструкторах Elementor и тп