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

Рубрика: WordPress -> Архив рассылки
Четверг, 23 ноября 2006 г.
Просмотров: 1934
Подписаться на комментарии по RSS

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

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

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

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

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

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

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

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

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

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

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

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

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

    **/-keywords-/ - ключевые слова

    **/-description-/ - описание записи

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

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

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

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

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

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

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

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

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

Но этого мало

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

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

  1.  <?php
  2.  get_header();
  3.  ?>

И заменяем:

  1.  <?php
  2.  require('./wp-blog-header.php');
  3.  require_once('header.php');
  4.  // get_header();
  5.  ?>

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

Подключите фантазию grin

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

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

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

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

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

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

  1.  <?php
  2.  // вывод всех мета
  3.  $arr_meta = (array) $post_meta_cache[$post->ID];
  4.  foreach ( $arr_meta as $key => $val ) {
  5.   echo '<strong>' . $key . '</strong>: ';
  6.   foreach ( $val as $val_key => $val_val ) {
  7.   echo $val_val . ' ';
  8.   }
  9.   echo '<br />';
  10.   }
  11.  ?>

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

  1.  <?php
  2.  ### вывод всех мета кроме отмеченных
  3.  $arr_meta = (array) $post_meta_cache[$post->ID];
  4.  $ex_arr = array ('keywords' , 'title'); // исключить поля
  5.  foreach ( $arr_meta as $key => $val ) {
  6.   foreach ( $ex_arr as $ex_key )
  7.   if ( $ex_key == $key ) break(2);
  8.   echo '<strong>' . $key . '</strong>: ';
  9.   foreach ( $val as $val_key => $val_val )
  10.   echo $val_val . ' ';
  11.   echo '<br />';
  12.   }
  13.  ?>

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

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

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

  1. 2006-11-24 в 20:57:15 | Dato (анонимно)

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

  2. 2006-11-24 в 21:21:46 | Dato (анонимно)

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

  3. 2006-11-24 в 21:51:07 | Максим (анонимно)

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

  4. 2006-11-24 в 22:31:19 | Dato (анонимно)

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

  5. 2006-11-24 в 22:35:30 | Dato (анонимно)

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

  6. 2006-11-24 в 22:41:24 | Максим (анонимно)

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

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

  7. 2006-11-24 в 22:53:56 | Dato (анонимно)

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

    Например, давайте добавим отображение ключевых слов к каждому посту. Посмотрите, какой получается простой код: ID]['keywords'][0]);

    if ( strlen($text_desc) > 0 )

    echo 'Tags: ' . $text_desc . '';

    ?>

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

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

  8. 2006-11-24 в 23:09:45 | Максим (анонимно)

    :cool:

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

    the_content();

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

  9. 2006-11-24 в 23:24:56 | Dato (анонимно)

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

  10. 2006-11-24 в 23:31:32 | Максим (анонимно)

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

  11. 2006-11-24 в 23:39:30 | Dato (анонимно)

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

  12. 2006-11-25 в 00:31:59 | Максим (анонимно)

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

  13. 2006-11-25 в 01:18:42 | Dato (анонимно)

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

  14. 2006-11-25 в 09:55:34 | Максим (анонимно)

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

  15. 2006-11-25 в 11:33:39 | Dato (анонимно)

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

  16. 2006-11-25 в 13:07:50 | 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. 2006-11-25 в 13:27:12 | 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. 2006-11-25 в 13:32:46 | Sonika (анонимно)

    Dato,

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

  19. 2006-11-25 в 13:54:18 | Максим (анонимно)

    2Sonika

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

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

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

  20. 2006-11-25 в 13:58:00 | Dato (анонимно)

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

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

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

  22. 2006-11-26 в 00:32:11 | Sonika (анонимно)

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

  23. 2006-11-26 в 00:34:08 | Sonika (анонимно)

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

    извиняюсь за дубликаты

  24. 2006-11-26 в 03:20:02 | Dato (анонимно)

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

  25. 2006-11-26 в 12:19:16 | Максим (анонимно)

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

  26. 2006-11-26 в 12:43:21 | Dato (анонимно)

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

  27. 2006-11-26 в 13:05:38 | Максим (анонимно)

    Dato max-3000[{}]list.ru

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

  28. 2006-11-26 в 18:47:12 | Sonika (анонимно)

    Здорово! Спасибо! Думаю, многим пригодится!

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

  29. 2006-12-15 в 23:30:54 | Gorky (анонимно)

    Максим спасибо огромное! smile

    Все прекрасно работает smile

  30. 2006-12-24 в 18:18:34 | Van (анонимно)

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

  31. 2006-12-24 в 19:16:01 | Максим (анонимно)

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

  32. 2006-12-25 в 17:41:18 | sonika (анонимно)
    Van:

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

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

  33. 2006-12-25 в 17:43:00 | Van (анонимно)

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

    Кстати тут в коде небольшая неточность, надо в конце вместо

    ?>">

    написать

    ?>"/>

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

  34. 2006-12-25 в 17:52:12 | Максим (анонимно)

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

  35. 2006-12-25 в 19:28:23 | Van (анонимно)

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

  36. 2007-02-04 в 22:31:35 | ego (анонимно)

    Ну, во-первых, спасибо огромное за советы, всегда использовал для этих целей плагин, но в 2.1 он не особо-то захотел работать smile

    Собственно и вопрос в тему: это у меня с руками проблема, или в 2.1 эта функция не очень работает:?:

  37. 2007-02-04 в 22:51:47 | Максим (анонимно)

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

  38. 2007-02-04 в 23:11:30 | ego (анонимно)

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

  39. 2007-02-04 в 23:20:37 | Максим (анонимно)

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

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

    на

    $post_meta_cache[1][$post->ID]['keywords'][0]
  40. 2007-02-04 в 23:29:55 | ego (анонимно)

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

  41. 2007-05-07 в 18:51:35 | 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 'описание по-умолчанию';

    ?>">

    "описание по умолчанию" на что заменить? smile

    Еще раз сорри за простые вопросы.

  42. 2008-01-17 в 22:55:12 | Александр (анонимно)

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

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

  43. 2008-06-23 в 16:57:00 | 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. 2008-06-23 в 16:57:53 | Invisible trace (анонимно)

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

  45. 2008-07-13 в 13:30:53 | Nixx (анонимно)

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

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

    Спасибо.

  46. 2008-10-08 в 19:53:34 | Viggo (анонимно)

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

    Что может мешать?

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

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

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



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)