Произвольные поля WordPress. Произвольные Title, Description и Keywords для статических страниц, постов и категорий WordPress

Logo
Произвольные поля Wordpress

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

Для демонстрации возможностей произвольных полей мы рассмотрим способ создания произвольных Title, Description, Keywords и мета-тега Robots для статических страниц и страниц постов WordPress. Кроме того мы также добавим произвольные поля для страниц категорий Wordpess, но для этого нам понадобится специальный плагин под названием Category Fields.

Итак, используя нижеприведенную информацию, вы без проблем сможете по примеру оптимизировать свой сайт для поисковых систем и значительно расширить его функционал за счет использования произвольных полей. При этом можно будет отказаться от многих громоздких плагинов, таких как, например, All in One SEO Pack, который отвечает за создание произвольных заголовков, описаний и ключевых слов в WordPress.

Создание и использование произвольных полей WordPress

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

Блок произвольных полей WordPress

Если данного блока на странице редактирования записи вы не нашли, то скорее всего он скрыт. Чтобы включить его отображение, переходим в правый верхний угол экрана и жмем по кнопке «Настройка экрана».

Включение блока произвольных полей WordPress

В выпадающем окне отмечаем чекбокс «Произвольные поля» и приступаем к созданию нового произвольного поля. Для этого заполняем поля «Имя» (латиницей) и «Значение», после чего жмем на кнопку «Добавить произвольное поле».

Создание нового произвольного поля WordPress

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

<?php echo get_post_meta($post->ID, 'test', true); ?>

Сразу хочу заметить, что функция get_post_meta() может быть использована за пределами цикла WordPress. Таким образом, вы можете использовать ее в любом месте шаблона.

Создание блока произвольных полей WordPress для статических страниц и постов

Теперь давайте рассмотрим процесс создания блока произвольных полей для статических страниц и постов WordPress. В качестве примера мы добавим произвольные Title, Description и Keywords, а также мета-тег Robots.. Данный код нужно будет добавить в файл functions.php вашей темы оформления WordPress.

// Custom Fields Start
// Подключение функции мета-блока my_extra_fields
add_action('admin_init', 'my_extra_fields', 1);
function my_extra_fields() {
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high'  );
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_page_func', 'page', 'normal', 'high'  );
}
// HTML-код блока для постов
function extra_fields_box_func( $post ){
?>
<p>
&nbsp;<em>Заголовок страницы (title):</em>
<label><input type="text" name="extra[title]" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:100%" /></label>
</p>
<p>
&nbsp;<em>Описание страницы (description):</em>
<textarea type="text" name="extra[description]" style="width:100%;height:50px;"><?php echo get_post_meta($post->ID, 'description', 1); ?></textarea>
</p>
<p>
&nbsp;<em>Ключевые слова (keywords):</em>
<label><input type="text" name="extra[keywords]" value="<?php echo get_post_meta($post->ID, 'keywords', 1); ?>" style="width:100%" /></label>
</p>
<p>
&nbsp;<em>Индексация:&nbsp;</em> <?php $radiobut = get_post_meta($post->ID, 'robots', 1); ?>
<label><input type="radio" name="extra[robots]" value="index, follow" <?php checked( $radiobut, 'index, follow' ); ?> /> <em>index, follow</em></label>&nbsp;
<label><input type="radio" name="extra[robots]" value="noindex, nofollow" <?php checked( $radiobut, 'noindex, nofollow' ); ?> /> <em>noindex, nofollow</em></label>&nbsp;
<label><input type="radio" name="extra[robots]" value="index, nofollow" <?php checked( $radiobut, 'index, nofollow' ); ?> /> <em>index, nofollow</em></label>&nbsp;
<label><input type="radio" name="extra[robots]" value="noindex, follow" <?php checked( $radiobut, 'noindex, follow' ); ?> /> <em>noindex, follow</em></label>
</p>
<p>
<strong><em>Index</em></strong> - разрешить индексацию страницы. &nbsp;<strong><em>Follow</em></strong> - разрешить индексацию и переход по ссылкам.
</p>
<input type="hidden" name="extra_fields_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" />
<?php
}
// HTML код блока для статических страниц
function extra_fields_box_page_func( $post ){
?>
<p>
&nbsp;<em>Заголовок страницы (title):</em>
<label><input type="text" name="extra[title]" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:100%" /></label>
</p>
<p>
&nbsp;<em>Описание страницы (description):</em>
<textarea type="text" name="extra[description]" style="width:100%;height:50px;"><?php echo get_post_meta($post->ID, 'description', 1); ?></textarea>
</p>
<p>
&nbsp;<em>Ключевые слова (keywords):</em>
<label><input type="text" name="extra[keywords]" value="<?php echo get_post_meta($post->ID, 'keywords', 1); ?>" style="width:100%" /></label>
</p>
<p>
&nbsp;<em>Индексация:&nbsp;</em> <?php $radiobut = get_post_meta($post->ID, 'robots', 1); ?>
<label><input type="radio" name="extra[robots]" value="index, follow" <?php checked( $radiobut, 'index, follow' ); ?> /> <em>index, follow</em></label>&nbsp;
<label><input type="radio" name="extra[robots]" value="noindex, nofollow" <?php checked( $radiobut, 'noindex, nofollow' ); ?> /> <em>noindex, nofollow</em></label>&nbsp;
<label><input type="radio" name="extra[robots]" value="index, nofollow" <?php checked( $radiobut, 'index, nofollow' ); ?> /> <em>index, nofollow</em></label>&nbsp;
<label><input type="radio" name="extra[robots]" value="noindex, follow" <?php checked( $radiobut, 'noindex, follow' ); ?> /> <em>noindex, follow</em></label>
</p>
<input type="hidden" name="extra_fields_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" />
<?php
}
// Активация обновления полей при сохранении
add_action('save_post', 'my_extra_fields_update', 0);
// Сохранение данных при сохранении страницы
function my_extra_fields_update( $post_id ) {
if ( !wp_verify_nonce($_POST['extra_fields_nonce'], __FILE__) ) return false; // проверка
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE  ) return false; // проверка, если это автосохранение
if ( !current_user_can('edit_post', $post_id) ) return false; // проверка на случай, если пользователь не имеет права редактировать запись
if( !isset($_POST['extra']) ) return false;
// Если все ок, то сохраняем или удаляем данные
$_POST['extra'] = array_map('trim', $_POST['extra']);
foreach( $_POST['extra'] as $key=>$value ){
if( empty($value) )
continue delete_post_meta($post_id, $key); // удаляем поле, если оно пустое
update_post_meta($post_id, $key, $value); // обновляем информацию
}
return $post_id;
}
// функция add_post_meta() срабатывает автоматически
// end Custom Fields

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

Чтобы вывести содержимое созданных произвольных полей, необходимо в нужном месте шаблона добавить следующий код:

Для вывода заголовка страницы (Title)

<?php echo get_post_meta($post->ID, 'title', true); ?>

Для вывода описания (Description)

<?php echo get_post_meta($post->ID, 'description', true); ?>

Для вывода ключевых слов (Keywords)

<?php echo get_post_meta($post->ID, 'keywords', true); ?>

Для вывода мета-тега robots

<?php echo '<meta name="robots" content="';
echo get_post_meta($post->ID, 'robots', true);
echo '" />'; ?>

Естественно, чтобы избежать ошибок, мы можем немного усложнить код, добавив в него несколько проверок. Как вариант, можете использовать следующий код, который нужно будет добавить в файл header.php вашей темы оформления между тегами head. При этом старый код, отвечающий за вывод соответствующих данных, вам нужно будет удалить.

<?php
echo "<title>";
// Если главная страница
if (is_home() ) { bloginfo('name'); }
// Если статическая страница или страница поста
elseif ( is_single() || is_page() ) {
if ( function_exists('get_post_meta') && get_post_meta($post->ID, 'title', true) ) {
echo get_post_meta($post->ID, 'title', true);
}
else {
single_post_title();
}
}
// Если страница категории
elseif ( is_category() ) {
single_cat_title();
}
// Если страница тега
elseif ( is_tag() ) {
single_tag_title();
}
// Если страница 404
elseif ( is_404() ) {
echo "404 - такой страницы не существует";
}
// Если страница поиска
elseif ( is_search() ) {
echo "Результаты поиска: ";
echo wp_specialchars($s, 1);
}
else {
wp_title();
}
echo "</title>";
echo "\n";
// Description
// Если домашняя страница
if ( is_home() && !is_paged() ) {
echo '<meta name="description" content="';
bloginfo('description');
echo '" />';
echo "\n";
}
// Если статическая страница или страница поста
if ( is_single() || is_page() ) {
if ( function_exists('get_post_meta') && get_post_meta($post->ID, 'description', true) ) {
echo '<meta name="description" content="';
echo get_post_meta($post->ID, 'description', true);
echo '" />';
echo "\n";
}
}
// Keywords
// Если главная страница
if ( is_home() && !is_paged() ) {
echo '<meta name="keywords" content="';
echo 'кофеварка, кофемашина, цена, отзыв';
echo '" />';
echo "\n";
}
// Если статическая страница или страница поста
if ( is_single() || is_page() ) {
if ( function_exists('get_post_meta') && get_post_meta($post->ID, 'keywords', true) ) {
echo '<meta name="keywords" content="';
echo get_post_meta($post->ID, 'keywords', true); // Выводит содержимое поля Keywords
echo '" />';
echo "\n";
}
}
?><?php
if ( ( is_single() || is_page() || is_home() || is_category() || is_tag()) && ( !is_paged() ) ) {
if ( is_single() || is_page() ) {
if ( function_exists('get_post_meta') && get_post_meta($post->ID, 'robots', true) ) {
echo '<meta name="robots" content="';
echo get_post_meta($post->ID, 'robots', true);
echo '" />';
echo "\n";
}
else {
echo '<meta name="robots" content="index, follow" />' . "\n";
}
}
else {
echo '<meta name="robots" content="index, follow" />' . "\n";
}
}
else {
echo '<meta name="robots" content="noindex, follow" />' . "\n";
}
?>

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

Произвольные поля для страниц категорий (рубрик) WordPress

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

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

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

Чтобы добавить произвольное поле для категории, выбираем нужную нам рубрику и жмем на ссылку «Select», как это показано на изображении ниже.

Меню плагина Category Fields

Далее вводим название произвольного поля (ключ) и его содержимое.

Добавление нового произвольного поля для категории Wordrpess

В данном примере мы создали четыре произвольных поля:

  • cat_title – произвольный заголовок категории.
  • cat_description – произвольное описание категории.
  • cat_keywords – произвольные ключевые слова категории.
  • cat_robots – произвольный мета-тег Robots.

Для вывода содержимого произвольного поля WordPress используйте следующий код:

Для вывода заголовка страницы (Title):

<?php echo get_cat_fields($cat, 'cat_title'); ?>

Для вывода описания (Description):

<?php echo get_cat_fields($cat, 'cat_description'); ?>

Для вывода ключевых слов (Keywords):

<?php echo get_cat_fields($cat, 'cat_keywords'); ?>

Для вывода мета-тега robots:

<?php echo '<meta name="robots" content="';
echo get_cat_fields($cat, 'cat_robots');
echo '" />'; ?>

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

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

Если вы не хотите пропустить выхода новых статей, рекомендую подписаться на новостную рассылку, воспользовавшись формой подписки, расположенной ниже.

На этом данная статья подошла к концу. Вы также можете ознакомиться со следующими полезными статьями на блоге:

На этом все. Удачи вам и успеха в создании сайтов!

Обнаружили ошибку? Выделите ее и нажмите Ctrl+Enter

Комментарии 22

  • София Чернышева

    Добрый день, Дмитрий! Прочитала Вашу статью. Добавьте, пожалуйста, во введении совсем немного простой информации о том, зачем эти функции могут понадобиться, в чем может быть практический смысл их применения. На примерах и на пальцах. Я не могу сообразить — нужны ли они мне для моего сайта. Это что-то полезное и на самом деле решает актуальные мои задачи, или можно пропустить?

  • Дмитрий

    Здравствуйте, София! В статье уже есть примеры использования. Аналогичным образом Вы можете создать другие произвольные поля, например, для цены товара, артикула и т.д. То есть, можно будет добавлять любую другую произвольную информацию для страниц WordPress.

  • Nurlan

    После добавления в функцон.пшп сайт выдал ошибку. Т.е. совсем не открылся.

  • Дмитрий

    Значит неправильно добавили код. Скорее всего допустили синтаксическую ошибку. Перепроверьте все и устраните проблему.

  • Ваньчик

    Здравствуйте, мне в шаблон уже установили код произвольных полей, но нет мета описания для статических страниц. Хочу поинтересоваться, возможно ли добавление вашего кода "// HTML код блока для статических страниц" и куда его надо вставить?

  • Дмитрий

    Здравствуйте, Ваньчик. Да, можно. Достаточно добавить код в functions.php используемой темы оформления. После этого поля станут доступны при создании/редактировании статических страниц.

  • AndreyS

    Скажите, плиз, как добавить произвольное поле на отдельную созданную статическую страницу (не пост) в WordPress

  • Дмитрий

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

  • Давид

    Дмитрий скажите а как можно задать значения для полей по умолчанию

  • Дмитрий

    Зависит от того, где именно это нужно сделать. В любом случае самым простым вариантом является проверка произвольных полей. Если поле существует и оно не пустое — выводить значение по умолчанию. В противном случае загружать значение произвольного поля. Данный способ применим как при выводе значений произвольных полей в шаблоне, так и в формах на странице редактирования записей. Для реализации достаточно базовых знаний PHP. К тому же в статье есть готовый пример и можно без каких-либо проблем сделать все по аналогии.

  • Юрий

    Что сказать, только можно поблагодарить! вроде все заработало.

  • Юрий

    Да еще чуть не забыл, давно хотел спросить каким плагином вы пользуетесь для вывода изображений в постах, просто при стандартной вставке, если изображение больше размера рабочей области, приходится его масштабировать после чего оно получается нереально больших размеров, в смысле объема, не помогает ни какое сжатие, конечно на данный момент пробовал только в формате ПГН, но если знаете решение проблемы буду благодарен!

  • Дмитрий

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

  • Андрей

    Здравствуйте Дмитрий! Для прописания тегов и дескрипшн для обычных страниц я использую плагин All in One SEO. Соответственно для категорий он не катит. В выдачи категорий полное не соответствие.
    Я установил плагин Category Fields, но что то не догнал куда нужно вставить код?
    <?php echo get_cat_fields($cat, 'cat_description'); ?> 
    Спасибо!
     

  • Дмитрий

    Здравствуйте, Андрей. Данный код нужно использовать в своем шаблоне WordPress. Точное место вставки кода зависит от самого шаблона и его структуры. Кстати говоря, я уже не использую данный плагин. Да и вообще никакие сторонние плагины практически не использую. Проще и эффективнее написать шаблон с нуля, но это требует определенных навыков. Постараюсь написать об этом в своих будущих статьях.

  • серж

    Здравствуйте. Есть Рубрика: Фундамент под баню. Задача: Сделать так чтобы выводилось только название Фундамент, но при этом тайтл был Фундамент под баню. Можно так сделать? Спасибо..

  • Дмитрий

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

  • Роман

    Спасибо за статью! Как раз занимаюсь отключением всяких плагинов. Долго не решался отключить Seo All in One, но с помощью кода, который вы привели, я думаю, можно с легкостью это реализовать. Не понимаю, почему все везде пишут, что Seo All in One просто незаменим и без него нельзя. Ваш код вполне может его заменить, к тому же его можно несколько уменьшить с помощью массива, и тогда он будет не такой объемный. А плагин Seo All in One ну очень уж громоздкий. Как вы считаете?
    Кстати, насчет плагина Category Fields, то его тоже можно легко заменить, и даже меньшим кодом.

  • Роман

    Отлично! Все получилось! Спасибо за доступность и подробные комментарии!
    Еще хочу добавить, что понадобилось экспортировать данные из плагина All in One Seo. Для этого можно всего лишь убрать префикс _aioseop_ из таблицы wp_postmeta:
    UPDATE `wp_postmeta` SET `meta_key` = REPLACE( `meta_key` , '_aioseop_', '' )

  • Дмитрий

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

  • Алексей

    echo 'кофеварка, кофемашина, цена, отзыв';
    А эту строчку так и нужно оставить или нужно записать что то свое?

  • Дмитрий

    Алексей, нужно заменить на свои ключевые слова

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

отменить ответ