Выпуск 20. Произвольные поля
Использование произвольных полей в 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 />';
}
?>
Постоянная ссылка: http://maxsite.org/?p=156
Версия для печати
