Мой сайт о WordPress и PHP
 
23 ноября 2006

Выпуск 20. Произвольные поля

Читали 7640 раз
Рубрика: E-mail рассылка
Навигация: Главная » WordPress » E-mail рассылка

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

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

<meta name="description" content="описание">
<meta name="keywords" content="ключевые слова">

С точки зрения оптимизации сайта, это хорошее решение, да и реализуется он не очень сложно.

Немного теории

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

Для получения значения любого поля текущей записи достаточно обратиться к массиву $post_meta_cache с указанием имени поля:

$keywords = $post_meta_cache[$post->ID]['keywords'][0];

Как видите, всё очень просто :-) .

Как добавить произвольное поле к записи

Для тех, кто ещё не понял, как добавить поле keywords к любой записи, рассказываю как это можно сделать.

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

Условимся считать, что название полей будут такими:

  • keywords - ключевые слова
  • description - описание записи

В поле "Ключ" вводите название, а в поле "Значение" его значение. :-)

Добавляем в шаблон

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

Также нам нужно учесть различные ситуации, когда получение значений полей не имеет смысла, например при выводе списка рубрик или архива. В общем у нас получается, что поля нужно выводить только в сообщениях (post) и страницах (static). Кроме этого, мы должны предусмотреть ситуацию, когда поля вообще не указаны или пустые. Сразу привожу готовый код для description:

<meta name="description" content="<?php
if (is_single() || is_page() )
   {
   $text_desc = trim($post_meta_cache[$post->ID]['description'][0]);
   if ( strlen($text_desc) > 0 ) echo $text_desc;
      else echo 'описание по-умолчанию';
   }
   else echo 'описание по-умолчанию';
?>">

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

Аналогично делается и для keywords:

<meta name="keywords" content="<?php
if (is_single() || is_page() )
   {
   $text_desc = trim($post_meta_cache[$post->ID]['keywords'][0]);
   if ( strlen($text_desc) > 0 ) echo $text_desc;
      else echo 'ключевые слова по-молчанию';
   }
   else echo 'ключевые слова по-молчанию';
?>">

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

Но этого мало

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

Открываем файл index.php. В нем ищем строчку:

<?php
get_header();
?>

И заменяем:

<?php
require('./wp-blog-header.php');
require_once('header.php');
// get_header();
?>

Обратите внимание, что если вы используете в своем шаблоне файлы single.php и page.php, то необходимо внести изменения и в них!

Подключите фантазию :-)

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

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

<?php
$text_desc = trim($post_meta_cache[$post->ID]['keywords'][0]);
if ( strlen($text_desc) > 0 )
     echo '<p><strong>Tags:</strong> ' . $text_desc . '</p>';
?>

Добавьте его в цикл вывода записей в нужное место. И заметьте, что мы обошлись без сторонних плагинов и никакие стенки не пришлось прошибать :-) .

[upd] Дополнение 26 ноября 2006 г.

Вывод всех мета-данных

<?php
// вывод всех мета
$arr_meta = (array) $post_meta_cache[$post->ID];
foreach ( $arr_meta as $key => $val ) {
	echo '<strong>' . $key . '</strong>: ';
	foreach ( $val as $val_key => $val_val ) {
			echo $val_val . ' ';
		}
	echo '<br />';
	}
?>

Вывод всех кроме отмеченных

<?php
### вывод всех мета кроме отмеченных
$arr_meta = (array) $post_meta_cache[$post->ID];
$ex_arr = array ('keywords' , 'title'); // исключить поля
foreach ( $arr_meta as $key => $val ) {
	foreach ( $ex_arr as $ex_key )
			if ( $ex_key == $key ) break(2);

	echo '<strong>' . $key . '</strong>: ';
	foreach ( $val as $val_key => $val_val )
			echo $val_val . ' ';

	echo '<br />';
	}
?>

Вывод только отмеченных

<?php
### вывод только отмеченных мета
$arr_meta = (array) $post_meta_cache[$post->ID];
$ex_arr = array ('keywords' , 'title'); // только эти
foreach ( $arr_meta as $key => $val ) {
	$abreak = true;
	foreach ( $ex_arr as $ex_key )
			if ( $ex_key == $key ) {
				$abreak = false;
				break;
				}
	if ($abreak) continue;
	echo '<strong>' . $key . '</strong>: ';
	foreach ( $val as $val_key => $val_val )
			echo $val_val . ' ';
	echo '<br />';
	}
?>
google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

45 комментариев к “Выпуск 20. Произвольные поля”

  1. Dato:

    Приветствую! Мне нужно добавить в заголовок кейворд. Как это сделать? Попытался проделать с одним заголовком, отредактировал его, в дополнительном поле в Ключ прописал keywords, в Значение сам_кейворд. Но, в заголовке кейворд не появился. Где находится массив $post_meta_cache?

  2. Dato:

    А так же, где находится цикл ввода слова?

  3. Максим:

    Ну и вопросики! :shock:

  4. Dato:

    Ну какие есть. Ответить можно на них?

  5. Dato:

    Конкретизируем, насколько возможно. Тема blix, в каких файлах искать массив $post_meta_cache и цикл ввода слова?

  6. Максим:

    а) Массив $post_meta_cache глобальный. Что его искать?

    б) Что такое «цикл ввода слова»???

  7. Dato:

    Ок, пойдём другим путём. :smile:

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

    ID]['keywords'][0]);
    if ( strlen($text_desc) > 0 )
    echo 'Tags: ' . $text_desc . '';
    ?>

    Добавьте его в цикл вывода записей в нужное место.

    Где искать нужное место?

  8. Максим:

    :cool:

    Открывайте файл single.php (ваша тем Blix). Найдите в ней строчку:

    the_content();

    Перед ним или после добавьте этот код.

  9. Dato:

    Вставил код, приведённый в статье, после the_content();. В произвольных полях заданы для «Ключ» - keywords, для «Значение» - сам_кейворд, но кейворд не появился в заголовке. Что-то не сработало.

  10. Максим:

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

  11. Dato:

    Во, вижу. :smile: Появилось внизу новости - Tags:сам_кейворд. Уже легче, но не совсем то, что нужно. Можно ли сделать вывод нужного кейворда в заголовке?

  12. Максим:

    Заголовок записи? Если так, то это функция the_title()

  13. Dato:

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

  14. Максим:

    Добавьте этот же код в index.php

  15. Dato:

    Не совсем так. :smile: Нужно, что бы кейворд добавился в «Управление» «Записи» в колонке «Заголовок», пункт /wp-admin/edit.php Что бы он, как бы внедрился в базу заголовков.

  16. Sonika:

    Отличная статья, и так кстати!
    У меня вопрос, я использую мета поля для вывода дополнительной информации справа http://sonika.ru/portfolio/identity/newsochi.htm с помощью <?php the_meta(); ?>, то есть выводятся ВСЕ мета поля, заданные для записи.
    Если я буду использовать поля keywords и description так как написано выше, они соответственно появятся у меня в боковушке и это будет некстати.

    Как можно изменить код
    <?php
    $text_desc = trim($post_meta_cache[$post->ID]['keywords'][0]);
    if ( strlen($text_desc) > 0 )
    echo '<p><strong>Tags:</strong> ' . $text_desc . '</p>';
    ?>

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

  17. Sonika:

    Отличная статья!
    У меня вопрос, я использую мета поля для вывода дополнительной информации с помощью <?php the_meta(); ?>, то есть выводятся ВСЕ мета поля, заданные для записи.
    Если я буду использовать поля keywords и description так как написано выше, они соответственно появятся у меня в боковушке и это будет некстати.

    Как можно изменить код
    <?php
    $text_desc = trim($post_meta_cache[$post->ID]['keywords'][0]);
    if ( strlen($text_desc) > 0 )
    echo '<p><strong>Tags:</strong> ' . $text_desc . '</p>';
    ?>

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

  18. Sonika:

    Dato,
    на странице /wp-admin/edit.php ниже поля ввода текста поста есть плашка «произвольные поля», чем она вас не устраивает для задания мета полей?

  19. Максим:

    2Sonika

    Для исключения наверное придется переписывать функцию the_meta(). В ней в цикле foreach ввести проверку $key на исключаемые поля. По-моему даже проще написать свою функцию и подключить её через include прямо в шаблон. Тогда оригинальная не затронется.

    По поводу второго вопроса.

    Можно вывести все поля полей. Поскольку $post_meta_cache массив, то нет проблем перебрать его элементы с помощью цикла foreachthe_meta() аналогично делается).

  20. Dato:

    Sonika В настоящий момент, мне не мета поля нужны. Мне нужно редактировать заголовки новостей. Добавлять к имеющимся одно, два слова из заданного списка. Что бы каждый раз, не бегать по всем блогам, и не редактировать новые.

  21. Sonika:

    Для исключения наверное придется переписывать функцию the_meta(). В ней в цикле foreach ввести проверку $key на исключаемые поля. По-моему даже проще написать свою функцию и подключить её через include прямо в шаблон. Тогда оригинальная не затронется......

    Это темный лес для меня! Я поставила плагин get_the_meta, который позволяет выводить произвольные поля «по одному» с помощью ', 'keyword', $after= '</div>');? >

  22. Sonika:

    <?php printthemeta($before = '<div>', 'keyword', $after= '</div>');?>

  23. Sonika:

    <?php printthemeta($before = '<div>', 'keyword', $after= '</div>');?>
    извиняюсь за дубликаты

  24. Dato:

    2Максим По моей ситуации? можно найти решение?

  25. Максим:

    Dato, мне тяжело понять, что именно вы хотите.

  26. Dato:

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

  27. Максим:

    Dato max-3000[{}]list.ru

    Соня, специально для тебя добавил нужные функции (в конце рассылки). :)

  28. Sonika:

    Здорово! Спасибо! Думаю, многим пригодится!
    Больше всего меня радует возможность добавить индивидуальные keywords и description к каждой записи, не каждая платная CMS может похвастаться такой возможностью..

  29. Gorky:

    Максим спасибо огромное! :)
    Все прекрасно работает :)

  30. Van:

    А если я выведу по этой статье кейворды (tags) в самом низу каждого поста, пользователи ведь не смогут кликая по ним найти посты с такими же тегами, тогда какой в них смысл?!

  31. Максим:

    Поисковики это дело отлично «съедят» :) . Ну а если серьезно, то можно организовать отдельный поиск и по мета, правда для этого придется писать дополнительные функции.

  32. sonika:

    Van:
    А если я выведу по этой статье кейворды (tags) в самом низу каждого поста, пользователи ведь не смогут кликая по ним найти посты с такими же тегами, тогда какой в них смысл?!

    Таки мы говорили о keywords, которые выводятся в meta. А смысл в meta есть.

  33. Van:

    Да, вот это было бы интересно, это ведь новейшие технологи Веб! Флоксомания вроде так это навывается :)

    Кстати тут в коде небольшая неточность, надо в конце вместо ?>"> написать ?>"/>
    у владельца этого сайта такой ошибки нет, видимо он пользуется другим кодом для вывода мета тегов :wink:

  34. Максим:

    Не совсем так: указывать или нет в конце тэга «/» зависит от используемого стандарта: для «HTML 4.01 Transitional» для «meta» он нее нужен. ;)

  35. Van:

    Ну у меня броузер показал на эту ошибку, все таки видимо HTML 4 это уже прошлый век для firefox'a

  36. ego:

    Ну, во-первых, спасибо огромное за советы, всегда использовал для этих целей плагин, но в 2.1 он не особо-то захотел работать :)
    Собственно и вопрос в тему: это у меня с руками проблема, или в 2.1 эта функция не очень работает :?:

  37. Максим:

    Вы про какую функцию-то говорите?

  38. ego:

    Я про то, что если выполнить все вышеуказанные действия, от добавления произвольных полей, до замены , то в WP 2.1 появляется лишь слова и описание "по-молчанию", а содержимое произвольный полей не видно. :)

  39. Максим:

    Я не проверял на 2.1, но попробуйте изменить строчки с

    $post_meta_cache[$post->ID]['keywords'][0]

    на

    $post_meta_cache[1][$post->ID]['keywords'][0]

  40. ego:

    Спасибо, Макс! Всё работает :wink:

  41. apache:

    Извините за ламерские вопрос - не могу разобраться, с WP не знаком почти:
    $keywords = $post_meta_cache[$post->ID]['keywords'][0]; - вот это в какой файл WP вставить?

    и еще вот тут:
    ID]['description'][0]);
    if ( strlen($text_desc) > 0 ) echo $text_desc;
    else echo 'описание по-умолчанию';
    }
    else echo 'описание по-умолчанию';
    ?>">

    "описание по умолчанию" на что заменить? :)
    Еще раз сорри за простые вопросы.

  42. Александр:

    Максим, не знаю, может быть эта ф-ция появилась после написания статьи, но так выводить дополнительные поля ИМХО проще:

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

  43. Invisible trace:

    Спасибо за статью!
    Но у меня не захотел работать, хотя сделал все аккуратно, как написано в статье, т.е. в header.php поместил соответствующий код по приведенному примеру, шапку везде подцепил так же по примеру, добавил произвольное поле в редактировании записи, зашел в запись, посмотрел ее исходный код и увидел свой кейворд изначальный...
    У меня стоит WP 2.5.1 - кто-нибудь в этой версии уже проверял? Все же согласитесь, версия 2.1 уже давно в истории имхо

    Вот как я делал, в header.php

    ID]['keywords'][0]);
    if ( strlen($text_desc) > 0 ) echo $text_desc;
    else echo 'новые тенденции, решения проблем, личный опыт, нестандартные идеи, мои стихи, лирика, юмор, независимое мнение';
    }
    else echo 'новые тенденции, решения проблем, личный опыт, нестандартные идеи, мои стихи, лирика, юмор, независимое мнение';
    ?>" />

    в заголовках шаблона, в файлах page.php, singl.php

    Заранее огромное спасибо, очень нужная функция!

  44. Invisible trace:

    в заголовках шаблона, в файлах page.php, singl.php


  45. Nixx:

    Приветствую!

    Скажите Максим а можно сделать так, что бы на каждой странице single.php в конце записи отображался рисунок-ссылка "Источник, Скачать и т.д", а сама ссылка задавалась в редактировании записи через произвольное поле?

    Спасибо.


Оставьте комментарий! (Вы согласны с правилами)

 

:mrgreen: :neutral: :twisted: :arrow: :shock: :smile: :???: :cool: :evil: :grin: :idea: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: :!: :?:

При добавлении кода (html, php) заменяйте < на &lt; и > на &gt;.
Внимание: антиспам - зверь! Копируйте своё сообщение перед отправкой. На всякий случай.