Выпуск 20. Произвольные поля
Четверг, 23 ноября 2006 г.
Просмотров: 1934
Подписаться на комментарии по RSS
Использование произвольных полей в 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 />';
- }
- ?>

Комментариев: 46
Приветствую! Мне нужно добавить в заголовок кейворд. Как это сделать? Попытался проделать с одним заголовком, отредактировал его, в дополнительном поле в Ключ прописал keywords, в Значение сам_кейворд. Но, в заголовке кейворд не появился. Где находится массив $post_meta_cache?
А так же, где находится цикл ввода слова?
Ну и вопросики! :shock:
Ну какие есть. Ответить можно на них?
Конкретизируем, насколько возможно. Тема blix, в каких файлах искать массив $post_meta_cache и цикл ввода слова?
а) Массив $post_meta_cache глобальный. Что его искать?
б) Что такое «цикл ввода слова»???
Ок, пойдём другим путём. :smile:
Где искать нужное место?
:cool:
Открывайте файл single.php (ваша тем Blix). Найдите в ней строчку:
the_content();Перед ним или после добавьте этот код.
Вставил код, приведённый в статье, после the_content();. В произвольных полях заданы для «Ключ» - keywords, для «Значение» - сам_кейворд, но кейворд не появился в заголовке. Что-то не сработало.
При чем тут заголовок? Еще раз внимательно прочитайте статью. Там описано всё, что нужно сделать для того, чтобы код заработал.
Во, вижу. :smile: Появилось внизу новости - Tags:сам_кейворд. Уже легче, но не совсем то, что нужно. Можно ли сделать вывод нужного кейворда в заголовке?
Заголовок записи? Если так, то это функция the_title()
Появился кейворд, в заголовке, но, только на странице новости. Если я выведу заголовок этой новости в нужном мне месте, кейворд в нём не отобразится. Как в этом случае выйти из положения? Очень желательно, продолжить беседу приватно.
Добавьте этот же код в index.php
Не совсем так. :smile: Нужно, что бы кейворд добавился в «Управление» «Записи» в колонке «Заголовок», пункт /wp-admin/edit.php Что бы он, как бы внедрился в базу заголовков.
Отличная статья, и так кстати!
У меня вопрос, я использую мета поля для вывода дополнительной информации справа 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, а побольше мета полей, или этот код просто повторить для каждого мета поля?
Отличная статья!
У меня вопрос, я использую мета поля для вывода дополнительной информации с помощью
<?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, а побольше мета полей, или этот код просто повторить для каждого мета поля?
Dato,
на странице /wp-admin/edit.php ниже поля ввода текста поста есть плашка «произвольные поля», чем она вас не устраивает для задания мета полей?
2Sonika
Для исключения наверное придется переписывать функцию the_meta(). В ней в цикле foreach ввести проверку $key на исключаемые поля. По-моему даже проще написать свою функцию и подключить её через include прямо в шаблон. Тогда оригинальная не затронется.
По поводу второго вопроса.
Можно вывести все поля полей. Поскольку $post_meta_cache массив, то нет проблем перебрать его элементы с помощью цикла foreach (в the_meta() аналогично делается).
Sonika В настоящий момент, мне не мета поля нужны. Мне нужно редактировать заголовки новостей. Добавлять к имеющимся одно, два слова из заданного списка. Что бы каждый раз, не бегать по всем блогам, и не редактировать новые.
Это темный лес для меня! Я поставила плагин get_the_meta, который позволяет выводить произвольные поля «по одному» с помощью ', 'keyword', $after= '</div>');? >
<?php printthemeta($before = '<div>', 'keyword', $after= '</div>');?>
<?php printthemeta($before = '<div>', 'keyword', $after= '</div>');?>
извиняюсь за дубликаты
2Максим По моей ситуации? можно найти решение?
Dato, мне тяжело понять, что именно вы хотите.
Максим У вас есть имеил, или любой другой, приватный способ связи?
Dato max-3000[{}]list.ru
Соня, специально для тебя добавил нужные функции (в конце рассылки).
Здорово! Спасибо! Думаю, многим пригодится!
Больше всего меня радует возможность добавить индивидуальные keywords и description к каждой записи, не каждая платная CMS может похвастаться такой возможностью..
Максим спасибо огромное!
Все прекрасно работает
А если я выведу по этой статье кейворды (tags) в самом низу каждого поста, пользователи ведь не смогут кликая по ним найти посты с такими же тегами, тогда какой в них смысл?!
Поисковики это дело отлично «съедят»
. Ну а если серьезно, то можно организовать отдельный поиск и по мета, правда для этого придется писать дополнительные функции.
Таки мы говорили о keywords, которые выводятся в meta. А смысл в meta есть.
Да, вот это было бы интересно, это ведь новейшие технологи Веб! Флоксомания вроде так это навывается
Кстати тут в коде небольшая неточность, надо в конце вместо
?>">написать
?>"/>у владельца этого сайта такой ошибки нет, видимо он пользуется другим кодом для вывода мета тегов :wink:
Не совсем так: указывать или нет в конце тэга «/» зависит от используемого стандарта: для «HTML 4.01 Transitional» для «meta» он нее нужен. ;)
Ну у меня броузер показал на эту ошибку, все таки видимо HTML 4 это уже прошлый век для firefox'a
Ну, во-первых, спасибо огромное за советы, всегда использовал для этих целей плагин, но в 2.1 он не особо-то захотел работать
Собственно и вопрос в тему: это у меня с руками проблема, или в 2.1 эта функция не очень работает:?:
Вы про какую функцию-то говорите?
Я про то, что если выполнить все вышеуказанные действия, от добавления произвольных полей, до замены , то в WP 2.1 появляется лишь слова и описание "по-молчанию", а содержимое произвольный полей не видно.
Я не проверял на 2.1, но попробуйте изменить строчки с
$post_meta_cache[$post->ID]['keywords'][0]на
$post_meta_cache[1][$post->ID]['keywords'][0]Спасибо, Макс! Всё работает :wink:
Извините за ламерские вопрос - не могу разобраться, с 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 'описание по-умолчанию';
?>">
"описание по умолчанию" на что заменить?
Еще раз сорри за простые вопросы.
Максим, не знаю, может быть эта ф-ция появилась после написания статьи, но так выводить дополнительные поля ИМХО проще:
<?=get_post_meta($post->ID, 'keywords', true); >
Спасибо за статью!
Но у меня не захотел работать, хотя сделал все аккуратно, как написано в статье, т.е. в 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
Заранее огромное спасибо, очень нужная функция!
в заголовках шаблона, в файлах page.php, singl.php
Приветствую!
Скажите Максим а можно сделать так, что бы на каждой странице single.php в конце записи отображался рисунок-ссылка "Источник, Скачать и т.д", а сама ссылка задавалась в редактировании записи через произвольное поле?
Спасибо.
Максим, увы, у меня не отображаются кейвордсы и дескрипшены, которые я вбиваю в произвольные поля окна редактирования. Как обычно все сделал по твоей инструкции, но никак. ВП версии 2.6.1
Что может мешать?