Извращения с темами WordPress для новичков и не только (Часть 1)
Пятница, 19 октября 2007Интересно, есть ли ещё люди, сомневающиеся в том, что на WordPress можно сделать сайт практически любой сложности, сохранив при этом удобство управления контентом через стандартную админку?
Можете не отвечать, сам знаю, что хватает людей, которые делают кислую мину при упоминании, что сайт работает на WP: “Это же блоговый движок, все сайты на нём одинаковые-шаблонные…”
Ага, шаблонные, но попрошу рассматривать этот факт, не как минус, а как ОГРОМНЫЙ плюс, потому что это означает лишь то, что вы можете САМИ настроить всё именно так, как вам хочется - расположить элементы, определить условия вывода данных и многое-многое другое.
И не смотрите на мой блог с ухмылкой, как говорится “сапожник без сапог”, зато с определенным опытом, которым сейчас буду делиться. Для понимания потребуются минимальные знания php, редактор (можно и в блокноте), сам вордпресс и желание творить.
Тэги условий
В WordPress есть так называемые тэги условий, при помощи которых вы можете определять, как и на какой странице у вас будет показываться контент, рубрики, да и вообще почти всё что угодно. Надеюсь, несколько примеров помогут вам освоиться, а в дальнейшем вы собственноручно сможете изучить все остальные условные тэги и применять их по необходимости.
Подсвечиваем в меню текущую страницу
Предположим у нас есть 3 страницы “Обо мне”, “О блоге”, “Контакты” (короткие имена about/bloginfo/contacts), отображаемые в меню, и мы хотим, чтобы при нахождении на одной из этих страниц, соответствующий пункт меню был подсвечен или как-нибудь по другому выделен. Для этого дела в style.css мы создаём класс .current, которому задаём то, как хотим “подсветить” пункт меню.
То на какой странице мы находимся, определяется при помощи функции is_page(), в которую передаётся короткое имя страницы. Если короткое имя соответствует текущей странице, то возвращается true и выполняется условие идущее в фигурных скобках.
Не путайте страницы и записи/посты!
Для примера меню будет сделано в виде списка, если у вас другая реализация, то действуйте по аналогии.
Не сложно догадаться, что когда мы находимся на любой другой странице, то у нас подсвечен будет первый пункт - “Главная”.
Динамические заголовки страниц
Можно конечно назвать это неким подобием SEO, хотя лучше всё же использовать специализированные плагины для оптимизации (например, All In One SEO Pack), но этот же метод можно применять и в других ситуациях. Итак, открываем файл header.php своей темы и вносим изменения в <title> .
В этом устрашающего вида коде мы последовательно проверяем? на какой же странице находимся “Главная > Несуществующая > Рубрика > Поиск > Архив > Страницы и посты”. Функция bloginfo(’name’) выдаст нам название блога, wp_title(”) - заголовок по умолчанию (для постов - это “Заголовок”, для рубрик - их название).
Выделение постов определенной рубрики
Если появилось желание каким-то особым способом пометить пост из определенной рубрики, то открываем index.php своей темы (не перепутайте его с одноименным файлом в корне сайта), находим строчку похожую на
и модифицируем её до вот такого вида
Теперь всем постам из рубрики номер 5 (номера можно посмотреть в разделе “Управление > Рубрики”) будет дополнительно присвоен класс “feature”. Тут стоит отметить, что перед “feature” обязательно должен стоять пробел, чтобы классы не “склеились”. Осталось только придумать и описать в стилях (style.css) соответствующий класс.
Отдельные шаблоны для постов из разных рубрик
А почему бы не сделать для каждой рубрики разное оформление при отображении поста? Пусть в рубрике “авто” будет на фоне машина и сайдбар слева, а в рубрике “мото” разместим мотоцикл и сайдбар справа.
Получается нам потребуется 3 шаблона: мото, авто и по-умолчанию.
Копируем файл single.php из своей темы три раза и обзываем файлы single_auto.php, single_moto.php, single_other.php.
Каждый из них будет отвечать за соответствующий шаблон, поэтому настраиваем их, так как хочется, а в основном single.php убираем всё, заменив на:
post;
if ( in_category('1') ) {
include(TEMPLATEPATH . '/single_auto.php');
} elseif ( in_category('2') ) {
include(TEMPLATEPATH . '/single_moto.php');
} else {
include(TEMPLATEPATH . '/single_other.php');
}
?>
Номера категорий соответственно ваши.
Отдельные шаблоны для разных рубрик
С шаблонами рубрик (т.е. оформлением страницы при просмотре всех постов в определенной рубрике) всё намного проще. Если хочется, чтобы при переходе в рубрику все посты выводили как-то “особо”, то создаём в папке темы файл category-2.php, в котором и делаем это “особое оформление”. Теперь если кто-то зайдёт в рубрику под номером 2, то подгрузится данный шаблон и будет сплошная красота. Формат имени файла “category-НомерРубрики.php”.
Вешаем баннер после первого поста
Частенько возникает желание расположить баннер или блок контекстной рекламы сразу после первого поста. Как это сделать? Открываем файл index.php шаблона и добавляем переменную, которая будет отсчитывать номер поста. Выглядит это так:
Находим блок окончания цикла (<?php endwhile;?>) и вставляем перед ним:
В файл ad.php сохраняем код баннера или той же сапы.
На этом закончу первую часть руководства. Надеюсь, вы почерпнули что-то новое и полезное.
Хотелось бы понять насколько доступно то, что изложено в посте, какие коррективы стоит внести и что более полно разъяснить. Поэтому не стесняйтесь - комментируйте.
В следующей части я расскажу о query_posts, что это и как, используя эту функцию, можно управлять последовательностью вывода постов, так же расскажу о “Произвольных полях”, покажу как очень просто сделать карту сайта и возможно что-то ещё. Подписывайтесь на rss, чтобы ничего не пропустить.
“Не-не” отрицательный php-хинт
Понедельник, 15 октября 2007
Сейчас занят запуском одного блога на игровую тематику, а так же пошли уже первые клиенты с курса Сергея Жуковского, что радует. Практикуюсь в быстрой и качественной настройке WordPress.
Чтобы вы не скучали напишу небольшой php-хинт, который, мне кажется, понравится изучающим этот язык. Во всяком случае мне он показался забавным и не лишённым изысканности)
Кто из вас не встречал подобный php-код?
function foo( $foo ) {
// тварим чудеса
if ( $foo ) // $foo не булевое значение
return true;
else
return false;
}
Всё очень просто - требуется вернуть булевое значение (true/false), только проблема в том, что сама переменная $foo не обязательно булевого типа, поэтому нельзя вернуть её напрямую.
Вариант 1, приводим его к булевому значению
function foo( $foo ) {
// фокус-покус
return (boolean) $foo;
}
Вариант 2, приводим его к булевому значению (укороченный вариант)
function foo( $foo ) {
// фокус-покус
return (bool) $foo;
}
Вариант 3, двойное-отрицание!!!
function foo( $foo ) {
// фокус-покус
return !!$foo;
}
Первое отрицание (оператор не - !) приводит $foo к отрицательному булевому значению, т.е. false, а следующее “не” переворачивает уже к изначальному значению, но в булевом виде).
И напоследок - не сложно догадаться, что если вам нужно вернуть true, когда передаваемая переменная false, то убираем одно “не”:
function foo( $foo ) {
// вуаля
return !$foo;
}
Вот и всё, надеюсь вам понравилось;-)
Тэги и новые переменные в WordPress 2.3
Среда, 3 октября 2007
В который уже раз напомню (а то вдруг есть такие, кто не знают), но в WordPress 2.3 появилась встроенная поддержка тэгов. Не бог весть как реализованная, но тем не менее.
Как же ими пользоваться грамотно?
Для начала стоит понять, что для получения списка постов по определенному тэгу достаточно указать его в УРЛ после /tag/, т.е. название_блога.ру/tag/тэг_который_ищем.
С этим всё просто. Теперь более сложные варианты:
а) логическое “ИЛИ”
Если нужно выбрать все посты, которые содержат один из указанных тэгов, то перечисляем их через запятую, например:
название_блога.ру/tag/тэг1,тэг2,тэг3
б) логическое “И”
Если нужно выбрать посты, отмеченные несколькими тэгами, то делаем это через “+”:
название_блога.ру/tag/тэг1+тэг2+тэг3
К сожалению более сложные комбинации фильтров не работают, а жаль. Вполне могли бы добавить работу со скобками, а главное отсутствует возможность исключить какой-либо тэг из выборки.
Ну и, чтобы пост не был столько мелким, небольшое добавление для людей, пишущих плагины и/или темы для WordPress.
Если есть необходимость в фильтрации постов, то добавляем обработчик на parse_request (при помощи add_action) и уже в теле обработчика устанавливаем фильтры при помощи $wp->set_query_var().
Список доступных переменных:
category__in - передаётся массив с ID категорий. На выходе - посты, из любой из переданных категорий.
category__not_in - передаётся массив с ID категорий. На выходе - посты, находящиеся вне перечисленных категорий.
category__and - передаётся массив с ID категорий. На выходе - посты, находящиеся сразу во всех перечисленных категориях.
tag__in - передаётся массив с ID тэгов. На выходе - посты, с любым из переданных тэгов.
tag__not_in - передаётся массив с ID тэгов. На выходе - посты, без отметки переданными тэгами.
tag__and - передаётся массив с ID тэгов. На выходе - посты, отмеченные сразу всеми переданными тэгами.
tag_slug__in - передаётся текстовый массив имен тэгов. На выходе - посты, с любым из переданных тэгов.
tag_slug__and - передаётся текстовый массив имен тэгов. На выходе - посты, отмеченные сразу всеми переданными тэгами.
Удачи всем в плагино-писательстве.
Улучшаем размещение SAPE на форумах PHPBB
Пятница, 21 сентября 2007
Прошёл тестовый переод работы нового метода размещения ссылочных блоков SAPE на многострадальном форуме.
Сейчас объясню в чём вообще заключается этот метод. Пообщавшись с тов. Forall с phpbbguru выяснил, что администрация SAPE высказала некое пожелание, о разнесении ссылочных блоков на форумах в разные места, чтобы поисковикам было сложнее определять сайты, с которых производится продажа, а следовательно и уменьшить вероятность попадания в непот (а вы уже слышали, что авто-непот постраничен?). После этого я и решил провести небольшую модернизацию способа размещения ссылок.
Теперь в футере ссылки можно расставлять так - как душе угодно, выбирая место и количество.
И, чтобы не нервировать честных зарегистрированных пользователей, ввел проверку на залогиненность - вошёл на форум под своим паролем - чистый блок ссылок, зашёл гостем (или если ты поисковик/краулер) - извольте наблюдать ссылки. Да, думаю это немного не честно и господа из Сапы за это по головке не погладят, но ведь мы же им не скажем? Так что тсссс…
Как и что нужно поменять, чтобы разместить ссылки в разных местах хедера/футера?
1. Открыть файл overall_header.tpl или overall_footer.tpl (хэдер и футер соответственно, думаю это понятно)
2. В нужных местах разместить блоки сапы. Читайте внимательно какие и как размещать.
Блок выглядет так {SAPEx}, где х - число ссылок, которое должно выводиться в этом месте. Т.е. если хочется, чтобы стояло 2 ссылки, то пишем {SAPE2}.
Учтите, что если на странице куплена всего 1 ссылка , то она выведется в первом блоке, а если ссылок больше, чем вы указали в числовых значениях, они всё равно будут выведены в последнем блоке {SAPEx}, какой бы вы x не указали.
3. Теперь открываем page_header.php или page_tail.php из директории include и, как и раньше, после строки global $do_gzip_compress; добавляем код
define('_SAPE_USER', 'ваш_длинный_но_важный_код');
require_once($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php');
$sape = new SAPE_client();
4. Прокручиваем страницу вниз и перед строчкой
$template->pparse('overall_footer');
добавляем
if(($userdata['session_logged_in'] == 0) or (!isset($userdata['session_logged_in']))){
$footercode = file_get_contents($template->files['overall_footer']);
preg_match_all('#\{(SAPE([0-9]+))\}#is', $footercode, $varrefs);
for ($i=1; $ireturn_links(intval($varrefs[2][$i-1]));
$template->assign_var($varrefs[1][$i-1], $sapelinks);
}
$template->assign_var($varrefs[1][$i-1], $sape->return_links());
}
надеюсь вам хватит воображения заменить footer на header, если вы решили размещать ссылки вверху
5. Проверяем.
Если хочется быть очень честными и показывать ссылки всем-всем-всем, то просто убираем первую строку
if(($userdata['session_logged_in'] == 0) or (!isset($userdata['session_logged_in']))){
и последнюю закрывающую скобку.
Да-да, знаю, что толку от этого не так много, как хотелось бы, потому что всё равно размещение ссылок ограничено верхом и низом форума, но как говорится “мы работаем над этим”. К тому же (идёя всё того же Forall), надо бы проверять длинну ссылок, чтобы не разъезжался дизайн и так далее.
В общем планов хватает. Подписывайтесь на RSS и следите за дальнейшими новостями.
Ньюансы работы Opera с XMLHttpRequest или почему пусто в responseText
Понедельник, 10 сентября 2007
Учиться-учиться и ещё раз учиться, потому что всегда приятно узнавать что-то новое, даже о, казалось бы, давно известных вещах.
Комментарий товарища Maelow к посту про Anti-Smap Image + Ajax Comment :
“в опере у меня при вводе неверных символов в КАПЧЕ выскакивает окно с ошибкой не содержащей текста”
заставил запустить установленную, но редко применяемую Opera, дабы удостовериться в том, что действительно выдаётся пустое сообщение.
Долгие попытки поиска ошибок в коде плагина, а так же гугленье заставили сделать вот какой вывод о работе XMLHttpRequest, а точнее о получаемых ответах:
“При получении Opera в header’е страницы, возвращаемой запросом при помощи XMLHttpRequest, любого статуса кроме 200, данные, содержащиеся на странице, не попадают в responseText.”
Именно поэтому и не работали в Опере сообщения об ошибках Ajax-Comment, который возвращал текст сообщения вместе с 406 (Not Acceptable) ошибкой. FireFox и IE ловили ошибку и, получив ещё и текст со страницы, выдавали alert как нужно, а Опере ничего не оставалось, кроме как показывать пустые строки.
В принципе всё достаточно логично, только вот в скрипте Ajax-Comment пришлось делать “финт-ушами” и вносить изменения, дабы и Опера жила припеваючи.
Сам способ я считаю не слишком хорошим, но если кто знает более простой, то прошу дать ссылку или описать свой метод.
Поступил я так: заменил header ответа с 406 на 200 (вот это-то, по сути, и есть не правильное, в плане логики, действие) и добавил в сам текст сообщения - “Error!”.
В java-script, который обрабатывал ответы, добавил проверку на наличие этого сообщения, а затем уже вызов alert без него:
if(request.responseText.indexOf('Error!')==0) {
alert(request.responseText.substr(6));
return;
}
Если вы уже поставили себе Ajax-Comment, то просто замените файл ajax-commens.php, взяв его из этого архива. Во всех остальных сборках я уже обновил этот файл.