» » » Title, description, keywords и h1 для категорий (рубрик) WordPress
logotip

Title, description, keywords и h1 для категорий (рубрик) WordPress

Всем привет! Сегодня на seo-mayak.com я продолжу серию статей, посвященных категориям WordPress.

Займемся мы непростой на первый взгляд задачей, а именно, возьмем и сделаем независимые title, description и keywords для категорий или рубрик, как удобно.

Кроме того мы разберем функционал, который позволит вывести заголовок h1, отличный от названия категории.

Согласитесь, страница редактирования категорий в WordPress как-то обиженна разработчиками, хотя, кое-что они все же предусмотрели. Читайте статью до конца, будет интересно!

Но прежде всего хочу извинится перед своими читателями за то, что не отвечаю или не сразу отвечаю на комментарии и письма.

Я бы рад помочь многим, но в каждую конкретную ситуацию надо вникать, а на это у меня к сожалению просто нет времени. На всех меня все равно не хватит.

А сейчас пред нами стоит задача сделать независимые title, description, keywords и h1, с возможностью прописывать их отдельно на странице редактирования категорий. Поехали!

Создаем поля: title, description, keywords и h1

Для осуществления задуманного нам потребуется открыть в текстовом редакторе (рекомендую Notepad++, а также FTP клиент Notepad++) файл functions.php, что лежит в папке с темой.

В самое начало, после знака «<?php» вставляем следующее:

add_action("category_edit_form_fields", 'mayak_category_meta');
function mayak_category_meta( $term ) {
	?>
		<tr class="form-field">
			<th scope="row" valign="top"><label>Заголовок (title)</label></th>
			<td>
				<input type="text" name="mayak[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>"><br />
				<p class="description">Не более 60 знаков, включая пробелы</p>
			</td>
		</tr>
		<tr class="form-field">
			<th scope="row" valign="top"><label>Заголовок h1</label></th>
			<td>
				<input type="text" name="mayak[h1]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'h1', 1 ) ) ?>"><br />
				<p class="description">Заголовок страницы</p>
			</td>
		</tr>
		<tr class="form-field">
			<th scope="row" valign="top"><label>Ключевые слова</label></th>
			<td>
				<input type="text" name="mayak[keywords]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'keywords', 1 ) ) ?>"><br />
				<p class="description">Ключевые слова (keywords)</p>
			</td>
		</tr>
	<?php
}

В итоге, в админке на странице редактирования категорий должны появиться три новых поля:

Вы наверное заметили, что я упустил поле description. Мы сейчас его отдельно вставим в функцию, чтобы Вам было понятно, как добавлять новые поля.

Прямо в функции, после любого закрывающего тега «</tr>» вставляем код поля «description»:

<tr class="form-field">
<th scope="row" valign="top"><label>Краткое описание (description)</label></th>
<td>
<input type="text" name="mayak[description]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'description', 1 ) ) ?>"><br />
<p class="description">Краткое описание (description)</p>
</td>
</tr>

Таким образом мы создали четыре дополнительных поля:

Куда мы можем теперь записывать определенные данные. Такие поля еще называются «произвольными полями».

Радоваться конечно рано, так как пока эти поля «мертвые», т.е. написать в них можно что угодно, только вот после обновления страницы поля опять станут пустыми.

Почему так? Это потому, что мы создали только «каркас» и данные пока нигде не сохраняются. А схоронятся они должны где? Правильно, в базе данных.

Давайте это дело поправим. Ниже нашей первой функции вставляем еще одну:

function mayak_save_meta( $term_id ) {
	if ( ! isset($_POST['mayak']) )
		return;
	$mayak = array_map('trim', $_POST['mayak']);
	foreach( $mayak as $key => $value ){
		if( empty($value) ){
			delete_term_meta( $term_id, $key );
			continue;
		}
		update_term_meta( $term_id, $key, $value );
	}
	return $term_id;
}
add_action("create_category", 'mayak_save_meta');
add_action("edited_category", 'mayak_save_meta');

Теперь, если попробовать обновить страницу редактирования рубрики, то все, что мы написали в новых полях, останется на месте.

Ну хорошо, все вроде сохраняется, и понятно, что сохраняется в БД. Но где именно, в какой таблице?

Давайте этот момент разберем немного подробней.

Таблица wp_termmeta

С выходом версии 4.4, разработчиками WordPress в базу данных была внедрена новая таблица, которая называется wp_termmeta. Вот она:

Получается, что появилась еще одна, уже четвертая таблица в базе данных WordPress, которая так или иначе относится к категориям. О таблицах: wp_terms, wp_term_taxonomy и wp_term_relationships я подробно писал тут.

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

Если таблица пуста, то она выглядит следующим образом:

Давайте разберемся, что это за поля, и что в их записывается.

meta_id — Порядковый идентификатор, который присваивается каждой связке двух полей meta_key -> meta_value (ключ -> значение ключа).

term_id — Идентификатор категории, к которой прикрепляется связка полей meta_key -> meta_value.

meta_key — Непосредственно сам ключ. Под ключем подразумевается кодовое слово, которое может состоять из произвольного набора латинских символов. Для чего создается это кодовое слово, мы поймем немного позже, а пока скажу, что к каждому «ключу» обязательно привязывается «значение», содержимое поля meta_value.

meta_value — Значение ключа, которым может быть что угодно. Ниже, к данному полю мы еще вернемся, так что будет понятней, надеюсь.

Теперь давайте заполним поля и посмотрим, что пропишется в таблице wp_termmeta:

Смотрим в таблицу:

Итак, в поле meta_id прописывается присвоенный БД идентификатор, который закрепляется за каждой связкой ключ->значение, начиная с единицы.

В поле term_id указывается ID категории, к которой будут привязаны связки ключей и их значений.

На поле meta_key остановимся немного подробней. Откуда, например, ваялся ключ «title»?

Что такое key (ключ) и откуда он берется

Ключ «title» был указан мной при составлении первой функции-каркаса. Обратите внимание на строчку №6:

<input type="text" name="mayak[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>">

Надеюсь становится понятно, что ключ «title» — это ничто иное, как имя поля —name="mayak[title]" то, что в квадратных скобках. Имя может быть любым набором англ. символов.

Все что будет вписано в поле с именем [title], автоматически станет значением ключа «title» и будет занесено в БД, в колонку meta_value таблицы wp_termmeta.

Согласитесь, довольно удобную штуку внедрили разработчики. Теперь можно создавать для категорий неограниченное количество связок ключ->значение, что открывает массу возможностей, например можно закрепить за категорией уникальную картинку и не только, но об этом уже следующих статьях.

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

В качестве режиссера сего действа выступают сразу три функции

add_term_meta() — запись;
update_term_meta() — перезапись (обновление);
delete_term_meta() — удаление.

Есть еще одна функция, которая называется get_term_meta(). Эта функция получает из БД, а конкретно из таблицы wp_termmeta, определенные данные (связки ключ->значение), которые можно вывести на экран или продолжить с ними дальнейшие операции.

Итак, мы знаем где хранятся нужные нам данные, давайте теперь попробуем их от туда достать и вывести в нужном месте. Начнем пожалуй с заголовка title.

Отдельный заголовок title для категорий

Сам WordPress и все SEO плагины берут данные для title из заголовка категории, вернее из функции, которая выводит этот заголовок на экран. Называется функция single_term_title().

На заметку! До версии WordPress 3.1.0, вместо функции single_term_title(), использовалась функция single_cat_title().

Работу этой функции нам и надо будет подкорректировать, чтобы решить поставленную задачу.

Как мы это сделаем? Все просто! Функция single_term_title() имеет в своем арсенале хук single_cat_title, с помощью которого мы подменим заголовок категории на наш title, причем прямо перед выводом его на экран.

Для этого в файл funtions.php вставляем такую функцию:

function mayak_filter_single_cat_title($term_name) {
    $terms = get_category( get_query_var('cat'));
    $cat_id = $terms->cat_ID;
    $term_name = get_term_meta ($cat_id, 'title', true);
	return $term_name;	
}
add_filter('single_cat_title', 'mayak_filter_single_cat_title', 10, 1 );

Теперь, если мы заполним поле title, то именно с этого поля WordPres и все SEO плагины будут брать заголовок для поисковой выдачи:

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

Мне показалось такое положение дел нежелательным, так как после внедрения данного функционала, в один миг пропадут все заголовки title взятые из названия рубрик, так как новые поля title изначально будут пустыми.

Чтобы предотвратить подобную ситуацию, я решил составить еще одну функцию, которая при пустом поле title, будет брать заголовок из названия категории:

function mayak_single_cat_title ($term_name){
    if(empty($term_name)){
	    $terms = get_category( get_query_var( 'cat' ));
	    $cat_id = $terms->cat_ID;
	    $term_name = get_cat_name($cat_id);
	}
	return $term_name;
}
add_filter( 'single_cat_title', 'mayak_single_cat_title', 10, 1 ); 

Теперь должно быть все в порядке:

По-моему подстраховка в этом случаи не помещает. Идем дальше.

Отдельный заголовок h1 для категории

Стоит сказать, что заголовок категории не обязательно должен быть обернут в теги h1, ничего страшного не будет, если это будет тег h2. Более подробно свои мысли по этому поводу я выражал здесь.

Вы наверняка заметили, что вместо заголовка категории, бравшегося из названия, теперь отображается содержимое поля title. У меня это выглядит так:

Так получилось из-за нашего вмешательства в функцию single_term_title(). Помните мы заголовок подменили?

Так конечно не должно быть и ситуацию надо дорабатывать, поэтому придется создать свою функцию вывода заголовка категории, вернее две функции.

Сначала нам надо получить из базы данных стандартный заголовок категории, но в обход функции single_term_title(), так как она у нас уже занята другим делом, а именно выводом заголовка title.

Для этого файл functions.php вставляем:

function mayak_cat_caption($caption) {
	$terms = get_category( get_query_var( 'cat' ));
	$cat_id = $terms->cat_ID;
	$caption = get_cat_name($cat_id);
    echo $caption; 
}

Теперь мы имеем «дубликат» заголовка категории, но для чего он нам нужен? А нужен он нам будет опять же для подстраховки. Если вдруг поле h1 окажется пустым, то будет выведен стандартный заголовок категории, т.е наш дубликат.

А вот и сама функция вывода отдельного заголовка h1:

function mayak_cat_h1($name_cat) {
	$terms = get_category( get_query_var( 'cat' ));
	$cat_id = $terms->cat_ID;
	$name_cat = get_term_meta ( $cat_id, 'h1', true );
    echo $name_cat;
	if(empty($name_cat)){
	   echo	mayak_cat_caption($caption);
	}
}

Далее, ищем в папке с темой файлы archive.php или categore.php, зависит от шаблона. В этих файлах ищем теги заголовка категории (это может быть h1 или h2) и заключенную в них функцию:

<?php single_term_title() ?>

У кого тема старая, то ищем:

<?php single_cat_title() ?>

И заменяем на только что созданную:

<?php mayak_cat_h1($name_cat) ?>

Проверим результат:

Заполняем поле:

Все работает. Если что-то не получается, прежде чем задавать вопросы, внимательно все проверьте. Функций много, поэтому легко запутаться и получить ошибки. Идем дальше:

Отдельный description для категорий

Если Вы пользуетесь SEO плагинами, например All in One SEO Pack, то они выводят в качестве description для категорий первые 160 символов и текста, т.е. из поля «Описание». Меня лично это вполне устраивает.

Но если кто-то хочет иметь возможность самостоятельно заполнять краткое описания для категории, то в плагинах эту функцию надо отключить, чтобы description не дублировался.

Например в All in One SEO Pack можно отключить вывод description только для всего сайта, вот так:

function mayak_remove_seo_description( $data ){
return false;
}
add_filter( 'aioseop_description', 'mayak_remove_seo_description' );

Отдельно для категорий, без правки кода самого плагина, вывод description не отключается, по крайней мере у меня не получилось. Если у кого хватило ума это сделать, буду рад пообщаться в комментариях.

Итак, выводим отдельный description для категорий. Функция:

function mayak_cat_description($description){
	if(is_category()){
	$desc = get_category( get_query_var( 'cat' ));
	$category_id = $desc->cat_ID;
	$description = get_term_meta ( $category_id, 'description', true );
	if(!empty($description)){
	$meta = '<meta name="description"  content="'.$description.'" />'."\n";
	}
    else {		   
	   $description = wp_filter_nohtml_kses(substr(category_description(), 0, 280));
	   $meta = '<meta name="description"  content="'.$description.'" />'."\n";	   
	}
	echo $meta;
	}
}
add_action('wp_head', 'mayak_cat_description', 1, 1);

Вот и все! Смотрим результат:

Все встало на места, чего и добивались. Если по каким-то причинам поле description не будут заполнено, то автоматически будет взято 160 символов из текста описания категории.

Нам осталось вывести ключевые слова из одноименного поля.

Отдельный keywords для категорий

Нужны или нет meta keywords для сайта, споры не утихают по сей день! Гугл и Яндекс давно дали понять, что эти meta их больше не интересуют. Однако ничего неизвестно, как на это смотрит Mail.ru и другие поисковики среднего формата, поэтому считаю целесообразным пока не пренебрегать meta keywords.

Далее я буду многословен. Функция:

function mayak_cat_keywords($keywords){
	if(is_category()){
	$terms = get_category( get_query_var( 'cat' ));
	$cat_id = $terms->cat_ID;
	$keywords = get_term_meta ( $cat_id, 'keywords', true );
	echo ''."\n";
	}
}
add_action('wp_head', 'mayak_cat_keywords', 1, 1);

Результат:

Все должно работать на ура! Но если вдруг вы заметили ошибки, или недочет в функционале, прошу, напишите об этом в комментариях или мне на почту, буду Вам благодарен!

В следующей статье я расскажу, как добавить и закрепить за категорией уникальную картинку. Естественно будет представлен весь функционал, так что надеюсь будет интересно.

В последнее время часто писать не получается и чтобы не пропустить интересный материал, подписывайтесь на обновления блога и получайте анонсы статей на почту.

До встречи!

С уважением, Виталий Кириллов

Статьи по теме:

Title, description, keywords и h1 для категорий товаров Woocommerce
Картинки для категорий (рубрик) — изображения WordPress
Редактор для категорий (рубрик), меток и произвольных таксономий
Шаблоны для категорий WordPress. Как сделать каталог из рубрики
Категории WordPress — термы и таксономии
wp_list_categories() — как выводить рубрики WordPress

Комментарии: 132

  1. Alex:

    Это сделано, чтобы открыть для индексации Рубрики? Их запрещали же индексировать

    Ответить
    • Виталий Кириллов:

      Если сделать страницу с категорией достойной поисковой выдачи, то можно и открыть.

      Ответить
      • source:

        если прописаны канонические URL — можно ли открывать страницы рубрик и меток для индексации?

        Ответить
        • Виталий Кириллов:

          Можно, если данные страницы достойны выдачи и если канонические урлы корректные.

          Ответить
  2. Дмитрий:

    Попробовал добавление описания «description», всё получилось. Спасибо огромное. Один вопрос, если ничего не добавить в описание, то в коде мета тег «description» выводится пустым. Что надо сделать чтобы в «description» выводилась информация например несколько первых слов верхней записи из этой рубрики?

    Ответить
    • Виталий Кириллов:

      Думаю Вы правы Дмитрий. description имеет важное значение и подстраховка не помешает. Функцию доработал.

      Ответить
      • Дмитрий:

        Попробовал новый код, но при пустом поле описания, при редактировании рубрики, текст всё-равно не подхватывается из анонса верхней записи… Я поразмыслил, в принципе это и не существенно, т.к. если продвигаешь страницу рубрики, то по любому нужно добавлять СЕО описание в дескрипшн, а не полагаться на то, что подхватиться первое предложение верхней записи.

        Ответить
  3. Дмитрий:

    Ещё одна накладка. Ваш код добавляет мета тег «description» не только в рубриках, но и в записях и на страницах. Я в записях и на страницах добавляю «description» другим кодом. Как сделать, чтобы ваш код добавлял «description» только в рубриках?

    Ответить
    • Виталий Кириллов:

      Поправил.

      Ответить
      • Дмитрий:

        Всё заработало на ура, как вы говорите ))) Пустых дескрипшнов ни на страницах ни в записях больше нет. Огромное спасибо за ваш труд! Удачи вам в работе!

        Ответить
  4. Ксенья Юрьевна:

    Здравствуйте, Виталий, статья такая длинная, под конец уже не внимательно читала, нужно еще раз. Поняла, что произошли революционные изменения, если ими пользоваться. Возникают вопросы: Эти новые поля можно вместо Seo плагина применить? Если так, то все старые статьи придется переписывать?
    У меня сейчас новая тема, бесплатная, но лучше, что было перед этим. Заголовки h1 правильно выведены, микроразметка для статей готовая. Поля бы с удовольствием внедрила, если вместо плагина.
    Вообще вы, молодец, замечательный программист, я другого такого сайта не знаю.

    Ответить
    • Виталий Кириллов:

      Здравствуйте, Ксения Юрьевна! Спасибо за теплые слова. Можно конечно заменить seo плагины своим функционалом, но для этого надо будет еще создавать поля для страниц с записями, статических страниц и главной страницы. Вопрос в том, стоит ли это делать? Что касается этой статьи, то все добавления касаются только страницы редактирования категорий (рубрик).

      Ответить
      • Дмитрий:

        Мне тоже было интересно, как раз отказаться от использования сторонних плагинов для внедрения мета данных. Для изменения метаданных в записях и на статических страницах, в вордпрессе есть штатная функция, называется «Дополнительные поля». А вот внедрение мета данных в рубриках разработчики не продумали и ваша статья исправляет их недоработку! Поэтому мне теперь никакие SEO плагины не нужны, ещё раз спасибо!

        Ответить
  5. Zoya:

    Виталий, спасибо за Вашу работу, Вы прекрасный специалист! Давно искала подобную информацию. Все получилось. Мне хватило первых трех функций и функции для вывода keywords. Как всегда все очень подробно и доступно описано для понимания даже начинающим.

    Ответить
  6. Дмитрий:

    Виталий, я добавляю дополнительные функции не в <code>functions.php</code>, а с помощью самодельного плагина, файл <code>my-functions.php</code> с содержимым:
    <code><?php
    /**
    * Plugin Name: Моя альтернатива файлу functions.php
    */

    //Cюда ставим код

    ?></code>
    Закидываем в папку plugins. Все, активируем из админки, в плагинах. Всё работает нормально!

    А если добавить код в файл <code>functions.php</code> моей темы, как вы пишете в статье, то поле описания "description" при редактировании рубрики <strong>не появляется</strong>! А вот строка с пустым мета тегом "description" появляется в исходном коде рубрик.

    Я пробовал на трёх разных сайтах. Методом проб исключено: кеш браузера, влияние других функций из файла <code>functions.php</code> (всё удалял оставляя только код добавления поля "description"), разные версии вордпресс (опробовано на версиях WordPress 4.5, WordPress 4.7.2, WordPress 4.7.3). Любые функции не выводящие полей в админке, работают нормально при вставке кода в <code>functions.php</code>, даже половина вашего кода работает, выводятся мета теги в исходном коде. Из-за чего такой косяк?

    Ответить
    • Виталий Кириллов:

      Если поля не появляются, значит не работает хук category_edit_form_fields. Возможно действие хука отключается каким-то плагином или функцией в шаблоне.

      Также возможно просто надо вызвать событие перед самой функцией, т.е. поставить строчку:

      add_action("category_edit_form_fields", 'mayak_category_meta');

      Выше функции mayak_category_meta().

      Трудно точно сказать в чем причина, надо копать.

      Ответить
      • Дмитрий:

        Получилось, рассказываю…

        На совершенно чистом сайте, я вставил код в самое начало файла functions.php после тега <?php и поле описания "description" на странице редактирования рубрики появилось!

        Я попробовал вставить код в конце файла functions.php и сайт перестал открываться, ошибка 500. Любые удаления кода, или прописывание снова в начале не помогали. Пришлось поменять файл functions.php на первоначальный и восстановить базу данных из бекапа. Сайт снова стал работать.

        Виталий, вы можете прокомментировать почему код приводил к ошибке 500 и сайт переставал открываться?

        Ответить
        • Виталий Кириллов:

          Дмитрий, у меня все работает! Только что проверил на стандартной теме WordPress — Twenty Twelve.
          Что мне тут комментировать…
          Приведите код, что Вы вставляете.

          Ответить
          • Дмитрий:

            Для дополнительных функций я буду использовать дополнительный файл функций. В таком варианте никаких конфликтов не возникает. Ещё раз огромное спасибо за код!

            Ответить
  7. Елена:

    Добрый день!
    Спасибо все работает.
    Одну тему настроила (тема Typecore)
    а во второй теме (ColorMag) не изменяет h1. можете помочь? (в файле archive.php заменяю функцию single_cat_title(), то h1 пропадает.

    Ответить
    • Виталий Кириллов:

      Елена, здравствуйте! Кот не отбразился. Воспользуйтесь преобразователем и приведите код файла еще раз. Постараюсь помочь.

      Ответить
      • Елена:

        Добрый день!
        Я разобралась сама. Спасибо за ответ.

        Ответить
  8. Юлия:

    Я хочу вывести мета теги в метках. Для этого заменила в первой функции хук «category_edit_form_fields» на «edit_tag_form_fields», после этого поля появились в метках. Теперь нужно чтоб данные сохранялись. Для этого во второй функции я прописала так

    function mayak_save_meta( $term_id ) {
    	if ( ! isset($_POST['mayak']) )
    		return;
    	$mayak = array_map('trim', $_POST['mayak']);
    	foreach( $mayak as $key => $value ){
    		if( empty($value) ){
    			delete_term_meta( $term_id, $key );
    			continue;
    		}
    		update_term_meta( $term_id, $key, $value );
    	}
    	return $term_id;
    }
    add_action("create_tag", 'mayak_save_meta');
    add_action("edited_tag", 'mayak_save_meta');

    у меня не срабатывает((( Подскажите, пожалуйста, что нужно исправить что данные сохранялись???

    Ответить
    • Виталий Кириллов:

      Юлия, для сохранения значения полей на страницах редактирования меток используйте хук «edit_term».

      add_action("edit_term", 'mayak_save_meta');

      Этот хук работает, как для меток, так и для категорий.

      Ответить
      • Юлия:

        А для редактирования?

        Ответить
        • Виталий Кириллов:

          И сохранение и редактирование!

          Ответить
  9. Юлия:

    Я хочу вывести для меток. Подскажите, пожалуйста, что не так я прописала в этой функции?

    function mayak_filter_single_term_title($term_name) {
        $terms = get_post_tag( get_query_var('term'));
        $term_id = $terms->term_ID;
        $term_name = get_term_meta ($term_id, 'title', true);
    	return $term_name;	
    }
    add_filter('single_cat_title', 'mayak_filter_single_cat_title', 10, 1 );

    когда здесь

    add_filter('single_cat_title', 'mayak_filter_single_cat_title', 10, 1 );

    заменяю на

    add_filter('single_term_title', 'mayak_filter_single_term_title', 10, 1 );

    то сайт перестает работать

    Ответить
    • Виталий Кириллов:

      Правильно так:

      function mayak_filter_single_tag_title($tag_name){
      	$tags = get_query_var( 'tag_id' );
      	$tag_name = get_term_meta ( $tags, 'title', true );
      	return $tag_name;	
      }
      add_filter( 'single_tag_title', 'mayak_filter_single_tag_title', 10, 1 );
      Ответить
      • Юлия:

        Все равно не срабатывает nanoclinic.com.ua/stm_service_category/surgery/?post_type=stm_service

        В БД все сохраняет, а на сайт не выводит. я прописала title и description. Выводится только стандартный title. Может причина в том что стоит плагин All in One SEO Pack?

        Ответить
        • Виталий Кириллов:

          Код не прошел, в следующий раз воспользуйтесь преобразователем.

          А что это за ссылка? У страниц меток другой урл.

          Ответить
          • Юлия:

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

            add_action("edit_tag_form_fields", 'mayak_category_meta');
            function mayak_category_meta( $term ) {
            	?>
            		<tr class="form-field">
            			<th scope="row" valign="top"><label>Заголовок (title)</label></th>
            			<td>
            				<input type="text" name="mayak[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>"><br />
            				<p class="description">Не более 60 знаков, включая пробелы</p>
            			</td>
            		</tr>
            	
            	
            		<tr class="form-field">
            <th scope="row" valign="top"><label>Краткое описание (description)</label></th>
            <td>
            <input type="text" name="mayak[description]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'description', 1 ) ) ?>"><br />
            <p class="description">Краткое описание (description)</p>
            </td>
            </tr>
            		
            	<?php
            }
            
            
            function mayak_save_meta( $term_id ) {
            	if ( ! isset($_POST['mayak']) )
            		return;
            	$mayak = array_map('trim', $_POST['mayak']);
            	foreach( $mayak as $key => $value ){
            		if( empty($value) ){
            			delete_term_meta( $term_id, $key );
            			continue;
            		}
            		update_term_meta( $term_id, $key, $value );
            	}
            	return $term_id;
            }
            add_action("edit_term", 'mayak_save_meta');
            
            
            
            function mayak_filter_single_tag_title($tag_name){
            	$tags = get_query_var( 'tag_id' );
            	$tag_name = get_term_meta ( $tags, 'title', true );
            	return $tag_name;	
            }
            add_filter( 'single_tag_title', 'mayak_filter_single_tag_title', 10, 1 );
            Ответить
            • Виталий Кириллов:

              По коду все правильно, у меня такой вариант работает. Может вы не на тех страницах результат проверяете. В урлах меток обязательно должен быть /tag/.

              Ответить
              • Юлия:

                Может причина в том что стоит плагин All in One SEO Pack?

                Ответить
                • Виталий Кириллов:

                  У меня тоже стоит этот плагин.

                  Ответить
                  • Юлия:

                    У Вас включено «Перезаписывать заголовки»?

                    Ответить
                    • Виталий Кириллов:

                      Включено. В общем Юлия копайте.

                    • Юлия:

                      Вот страница именно меток

                      тайтл прописала «тест», но он не выводится

                    • Виталий Кириллов:

                      Юлия, вы зачем урлы кириллицей пишите? Я снес ссылку, так как она будет считаться битой. Вот какой должен быть правильный урл данной страницы nanoclinic.com.ua/tag/krasivaia-ulybka/.

  10. Юлия:

    может причина в этой функции?

    function _wp_render_title_tag() {
    	if ( ! current_theme_supports( 'title-tag' ) ) {
    		return;
    	}
    
    	echo '<title>' . wp_get_document_title() . '</title>' . "\n";
    }
    Ответить
    • Виталий Кириллов:

      Юля попробуйте убрать условие из функции:

      if ( ! current_theme_supports( 'title-tag' ) ) {
      		return;
      	}
      Ответить
  11. Юлия:

    Все равно не срабатывает. Может есть функция, которая перезаписывает title для wordpress?

    Ответить
    • Виталий Кириллов:

      Все возможно.

      Ответить
  12. Evgeny:

    Виталий привет! Если используется плагин AllinoneSeoPack, то наверное нужно по твоей рекомендации сделать такие поля для рубрик. Я использую плагин SEO by Yoast и этот плагин сам формирует все описанные поля. У меня они кстати все заполнены.

    Ответить
  13. Владимир:

    Искал подобный функционал под woocommerce, для Категорий и меток. Подобное не делали?

    Ответить
    • Виталий Кириллов:

      По-моему этот функционал есть в арсенале многочисленных дополнений к woocommerce.

      Ответить
      • Юрий:

        Виталий, можете порекомендовать такие дополнения для woocommerce? К сожалению я не смог найти. А может быть можно как-нибудь допилить Ваш код под категории и метки woocommerce?

        Ответить
        • Виталий Кириллов:

          Допилить конечно можно, только где на все время найти…

          Ответить
  14. Антон:

    Виталий подскажите плиз как будет время, не много наверно не в эту тему..у меня вопрос, по умолчанию в редакторе любой записи prntscr.com/f47k71 в титл(1) прописывается с заголовка, 2 — первое что написано в публикации и 3 это ключи их вручную. Суть моего вопроса следующая — нужно ли в поле 1-2 писать дополнительно, отличающееся от заголовка и описание? Либо оставить по умолчанию как есть? Для сео как лучше? За ранее спасибо)

    Ответить
    • Виталий Кириллов:

      Можно и не писать, просто заголовок поста можно делать длиннее чем title, ограничений нет.

      Ответить
      • Антон:

        Понял, спасибо Виталий

        Ответить
  15. Сергей:

    Подскажите пожалуйста, а как удалить из тайтл, приставку с названием сайта?

    Ответить
    • Виталий Кириллов:

      Почитайте статью по функцию wp_title.
      Если Вы пользуетесь SEO плагином All in One SEO Pack, то обратите внимание раздел «Настройка заголовков». Подробней тут.

      Ответить
      • Сергей:

        Виталий, в шаблоне не нашнашел я где подставляется подставляется <?php bloginfo('name') или чтото другое…
        Тайтл формирует ваша функция указанная выше:

        function mayak_filter_single_cat_title($term_name) {
        $terms = get_category( get_query_var('cat'));
        $cat_id = $terms->cat_ID;
        $term_name = get_term_meta ($cat_id, 'title', true);
        return $term_name;
        }
        add_filter('single_cat_title', 'mayak_filter_single_cat_title', 10, 1 );

        Но к ней добавляется через дефис название сайта, вот так:

        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <title>Мой тайтл — Название сайта</title>
        <meta name="description" content="Дескрипшн категории" />

        Seo-плагины такие как All in One SEO Pack или Yoast отключены. Где искать
        Файл header.php имеет следующий код:

        <html <?php language_attributes(); ?>>
        <head>
        <meta charset="<?php bloginfo( 'charset' ); ?>">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <?php if ( is_singular() && pings_open( get_queried_object() ) ) : ?>
        <link rel="pingback" data-link="<?php bloginfo( 'pingback_url' ); ?>">
        <?php endif; ?>
        <?php wp_head(); ?>
        </head>

        Ответить
        • Виталий Кириллов:

          Здравствуйте Сергей!
          Если в header.php нет функции wp_title(), тогда title в вашей теме скорее всего выводиться через хук wp_head.
          Т.е. где-то (возможно в файле functions.php) есть функция, формирующая title, там и надо искать.

          Ответить
  16. Dimax:

    Пользуюсь многими решениями от СЕО-маяк, назрел очередной вопрос про H1 в категориях и решение нашел как всегда здесь. По существу: напишите плз отдельную функцию, если нужно ТОЛЬКО H1 в категориях, без тайтла и дескрипшена,которые у меня обрабатывает Yoast seo?? Автор прошу помощи!

    Ответить
    • Виталий Кириллов:
      add_action("category_edit_form_fields", 'mayak_category_meta');
      function mayak_category_meta( $term ) {
      	?>
      		<tr class="form-field">
      			<th scope="row" valign="top"><label>Заголовок h1</label></th>
      			<td>
      				<input type="text" name="mayak[h1]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'h1', 1 ) ) ?>"><br />
      				<p class="description">Заголовок страницы</p>
      			</td>
      		</tr>
      	<?php
      }
      function mayak_save_meta( $term_id ) {
      	if ( ! isset($_POST['mayak']) )
      		return;
      	$mayak = array_map('trim', $_POST['mayak']);
      	foreach( $mayak as $key => $value ){
      		if( empty($value) ){
      			delete_term_meta( $term_id, $key );
      			continue;
      		}
      		update_term_meta( $term_id, $key, $value );
      	}
      	return $term_id;
      }
      add_action("create_category", 'mayak_save_meta');
      add_action("edited_category", 'mayak_save_meta');
      function mayak_cat_caption($caption) {
      	$terms = get_category( get_query_var( 'cat' ));
      	$cat_id = $terms->cat_ID;
      	$caption = get_cat_name($cat_id);
          echo $caption; 
      }
      function mayak_cat_h1($name_cat) {
      	$terms = get_category( get_query_var( 'cat' ));
      	$cat_id = $terms->cat_ID;
      	$name_cat = get_term_meta ( $cat_id, 'h1', true );
          echo $name_cat;
      	if(empty($name_cat)){
      	   echo	mayak_cat_caption($caption);
      	}
      }

      Вызов в файле:

      <?php mayak_cat_h1($name_cat) ?>
      Ответить
  17. Наталья:

    meta property=»og:url» content=» » /
    Виталий, очередное спасибо.
    Делюсь своим материалом в благодарность, если необходимо для опер граф урл вывести. Сегодня кучу времени убила, чтобы понять, как его вставить… А то, если рубрики давать в индексацию, то нужно, чтобы в них все достойно было.

    Ответить
  18. Наталья:

    самое важное не отразилось — echo $_SERVER[«REQUEST_URI»]
    Если не отразится, а Вам интересно, подскажите, как кусок кода показать

    Ответить
  19. Наталья:

    Виталий, а не сложно осветить такой вопрос? У меня автоматом новости уходят на RSS, твитер и фейсбук. Если к первым претензий нет, то в фейсбук картинку из новости не берет (берет запасную — логотип). Это не красиво — все новости с одинаковым изображением. Начала разбираться. Оказалось, что у фейсбук требование к фото по размеру — не меньше, чем 220*200. В у меня — 200*130. Все миниатюры переделать трудоемко. Можно в функции для og: указать, чтобы сервис брал фото из статьи?

    Ответить
  20. Наталья:

    Я вроде сделала это! w3 не ругается. Для отдельных записей сделала вывод в og:img не миниатюру, а первую картинку. Осталось написать новую статью и проверить, как отразится постинг.
    Использовала Вашу функцию. Доделала ее для рубрик

    function wptuts_opengraph_for_posts() {
        if ( is_singular() ) {
            global $post;
            setup_postdata( $post );
            $output = '<meta property="og:type" content="article" />' . "\n";
            $output .= '<meta property="og:title" content="' . esc_attr( get_the_title() ) . '" />' . "\n";
            $output .= '<meta property="og:url" content="' . get_permalink() . '" />' . "\n";
            $output .= '<meta property="og:description" content="' . esc_attr( get_the_excerpt() ) . '" />' . "\n";
            if(catch_that_image() != '')
    $output .= '<meta property="og:image" content="' . catch_that_image() . '" />' . "\n";
    else {
    $output .= '<meta property="og:image" content="https://nataliablogs.ru/wp-content/uploads/2016/08/%D0%B2%D0%BE%D1%8F%D0%B6-%D0%B8%D0%BA%D0%BE%D0%BD%D0%BA%D0%B0.jpg" />' . "\n";
    }
            echo $output;
        }
    if ( is_archive() ) {
            global $post;
            setup_postdata( $post );
            $output = '<meta property="og:type" content="article" />' . "\n";
            $output .= '<meta property="og:title" content="По миру без турфирмы | Способы путешествовать почти бесплатно." />' . "\n";
            $output .= '<meta property="og:url" content="' . $_SERVER["REQUEST_URI"] . '" />' . "\n";
            $output .= '<meta property="og:description" content="' . esc_attr( get_the_excerpt() ) . '" />' . "\n";
            if ( has_post_thumbnail() ) {
                $imgsrc = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'medium' );
                $output .= '<meta property="og:image" content="' . $imgsrc[0] . '" />' . "\n";
            }
            echo $output;
        }
    }
    Ответить
  21. Наталья:

    а для вывода урла первой картинки в записи нашла функцию

    function catch_that_image() {
      global $post, $posts;
      $first_img = '';
      ob_start();
      ob_end_clean();
      $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
      $first_img = $matches [1] [0];
       if(empty($first_img)){ //Defines a default image
        $first_img = "Путь до заглушки";
      }
      return $first_img;
    }
    Ответить
    • Виталий Кириллов:

      Здравствуйте, Наталья!
      Спасибо за интересное дополнения к статье.
      Уверен, многим это окажется полезным.

      Ответить
  22. Андрей:

    Добрый день! Огромное спасибо, очень познавательно и на практике применил, но не все. Возник вопрос относительно внедрения H1. Не получается, точнее — не могу найти ни

    <?php single_cat_title() ?>

    ни

    <?php single_term_title() ?>

    в указанных вами файлах их нету… можно вам сюда скинуть содержание этих файлов, чтобы вы посмотрели, куда его втулить? по ходу там вообще тайтла и Н1 для рубрик нету… как его внедрить. спасибо за помощь.

    кстати, придумал, как сделать так, чтобы не дублировались Дискрипшен, Кейвордс и Тайтл при использовании Ал ин Сео Пак. в настройках плагина есть поле, куда можно вписать адреса, на которых его действие не распространяется… вот)

    Ответить
    • Виталий Кириллов:

      Добрый день, Андрей!
      Кидайте содержание, я посмотрю по возможности.

      Ответить
  23. Андрей:

    Добрый день! Еще раз))) К предыдущему вопросу добавлю еще один, если можно.

    Смотрите, после установки кода стал не так, как хотелось бы, отображаться Тайтл рубрики. Например, было так:

    Москва | Города России

    а стало:

    Москва — Города России

    вот… все бы ничего, но код не очень красиво смотрится:

    <title>Москва — Города России</title>, а было:

    <title>Москва | Города России</title>

    Поняли, про что я? Записи, поиск, архивы — все выводится нормально, то есть с «|». А вот рубрики стали выводиться с «—». Подскажите, как подправить?) Заранее спасибо.

    Ответить
    • Виталий Кириллов:

      Здравствуйте! В моих функциях выводится только заголовок. Приставка к title и знаки разделения указываются: либо в seo-плагинах, либо непосредственно в файле header.php, есть и другие варианты, зависит от шаблона.

      Ответить
      • Андрей:

        Спасибо за ответ! Виталий, но суть то в том, что у меня до установки кода был вертикальный разделитель! Когда устанавливаю код — становится длинное тире! Пробовал убрать — все возвращается, опять становится вертикальный разделитель. Я не говорю, что ваш код устанавливает тире, просто может он его вытягивает откуда-то, из другого кода, того же Хедер или Функшен. У меня например через функшен задается вот какой код:

        <title><?php wp_title( '|', true, 'right' ); ?></title>

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

        Просто хочется разобраться, почему происходит такое изменение… буду благодарен за помощь. кстати, заметил, что недавно несколько картинок в индекс попало — у них тоже идет приставка не вертикальная, а тире… связано не может быть? до этого картинки не попадали в индекс никогда…

        Ответить
      • Андрей:

        Виталий, в общем чуток еще покопал. Смотрите, создаю новую рубрику — отображается по нормальному, то есть с вертикальным, и даже с учетом установленного вашего кода. Видимо, дело не в нем все-таки… Пробовал даже переименовать урл рубрики — и сразу все становится нормально. Вот запара… Подскажите, в чем может быть дело? Откуда-то оно же берет это тире… Переименовывать рубрики не могу, так как они в индексе, не хотелось бы проводить такие эксперименты.

        Так как у меня не получается с приставкой тайтл, скажите, вы можете сказать, что изменить в вашем коде, чтобы приставки этой не было вообще, то есть того, что идет после разделителя. спасибо.

        Ответить
        • Виталий Кириллов:

          Андрей, чтобы убрать приставку и разделитель? надо в плагине All in One Seo Pack изменить настройки в опции «Настроки» заголовков.
          По умолчанию там везде стоит приставка «| %blog_title%», вот этот код и выводит приставку title и разделитель.

          Ответить
    • Денис:

      В моем шаблоне был такой код
      <?php the_archive_title( '<span class="arch-title">', '</span>' ); ?>

      Ответить
  24. Dimax:

    А как сделать только h1 для страниц тегов? Пробовал переделать код h1 для категорий, но что-то не получается((( Помогите плз!

    Ответить
  25. Dimax:

    Поучилось вот что:

    function kinotag_save_meta( $term_id ) {
    	if ( ! isset($_POST['post_tag']) )
    		return;
    	$kinotag = array_map('trim', $_POST['post_tag']);
    	foreach( $kinotag as $key => $value ){
    		if( empty($value) ){
    			delete_term_meta( $term_id, $key );
    			continue;
    		}
    		update_term_meta( $term_id, $key, $value );
    	}
    	return $term_id;
    }

    Но вот чтобы сделать #### если нет своего h1, выводить по умолчанию и # функция вывода отдельного заголовка h1, (как в случае с категориями) не получается(((

    Ответить
    • Виталий Кириллов:

      Здравствуйте!
      Функционал вывода h1 для страниц меток получается следующий:

      function mayak_tag_meta( $term ) {
      	?>
      		<tr class="form-field">
      			<th scope="row" valign="top"><label>Заголовок h1</label></th>
      			<td>
      				<input type="text" name="mayak[h1]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'h1', 1 ) ) ?>"><br />
      				<p class="description">Заголовок страницы</p>
      			</td>
      		</tr>
      	<?php
      }
      add_filter('edit_tag_form_fields', 'mayak_tag_meta');
      function mayak_save_meta( $term_id ) {
      	if ( ! isset($_POST['mayak']) )
      		return;
      	$mayak = array_map('trim', $_POST['mayak']);
      	foreach( $mayak as $key => $value ){
      		if( empty($value) ){
      			delete_term_meta( $term_id, $key ); 
      			continue;
      		}
      		update_term_meta( $term_id, $key, $value ); 
      	}
      	return $term_id;
      }
      add_action('edit_term', 'mayak_save_meta');
      function mayak_tag_h1($name_tag) {
      	$terms = get_query_var('tag_id');
      	$name_tag = get_term_meta ( $terms, 'h1', true );
          echo $name_tag;
      	if(empty($name_tag)){
      	   echo	single_tag_title();
      	}
      }

      Вызов функции в файле:

      <?php mayak_tag_h1($name_tag) ?>
      Ответить
      • Dimax:

        К сожалению не работает, белый экран выбивает

        Ответить
      • Dimax:

        А нет, все работает только нужно изменить название функций

        Ответить
  26. source:

    Вдруг кому-то пригодится:
    стандартный заголовок архива можно вывести функцией the_archive_title
    description — the_archive_description

    Для примера
    <?php if( is_archive() ){ ?>
    <?php the_archive_title( '<h1>', '</h1>' ); ?>
    <?php the_archive_description( '<div>', '</div>' ); ?>
    <?php } ?>

    Ответить
  27. Николай:

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

    Ответить
  28. Алексей:

    Хотелось бы увидеть подобный код для категорий товаров woocommerce. Сам никак не могу найти хук, аналогичный single_cat_title, для woocommerce.
    Заранее спасибо.

    Ответить
  29. Русти:

    Огромнейшее спасибо за проделанный труд. Единственное у меня не all in seo и даже не yoast а стоит простой и легкий Add Meta Tags отключил в нем вывод и все нормально. Спасибо огромнейшее реально самая полезная статья на данный момент во всем рунете

    Ответить
    • Русти:

      Все таки нужна помощь. Убираю вывод генерации дескрипшена и тайтла в плагине пропадает он вообще даже в статьях. Как написать условие чтобы в рубрики выводилось только описание Ваше а статьи плагина ?

      Ответить
      • Виталий Кириллов:

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

        Ответить
  30. Алексей:

    Огромное спасибо автору, за лучшее на сегодняшний день решение в плане рубрик. Внедрил у себя на сайт в течении 20 минут и с экономил кучу времени.

    Ответить
  31. Антон:

    Здравствуйте!
    Прошу помощи с выводом title и h1 для меток, если функция от Маяка для рубрик уже работает. Или хотя бы в какую-сторону копать.

    Ответить
  32. Антон:

    Функция для меток и категорий получилась такая:

    /*** Свои meta для рубрик НАЧАЛО***/
    add_action("category_edit_form_fields", 'mayak_category_meta');
    function mayak_category_meta( $term ) {
    	?>
    		<tr class="form-field">
    			<th scope="row" valign="top"><label>Заголовок (title)</label></th>
    			<td>
    				<input type="text" name="mayak[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>"><br />
    				<p class="description">Не более 60 знаков, включая пробелы</p>
    			</td>
    		</tr>
    		<tr class="form-field">
    			<th scope="row" valign="top"><label>Заголовок h1</label></th>
    			<td>
    				<input type="text" name="mayak[h1]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'h1', 1 ) ) ?>"><br />
    				<p class="description">Заголовок страницы</p>
    			</td>
    		</tr>
    
    	<?php
    }
    /*** Записываем в базу данных и для категории и для метки ***/
    function mayak_save_meta( $term_id ) {
    	if ( ! isset($_POST['mayak']) )
    		return;
    	$mayak = array_map('trim', $_POST['mayak']);
    	foreach( $mayak as $key => $value ){
    		if( empty($value) ){
    			delete_term_meta( $term_id, $key );
    			continue;
    		}
    		update_term_meta( $term_id, $key, $value );
    	}
    	return $term_id;
    }
    add_action("create_category", 'mayak_save_meta');
    add_action("edited_category", 'mayak_save_meta');
    add_action('edit_term', 'mayak_save_meta');
    /*** Достаём новый title и выводим ***/
    function mayak_filter_single_cat_title($term_name) {
        $terms = get_category( get_query_var('cat'));
        $cat_id = $terms->cat_ID;
        $term_name = get_term_meta ($cat_id, 'title', true);
    	return $term_name;	
    }
    add_filter('single_cat_title', 'mayak_filter_single_cat_title', 10, 1 );
    /*** Достаём название рубрики если title не прописан ***/
    function mayak_single_cat_title ($term_name){
        if(empty($term_name)){
    	    $terms = get_category( get_query_var( 'cat' ));
    	    $cat_id = $terms->cat_ID;
    	    $term_name = get_cat_name($cat_id);
    	}
    	return $term_name;
    }
    add_filter( 'single_cat_title', 'mayak_single_cat_title', 10, 1 ); 
    /*** Получаем из БД стандартный заголовок категории если h1 не прописан ***/
    function mayak_cat_caption($caption) {
    	$terms = get_category( get_query_var( 'cat' ));
    	$cat_id = $terms->cat_ID;
    	$caption = get_cat_name($cat_id);
        echo $caption; 
    }
    /*** Функция вывода нового заголовка h1 ***/
    function mayak_cat_h1($name_cat) {
    	$terms = get_category( get_query_var( 'cat' ));
    	$cat_id = $terms->cat_ID;
    	$name_cat = get_term_meta ( $cat_id, 'h1', true );
        echo $name_cat;
    	if(empty($name_cat)){
    	   echo	mayak_cat_caption($caption);
    	}
    }
    /*** Свои meta для рубрик КОНЕЦ***/
    /*** Свои meta для меток НАЧАЛО***/
    function mayak_tag_meta( $term ) {
    	?>
    		<tr class="form-field">
    			<th scope="row" valign="top"><label>Заголовок (title)</label></th>
    			<td>
    				<input type="text" name="mayak[title]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'title', 1 ) ) ?>"><br />
    				<p class="description">Не более 60 знаков, включая пробелы</p>
    			</td>
    		</tr>
    		<tr class="form-field">
    			<th scope="row" valign="top"><label>Заголовок h1</label></th>
    			<td>
    				<input type="text" name="mayak[h1]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'h1', 1 ) ) ?>"><br />
    				<p class="description">Заголовок страницы</p>
    			</td>
    		</tr>
    	<?php
    }
    add_filter('edit_tag_form_fields', 'mayak_tag_meta');
    /*** Достаём новый title и выводим ***/
    function mayak_filter_single_tag_title($tag_name){
    	$tags = get_query_var( 'tag_id' );
    	$tag_name = get_term_meta ( $tags, 'title', true );
    	return $tag_name;	
    }
    add_filter( 'single_tag_title', 'mayak_filter_single_tag_title', 10, 1 );
    /*** Достаём название метки если title не прописан ***/
    function mayak_single_tag_title ($term_name){
        if(empty($term_name)){
    	    $terms = get_query_var('tag_id');
    	    $tag_id = $terms->tag_ID;
    	    $term_name = get_tag_name($tag_id);
    	}
    	return $term_name;
    }
    add_filter( 'single_tag_title', 'mayak_single_tag_title', 10, 1 ); 
    /*** Функция вывода нового заголовка h1 ***/
    function mayak_tag_h1($name_tag) {
    	$terms = get_query_var('tag_id');
    	$name_tag = get_term_meta ( $terms, 'h1', true );
        echo $name_tag;
    	if(empty($name_tag)){
    	   echo	single_tag_title();
    	}
    }
    /*** Свои meta для меток КОНЕЦ***/

    Для категорий работает, а вот вместе никак.

    Ответить
    • Виталий Кириллов:

      Здравствуйте, Антон!
      1. Для вывода каркаса на страницах редактирования меток используйте хук edit_tag_form_fields.
      2. Для сохранения данных можно вместо событий create_category и edited_category использовать хуки create_terms и edited_terms, которые работают, и для меток, и для категорий.
      3. Для вывода title меток я написал отдельный функционал:

      /* Вывод title для меток */
      add_filter('single_tag_title', 'mayak_filter_single_tag_title', 10, 1 );
      function mayak_filter_single_tag_title() {
          $tdt =  get_queried_object()->term_id;
          return get_term_meta ($tdt, 'title', true);
      }
      
      add_filter( 'single_tag_title', 'mayak_tag_title', 10, 1 ); 
      function mayak_tag_title ($vtdt){
          if(empty($vtdt)){
      	    $vtdt = get_queried_object()->name;
      	}
      	return $vtdt;
      }

      4. Вот функции вывода h1 для меток:

      /* Вывод заголовка h1 для меток */
      function mayak_tag_caption($caption) {
      	$caption = get_queried_object()->name;
          echo $caption; 
      }
      function mayak_tag_h1($name_tag) {
      	$wpc_id =  get_queried_object()->term_id;
      	$name_tag = get_term_meta ( $wpc_id, 'h1', true );
          echo $name_tag;
      	if(empty($name_tag)){
      	   echo	mayak_tag_caption($caption);
      	}
      }

      5. В файле шаблона вызываем функцию:

      <?php mayak_tag_h1($name_tag); ?>
      Ответить
      • Антон:

        Виталий, спасибо большое за проделанную работу!
        Но не срабатывает возврат имени метки по умолчанию, если не задано через вашу функцию. Может быть проблема в строках: пункт 3 строка 12 и пункт 4 строка 4.

        get_cat_name — это же для категорий. Копался похожее для меток найти, но у них и у term не нашел вывода через get.

        Ответить
        • Виталий Кириллов:

          Просто все набегу, нет времени нормально протестировать результат.
          Функцию поправил.

          Ответить
          • Антон:

            Большая благодарность, Виталий! Всего вам наилучшего!

            Ответить
  33. source:

    Автор молодец. Его микроразметкой картинок вся блогосфера пользуется.
    Теперь по теме.
    В качестве эксперимента решил тоже сделать у себя рубрики достойными выдачи. Сказу скажу, что не пользовался рекомендациями из статьи, а сделал все по своему. Правда как сейчас оказалось — многое совпадает 🙂

    Так как блог у меня информационный, то микроразметку страницы рубрик сделал Article. Как положено, написал 150+ слов в описание рубрики. Добавил картинку с атрибутами alt и title в которых прописал название рубрики. Вывел все посты рубрики плиточками с указанием rel=»bookmark» и title для ссылок на посты. Автоматическую микроразметку картинок на странице рубрик организовал через функцию от автора этого блога будем добавления строки:
    add_filter(‘get_the_archive_description’, ‘mayak_filter_image’);
    Все это сделал 9 декабря, а уже вчера (12 декабря) яндекс добавил мои рубрики в быстрые ссылки. Вот такой вот приятный бонус. Пример моей странички рубрик geekelectronics.org/arduino (тема блога не конкурирует с блогом сео маяк).
    Не все рубрики еще привел в порядок, но результат меня порадовал.
    Спасибо, что прочитали 🙂

    Ответить
  34. Сергей:

    Здравствуйте,Виталий!
    Упомянутых функций ( и ) лично у меня нет в указанных файлах archive.php и category.php … Тема-переработанная twentyfourteen. Не подскажете,как быть?

    Ответить
    • Виталий Кириллов:

      Здравствуйте, Сергей!
      Шаблоны все разные и в некоторых функционал разбрасывается по нескольким файлам или используются авторские функции, так что без базовых знаний тут трудно разобраться.
      Попробуйте поискать single_term_title() или single_cat_title() в других файлах.

      Ответить
  35. Сергей:

    Прошу прощения… Имел ввиду вот эти функции <?php single_term_title() ?> <?php single_cat_title() ?> Их у меня нет в файлах archive.php и category.php

    Ответить
  36. Антон:

    Здравствуйте!

    Для вывода description в рубриках используется код

    <tr class="form-field">
    <th scope="row" valign="top"><label>Краткое описание (description)</label></th>
    <td>
    <input type="text" name="mayak[description]" value="<?php echo esc_attr( get_term_meta( $term->term_id, 'description', 1 ) ) ?>"><br />
    <p class="description">Краткое описание (description)</p>
    </td>
    </tr>

    А как сделать такое же и для меток, чтобы работало вместе?

    Ответить
    • Антон:

      Простите! Не тот код для примера скопировал (((

      function mayak_cat_description($description){
      if(is_category()){
      $desc = get_category( get_query_var( 'cat' ));
      $category_id = $desc->cat_ID;
      $description = get_term_meta ( $category_id, 'description', true );
      if(!empty($description)){
      $meta = '<meta name="description" content="'.$description.'" />'."\n";
      }
      else {
      $description = wp_filter_nohtml_kses(substr(category_description(), 0, 280));
      $meta = '<meta name="description" content="'.$description.'" />'."\n";
      }
      echo $meta;
      }
      }
      add_action('wp_head', 'mayak_cat_description', 1, 1);

      Ответить
  37. Артем:

    123123
    заголовок h1 почему то выводиться вот так, без обозначения Н1

    Ответить
    • Виталий Кириллов:

      Поправил

      Ответить
      • Антон:

        Здравствуйте! А в какой функции ошибка была, чтобы тоже исправить?

        Ответить
        • Виталий Кириллов:

          В функции mayak_product_cat_h1()

          Ответить
          • Артем:

            <header class="page-header">
            2313 </header>
            вот так выводится

            Таких вот строк нету у меня
            1
            <?php single_term_title() ?>
            У кого тема старая, то ищем:

            1
            <?php single_cat_title() ?>

            Делаю вот так
            <header class="page-header">
            <?php
            mayak_cat_h1($name_cat)

            ?>

            Ответить
      • Артем:

        Где и что поправили не пойму ?
        Вот так выводиться сейчас »
        2313 »
        Без ковычек только
        Таких строк нету
        1
        «»
        У кого тема старая, то ищем:

        1
        «»

        Ответить
  38. Денис:

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

    Ответить
    • Виталий Кириллов:

      Просто оберните код вывода заголовка в нужный класс.

      Ответить
  39. Денис:

    Как сделать, чтобы на странице категории под заголовком вводился текст из поля description, а не из стандартного поля описания категории в wordpress?
    Если в описание забивать текст, то он всплывает при наведении на рубрику в виджете рубрик, так как wordpress берет этот текст для title ссылки на категорию.
    Хотелось бы, чтобы там всплывало только название рубрики. А на странице категории короткое описание из допполя description.
    Получится так сделать?

    Ответить
  40. Василий:

    Здравствуйте. На сайте присутствует All in One SEO Pack. После ввода вашых изменений рурики работают прекрасно. Но проблема в записях с тезом description его нет :-(. Никак исправить нельзя?

    Ответить
    • Виталий Кириллов:

      Здравствуйте Ваасилий!
      А тогда почему другие поля остались?
      У меня все корректно работает.

      Ответить
  41. Евгений:

    Добрый день.
    Не могу настроить вывод h1 открыл файлы:
    archive.php
    category.php
    Как прописать условие —

    Мой файл archive.php:

    <?php get_header(); ?>
    
    	<section id="primary" class="content-area">
    		<main id="main" <?php hybrid_attr( 'content' ); ?>>
    
    			<?php if ( have_posts() ) : ?>
    
    				<header class="page-header">
    					<?php
    						the_archive_title( '<h1 class="page-title">', '</h1>' );
    						the_archive_description( '<div class="taxonomy-description">', '</div>' );
    					?>
    				</header><!-- .page-header -->
    
    				<div class="page-entry">
    
    					<?php while ( have_posts() ) : the_post(); ?>
    
    						<?php get_template_part( 'partials/content', get_post_format() ); ?>
    
    					<?php endwhile; ?>
    
    				</div>
    
    				<?php get_template_part( 'pagination' ); // Loads the pagination.php template  ?>
    
    			<?php else : ?>
    
    				<?php get_template_part( 'partials/content', 'none' ); ?>
    
    			<?php endif; ?>
    
    		</main><!-- #main -->
    	</section><!-- #primary -->
    
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>

    ———————————————————————————

    Мой файл category.php

    <?php get_header(); ?>
    
    	<section id="primary" class="content-area">
    		<main id="main" <?php hybrid_attr( 'content' ); ?>>
    
    			<?php if ( have_posts() ) : ?>
    
    				<header class="page-header">
    					<?php
    						the_archive_title( '<h1 class="page-title">', '</h1>' );
    						the_archive_description( '<div class="taxonomy-description">', '</div>' );
    					?>
    				</header><!-- .page-header -->
    
    				<?php
    					// Get the featured posts style
    					$style = truereview_get_term_meta( 'featured_style', 'slider' );
    
    					if ( $style === 'slider' ) {
    						get_template_part( 'partials/content', 'featured' );
    					} else {
    						get_template_part( 'partials/content', 'featured-grid' );
    					}
    				?>
    
    				<div class="page-entry">
    
    					<?php while ( have_posts() ) : the_post(); ?>
    
    						<?php get_template_part( 'partials/content', get_post_format() ); ?>
    
    					<?php endwhile; ?>
    
    				</div>
    
    				<?php get_template_part( 'pagination' ); // Loads the pagination.php template  ?>
    
    			<?php else : ?>
    
    				<?php get_template_part( 'partials/content', 'none' ); ?>
    
    			<?php endif; ?>
    
    		</main><!-- #main -->
    	</section><!-- #primary -->
    
    <?php get_sidebar(); ?>
    <?php get_footer(); ?>
    Ответить
    • Виталий Кириллов:

      Здравствуйте!
      Попробуйте вместо строчки:

      the_archive_title( '<h1 class="page-title">', '</h1>' );

      Вставить:

      mayak_cat_h1($name_cat);
      Ответить
      • Евгений:

        К сожалению, не помогло, если меняю как вы указали, отображается меню, контент и записи пропадают в рубриках, страницы работают как обычно

        Ответить
        • Виталий Кириллов:

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

          Ответить
        • Виталий Кириллов:

          Теперь понятно.
          Моя функция не работает внутри цикла, который в ваших файлах начинается со строчки:

          <?php if ( have_posts() ) : ?>

          Если вызвать мою функцию:

          <?php mayak_cat_h1($name_cat) ?> 

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

          Ответить
          • Валерий:

            Добрый день!
            Столкнулся с такой же проблемой. Так в итоге это не решить или не так страшно если в рубриках не будет выводиться h1?

            Ответить
            • Виталий Кириллов:

              Сделать все можно, если знания есть.
              Как я и говорил, здесь надо перекраивать файл шаблона, возможно не один.
              Если категория закрыта для индексации, то наличие h1 не имеет значение, но если категории индексируются, то заголовок должен быть.

              Ответить
  42. Мария:

    Добрый день! Спасибо за статью: все понятно, следовательно — получилось.
    У меня вопрос такого плана. «Химичила» только с title, ибо все остальное не нужно. В заголовках все гуд, а вот в «хлебных крошках» в качестве «текущей» подставляется не заголовок (h1), а title.
    Поскольку в php практически «ни в зуб ногой», все нужные функции ищу в интернете.

    В файле function в соответствующем месте (как мне подсказывает моя логика), в «хлебных крошках» есть такая строка:

    if ($show_current) echo $sep . $before . sprintf($text['category'], single_cat_title('', false)) . $after;

    Смысл: «если $show_current есть», то выводим какие-то теги (неважно), и в этих тегах вот это самое «single_cat_title(», false))»

    Интуитивно понимаю, что «single_cat_title» надо как-то заменить на «mayak_cat_h1», но как сделать правильно — не получается. Если просто заменить, то не подставляются нужные теги

    Ответить
    • Виталий Кириллов:

      Мария здравствуйте!
      Попробуйте вместо:

      single_cat_title('', false)

      С одной закрывающей скобкой!

      Вставить мою функцию:

      mayak_cat_h1($name_cat)
      Ответить
      • Мария:

        Вот я именно так и делаю, и не вставляются нужные теги. Ну, да ладно, впрочем. Я уже в functions.php впихнула эти теги «принудительно».

        Ответить
  43. Валерий:

    Еще один вопросик.
    На моем сайте в рубрике Безопасность (пока только в ней, поскольку она тестовая) как-то коряво выводится описание. Подскажите в чем может быть проблема? Заранее спасибо.

    Ответить
  44. Михаил:

    Виталий подскажите , что в вашей функции нужно изменить что бы вывести отдельно keywords для страниц категорий товара?

    Ответить
  45. 4isto:

    Подскажите, а если у меня сайт на 2-х языках, как быть в таком случае? У меня подтягивает для двух языков один тайтл. Плагин локализаций qTranslate-X
    Спасибо!

    Ответить
    • Виталий Кириллов:

      Сходу трудно дать решение, но как мне думается надо прописывать дополнительное условие для вывода title, исходя из запрашиваемой версии.
      В любом случаи это индивидуальный случай и с ним надо индивидуально разбираться.
      Боюсь бесплатно за это никто не возьмется.

      Ответить
      • 4isto:

        В коде нашел вот такое для переключения:
        $text[‘page’] = __(«[:ru]Страница[:uk]Сторінка») . ‘ %s’;

        Но на сколько понимаю и записывать в БД надо для разных языков.

        Ответить
        • Виталий Кириллов:

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

          Ответить
  46. 4isto:

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

    Ответить
    • Виталий Кириллов:

      В комментах есть ответ тут.

      Ответить
  47. Владимир:

    Огромное спасибо! Нет ли такой же функции добавлять текст на страницах рубрик? Если не затруднит ответить на почту

    Ответить
  48. Рустам:

    Внимание народ. Кто столкнулся с проблемой дублирования тега description с плагинов All in SEO
    вот решение:
    строка у меня в моей версии 3888

    if ( ! ( is_front_page() && is_paged() ) ) {
    			$description = $this->get_main_description( $post );    // Get the description.
    			$description = $this->trim_description( $description );
    			if ( ! isset( $meta_string ) ) {
    				$meta_string = '';
    			}
    			// Description format.
    			$description = apply_filters( 'aioseop_description_full', $this->apply_description_format( $description, $post ) );
    			$desc_attr   = '';
    			if ( ! empty( $aioseop_options['aiosp_schema_markup'] ) ) {
    				$desc_attr = '';
    			}
    			$desc_attr = apply_filters( 'aioseop_description_attributes', $desc_attr );
    			if ( ! empty( $description ) ) {
    				$meta_string .= sprintf( "\n", $desc_attr, $description );
    			}
    		}

    Надо этот код обернуть в проверку
    if ( !is_category()) { /*тут вставить код который выше*/ }

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

    Ответить
  49. Михаил:

    А у меня никак не получается с H1 подскажите, пожалуйста. Выводит только Title в h1. У меня в теме нет ни файла archive.php, categore.php. И ничего похоже, типа
    тоже нет. Нашел какой то только content-page.php. В нем есть такой кусок
    header class=»entry-header page-header»>

    <?php the_title( '’, » ); ?>
    Может что то здесь? Больше даже ничего похожего не могу найти, нотпадом всю тему перерыл.

    Ответить
    • Виталий Кириллов:

      Темы все разные. Бывают файлы content-single.php, content-page.php или один из файлов.
      В общем, пробуйте.

      Ответить
  50. Павел:

    Здравствуйте, Виталий! Спасибо за статью! Мне нужно было добавить произвольное поле, поэтому сделал по аналогии с полем H1. Но текстовый редактор не получилось прикрутить к полю. Вы можете добавить решение с текстовым редактором, например, к полю H1?
    И второй вопрос, возможно ли вывести значение поля в записях через шаблон single.php, как это сделать?

    Ответить
  51. артем:

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

    Ответить
  52. Dzmitry Roshchyn:

    Спасибо большое! Пригодилось!

    Ответить

Оставить комментарий

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS