Записи с метками ‘howto’

Извращения с темами WordPress для новичков и не только (Часть 2) - query_posts

Вторник, 23 октября 2007

Ну что, продолжим извращаться с темами?

Query Posts

Хотелось ли вам самим определять какие сообщения и когда должны показываться на странице? Нет ничего проще, ведь существует чудо функция query_posts, определяющая какие записи попадут в выдачу. Функция работает как некий фильтр, отбирающий посты по указанным критериям. Сейчас всё станет более ясно на примерах, а затем я просто перечислю большинство существующих параметров, после чего всё ограничится вашим воображением.

Список последних записей

Вы наверное знаете о существовании стандартного виджета, который выполняет эту функцию, а что если хочется вывести список записей в каком-то другом месте?



Как видно из кода мы передали в функцию query_posts параметр showposts равный 5. Даже не будучи особым знатоком английского языка, понятно что будут показаны 5 постов. Сортируются они по умолчанию по дате публикации - от последних к первым. the_permalink() - даёт нам ссылку на пост, а the_title() - заголовок.

N-постов из определенной рубрики

Совсем чуть-чуть усложним задачу - будем выводить 5 последних постов из категории с ID 2.



Всё проще простого - всего 6 знаков, а какой эффект, какой размах:-) Думаю тут пояснения не требуются, поэтому перейдём к

Исключаем записи из вывода

Допустим существует некая категория (для примера с ID = 3), посты которой не хочется выводить на главной, для этого мы мановением чудо символа “-” (минус) убираем её из выдачи.



  // тут стандартный вывод

Расширяем кругозор или список доступных параметров

Думаю вы оценили прелесть этой небольшой, но мощной функции query_posts, и хотя вы всегда можете более глубоко изучить её в кодексе, я позволю себе перечислить параметры, которые могут вам пригодиться:
cat и category_name - выбор рубрики по ID или по имени, как исключить какую-то рубрику - см. выше.
Хинт: если нужно передать несколько рубрик, то не нужно несколько раз писать cat=1&cat=2, достаточно перечислить рубрики через запятую cat=1,2. Кстати говоря, этот приём относится к любому параметру, который может принимать несколько значений.
author и author_name - посты определенного автора, по ID (author=3) и имени (author_name=Tapac).
p и name - выбирает посты по id (p=5) или по короткому имени (name=this_post_slug).
page_id и pagename - тоже самое, только применительно к страницам.
showposts - сколько из отфильтрованных постов/страниц показать при выдаче.
ВременнЫе (hour, minute, second, day, monthnum, year) - посты за указанный период.
paged - параметр позволяет показывать те посты, который в обычном случае доступны при переходе по ссылкам “Предыдущая страница”, т.е. paged=2 покажет посты, как если бы мы отмотали на 2 страницы в прошлое (при выводе по 10 постов на странице, мы получили бы в выдаче записи с 21 по 30).
posts_per_page - сколько постов на страницу. Хорошо группируется с предыдущим параметром.
order - порядок сортировки по дате, принимает значения ASK - от старых к новым или DESC - от новых к старым (стоит по умолчанию).
offset - т.н. отступ. Пропускает (сдвигает) на определенное количество записей.

Выводим подкатегории

В завершение сегодняшнего поста хочу поделиться трюком, который может пригодиться при использовании WordPress как CMS.
Начну из далека, постучался ко мне в icq некто vzldd (в инфо - Дмитрий) с просьбой помочь с сайтом по фильмам (если автор против рекламы сайта, то я уберу ссылку), а точнее он хотел разместить в правом сайдбаре 2 колонки - в одной список категорий фильмов, а во второй - просто рубрики. Я посоветовал ему завести две большие рубрики и раскидать существующие в них как дочерние. После чего предложил вставить в шаблон следующий код:

, где 12345 - ID родительской рубрики (т.е. в нашем примере Download)
Но при выводе таким образом, перед списком выдавался заголовок c именем родительской рубрики, а её хотелось указать отдельно руками. Копаем кодекс дальше.

По идее мы должны получить список, но без заголовка, а на деле мы получаем пустой список с надписью “Нет рубрик”. Странно? Да не то слово, но если почитать ещё немного в кодексе по поводу синтаксиса и параметров wp_list_categories, то находим такую строку

If the parameter (child_of) is used, the hide_empty parameter is set to false.

, т.е. параметр hide_empty (который разрешает или запрещает показывать рубрики, если в них нет постов) автоматически должен переключиться в режим - показывать всё, но увы и ах, это “переключение” по какой-то причине происходит только в случае, когда кроме child_of нет других параметров. И вот вам итоговый вариант скрипта, выводящего все дочерние категории для выбранной нами:


Этот пост оказался несколько больше, чем я изначально предполагал, но надеюсь он не потерял своей полезности. Поэтому то, о чём планировал рассказать (произвольные поля, карта сайта и т.д.) переносится в третью часть.
Не забудьте подписаться на rss, теперь я даже обзавёлся огромной кнопкой в сайдбаре, так что не промахнётесь.

Извращения с темами 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> .


<?php
if (is_home()) {
	echo bloginfo('name');
} elseif (is_404()) {
	echo '404 Страница не найдена';
} elseif (is_category()) {
	echo 'Рубрика:'; wp_title('');
} elseif (is_search()) {
	echo 'Результаты поиска';
} elseif ( is_day() || is_month() || is_year() ) {
	echo 'Архив:'; wp_title('');
} else {
	echo wp_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, чтобы ничего не пропустить.

Как безопасно обновиться до WordPress 2.3 по шагам

Вторник, 25 сентября 2007

Руководство для самых нетерпеливых)
Сразу скажу, что сам я буду обновляться только после выхода русского релиза от Максима. На днях собирался ещё и поставить кучу плагинов, но теперь придётся повременить и дождаться их обновления.


Какая же последовательность действий, чтобы безопасно обновиться с 1.5.x, 2.0.x, 2.1.x, или 2.2.x до 2.3?

0. Удостоверьтесь, что у вас стоит UTF версия WordPress или сперва обновитесь версией от Максима, потому что в противном случае возможны проблемы с кодировкой.
1. Сделайте бэкап БД.
Сделайте копию всех своих данных: пользователей, постов, страниц, категорий.
Можно воспользоваться плагином WP-DBManager или сделать всё руками:
а) зайдите в админ.панель phpmyadmin (где он расположен зависит от хостера) или поставьте плагин WP-Phpmyadmin, чтобы запускать его из WordPress.
б) в панели слева выберите пункт Databases.
Databases menu

в) в списке кликните на свою БД
Database Selection

г) на следующей странице показан список всех таблиц. Жмём на закладку Export вверху страницы.
Export Tab

д) теперь перед вами меню экспорта. Тут вам необходимо выбрать таблицы, относящиеся к WordPress. Если в данной БД установлен только блог, то смело жмём Select All, в противном случае отмечаем все строки начинающиеся на wp_ (если устанавливали по умолчанию) или другой префикс, который можно посмотреть в файле wp_config.php
wp-tables list

е) Проверьте, что выбран пункт SQL, проставьте галки Structure, ‘Add DROP TABLE’, ‘Add AUTO_INCREMENT’, ‘Enclose table and field names with backquotes’, DATA (но уберите галки внутри этого блока) и ‘Save as File’
wp-tables list

ж) Сперва выбираем пункт ‘None’ в разделе ‘Save as File’, жмём GO и сохраняем файл на диск.
После этого можно сохранить и архивированную версию, выбрав ‘zipped’.
Процесс бэкапа базы данных закончен.

2. Бэкап всех файлов WordPress.
Подключаемся по фтп своим любимым клиентом и сливаем все папки и файлы (включая .htaccess) к себе на локальную машину. Описывать этот процесс не буду, потому что подозреваю, что раз вы смогли когда-то залить блог на сервер, то сможете и скачать.

3. Проверьте бэкапы.
Откройте SQL файл в каком-нибудь текстовом редакторе и проверьте, чтобы он был не пустой, удостоверьтесь, что zip-версия распаковывается без проблем, а так же что сохранена иерархия скаченных файлов и можно зайти в подкаталоги.

4. Отключите ВСЕ плагины.
Идём в Админ.панель и выключаем их по одному.

5. Скачиваем последнюю версию с оффсайта.
И распаковываем на своём компьютере.

6. Удаляем старые файлы WordPress на сервере.
Это стоит делать в том случае, если вы не уверены, что ваш FTP-клиент (или если вы работаете через админ.панель хостера) правильно перезапишет файлы.
НЕ УДАЛЯЙТЕ:
* wp-config.php
* папку wp-content
* папку wp-images
* папку wp-includes/languages/ если пользуетесь локализацией через MO файлы
* файл .htaccess

Обязательно удалите:
* все файлы начинающиеся на wp-* кроме перечисленых выше, а так же readme.html, wp.php, xmlrpc.php и license.txt. Обычно их можно найти в корне сайта. И ещё раз напоминаю - НЕ УДАЛЯЙТЕ wp-config.php
* папку wp-admin
* папку wp-includes. Помним о wp-includes/languages/
* папку wp-content/cache. У вас будет эта папка только в том случае, если вы обновляетесь с WordPress 2.0
* папку wp-content/plugins/widgets. У вас она будет, только если вы устанавливали дополнительные виджеты. Старые версии не совместимы с 2.3

7. Скопируйте новые файлы на сервер.
Возможно придётся перезаписать часть файлов, например темы, входящие в стандартную поставку WordPress (default и classic).

8. Запустите процесс обновления WordPress.
Перейдите по адресу http://ваш_сайт/wp-admin/upgrade.php, если блог находится в другой папке на сервере, то допишите к УРЛ wp-admin/upgrade.php.

9. Обновите пермалинки и .htaccess.
В панели управления блогом в Options->Permalinks (Настройки->Постоянные ссылки) обновите структуру ссылок и, если необходимо, добавьте нужные строки в .htaccess.

10. Проверяем плагины на работоспособность.
Для этого сверяемся со списком совместимых плагинов и проверяем обновления в разных источниках (офф.архив плагинов, WP-plugin database, WpZipper)
Не забываем после установки их активировать.

11. Изменяем текущую тему под WordPress 2.3.
Для этого читаем статью How To Add Wordpress 2.3 Tags To Your Current Theme.

Вроде всё. Как говориться - piece a cake, baby.


А стоит ли вообще обновляться? Прочитай статью о нововведениях в WordPress 2.3 и реши для себя сам.
Кстати, если найдутся желающие прочесть статью How To Add Wordpress 2.3 Tags To Your Current Theme в моём переводе, то отпишитесь в комментариях и постараюсь не разочаровать вас.

Улучшаем размещение 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, взяв его из этого архива. Во всех остальных сборках я уже обновил этот файл.