Полноценно используем условие if. Полноценно используем условие if Выводим последние посты

Довольно распространенный ступор при разработке темы для WordPress, как пользоваться конструктором условий if else , как правильно их задать и как их вообще использовать в WordPress. Чтобы миллионы пользователей не сходили с ума в поисках решений, WordPress, так сказать, создал условные теги о использовании которых сегодня пойдет речь.

Стандартная конструкция условия выглядит следующим образом:

С одной стороны все понятно, а с другой стоит вопрос как правильно сформулировать условие, чтобы WordPress понял, то чего мы от него хотим 🙂 поехали:

1. Главная страница

Часто хотим, чтобы определенная информация выводилась только на главной странице. Для решения можно создать в папке Вашей темы файл home.php или в файл index.php внести следующее условие:

....Здесь выводим информацию, которую мы хотим видеть на главной странице

2. Проверяем рубрики

Зададим такое условие: Если мы находимся в рубрике WordPress, то выведем фразу «Вас приветствует, WordPress!», а если нет то фразу «Добро пожаловать, на наш сайт!»

/*Можно и такой схемой*/

"Вас приветствует, WordPress!"

Добро пожаловать, на наш сайт!"

Здесь и дальше в качестве идентификатора рубрики(метки) или записи(страницы) я буду использовать id — его можно узнать в панели управления сайтом. Если Вы пишете условия для рубрик(меток) то смотрите id на странице рубрик(меток), а если записей(страниц) — то на странице всех записей(страниц)… паника). Как все-таки узнать?, — смотрите иллюстрацию:

И еще такой финт 🙂 допустим нам нужно условие для проверки нескольких рубрик, тогда условия будут иметь вид:

выведем то, что нам нужно

3. Проверяем метки

Метки — крутой классификатор внутри рубрик. Рассмотри несколько примеров, как их можно проверить.

Задача: Если запись имеет метку "plugin" , то вывести фразу — WordPress Plugin

Задача: Если находимся на странице метки "plugin" , то вывести фразу — Коллекция плагинов WordPress.

Примечание: в работе с условиями меток лучше пользоваться ярлыком метки, а не ее идентификатором.

Заключение

Я рассмотрел основные условные теги, если у Вас есть какие-то вопросы задавайте их в комментариях! Удачного использования!

В данной статье (уровень веб-мастера - продвинутый) речь пойдёт о, пересекающейся по разным признакам, т.н. "фасетной" навигации. Для упрощения усвоения материала рекомендую пробежаться по статье в Википедии "Фасетная классификация " и публикации на английском языке (но с картинками!) "Design better faceted navigation for your websites ".

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

Идеально для пользователей и поиска Google

Чёткий путь к продуктам/страницам статьи:

Представление URL для страницы категории:
http://www.example.com/category.php?category=gummy-candies

Представление URL для конкретного продукта:
http://www.example.com/product.php?item=swedish-fish

Нежелательные дубликаты, вызванные фасетной навигацией

Одна и та же страница доступна с различных веб-адресов:

Каноническая страница



URL: example.com/product.php? item=swedish-fish

Дублированная страница



URL:example.com/product.php? item=swedish-fish&category=gummy-candies&price=5-10


category=gummy-candies&taste=sour&price=5-10

Ошибки:

  • Бессмысленно для Google, так как пользователи редко ищут [мармелад по цене 9:55 долларов].
  • Бессмысленно для поисковых роботов, которые обнаружат один и тот же элемент ("фруктовый салат") от родительских страниц категорий (либо "Жевательный мармелад" или "кислый Жевательный мармелад").
  • Отрицательный момент для владельца сайта, потому запросы на индексацию разбавляются многочисленными версиями одной и той же категории.
  • Отрицательный момент для владельца сайта, потому что это бесполезная и лишняя нагрузка в пропускной способности сайта
Пустые страницы:


URL: example.com/category.php? category=gummy-candies&taste=sour&price=over-10

Ошибки:

  • Неправильно отдаётся код для поисковых систем (в таком случае страница должна отдавать код 404)
  • Пустая страница для пользователей


Наихудшие решения (не дружелюбные в отношении поиска) фасетной навигации

Пример №1 : В составе URL применяются не стандартные параметры: запятые и скобки, вместо ключ=значение& :

  • example.com/category? [ category:gummy-candy ][ sort:price-low-to-high ][ sid:789 ]
  • example.com/category?category , gummy-candy , sort , lowtohigh , sid , 789
Как надо:
example.com/category?category=gummy-candy&sort=low-to-high&sid=789

Пример №2 : Использование каталогов или путей к файлам, а не параметров в списках значений, которые не изменяют содержание страницы:
example.com/c123 /s789/ product?swedish-fish
(где /c123/ категория, /s789/ ID сессии, что не изменяет содержимое страницы)

Хорошее решение:

  • example.com /gummy-candy/ product?item=swedish-fish&sid=789 (каталог, /gummy-candy/, меняет содержимое страницы в значимым образом)
Лучшее решение:
  • example.com/product?item=swedish-fish&category=gummy-candy&sid=789 (параметры URL дают большую гибкость для поисковых систем, чтобы определить, как эффективно сканировать)
Поисковым роботам трудно дифференцировать полезные значения (например, "gummy-candy") от бесполезных (например, "SESSIONID"), когда эти значения помещаются непосредственно в пути ссылки. С другой стороны, параметры URL обеспечивают гибкость для поисковых систем, чтобы быстро проверить и определить, когда данное значение не требует доступ сканирующего робота (краулера) ко всем всем вариантам.

Общие значения, которые не меняют содержимое страницы и должны быть перечислены в качестве параметров URL, включают:

  • ID сессии
  • Отслеживание идентификаторов
  • Referrer идентификаторы
  • Отметки времени
Пример №3 : Преобразование созданных пользователями значений (возможно бесконечных) в параметры URL, которые доступны для сканирования и индексирования, но бесполезны для поиска.
Использование незначительных данных, генерируемых пользователями сайта (например, как долгота/широта или "дней назад"), в сканируемых и индексируемых адресах:
  • example.com/find-a-doctor? radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com/article?category=health& days-ago=7
Как надо:
  • example.com/find-a-doctor?city=san-francisco&neighborhood=soma
  • example.com/articles?category=health&date=january-10-2014
Вместо того, чтобы позволить пользователем генерировать значения для создания сканируемых URL-адресов (что приводит к бесконечным возможностям с очень небольшой ценностью для посетителей), лучше публиковать категорию страницы для наиболее популярных значений, вдобавок можно включать дополнительную информацию, чтобы страница представляла большую ценность, чем обычная поисковая cтраница с результатами. Кроме того, можно подумать о размещении сгенерированных пользователем значениях в отдельном каталоге, а затем через robots.txt запретить сканирование из этого каталога.
  • example.com/filtering/ find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com/filtering/ articles?category=health&days-ago=7
И в robots.txt:
User-agent: *
Disallow: /filtering/

Пример №4 . Добавление параметров URL без логики.

  • example.com/gummy-candy/lollipops/gummy-candy/ gummy-candy/product?swedish-fish
  • example.com/product?cat=gummy-candy&cat=lollipops&cat=gummy-candy &cat=gummy-candy&item=swedish-fish
Хорошее решение:
  • example.com /gummy-candy/ product?item=swedish-fish
Лучшее решение:
  • example.com/product?item=swedish-fish&category=gummy-candy
Посторонние параметры URL только увеличивают дублирование, в результате сайт менее эффективно сканируется и индексируется. Поэтому необходимо избавляться от ненужных параметров URL и периодически заниматься уборкой мусорных ссылок перед генерацией новых URL. Если многие параметры необходимы для пользовательского сеанса, можно скрыть информацию в куки, а не постоянно добавлять значения, как cat=gummy-candy&cat=lollipops&cat=gummy-candy& ...

Пример №5 : Предлагать дальнейшие уточнения (фильтрация), когда есть нулевые результаты.

Плохо:
Разрешать пользователям выбрать фильтры, когда существуют нулевые элементы для уточнения.


Уточнение к странице с нулевыми результатами (например, price=over-10), что расстраивает пользователей и вызывает ненужные запросы для поисковых систем.

Как надо:
Создавать ссылки только тогда, когда есть элементы для выбора пользователем. При нулевом результате ссылку помечать "серой" (т.е. недоступной для клика). Для дальнейшего улучшения юзабилити рассмотреть вопрос о включении показателя количества доступных элементов рядом с каждым фильтром.


Вывод страницы с нулевыми результатами (например, price=over-10) не допускается, плюс запрещается пользователям делать ненужные клики, а поисковым система сканировать эту не полезную страницу.

Необходимо предотвращать появление ненужных адресов и минимизировать пространство для посетителя, создавая URL только при наличии продукции. Это поможет пользователям оставаться занятыми на вашем сайте (меньше кликов по кнопке назад, когда не находится ни одного товара), уменьшит число возможных URL, известных поисковым системам. Кроме того, если страница не просто "временно нет в наличии", а вряд ли когда-нибудь будет содержать релевантную информацию, стоит рассмотреть возможность сделать для неё код ответа 404 . На 404-ой странице вы можете оформить полезное сообщение для пользователей с большим количеством опций в навигации или окно поиска, чтобы пользователи могли найти родственные продукты.

Для новых сайтов, веб-мастера которых рассматривают внедрение фасетной навигации, есть несколько вариантов оптимизации сканирования (совокупность адресов на вашем сайте, известных роботу Google) уникальных страниц контента и уменьшения попадания в индекс поисковой системы дублирующихся страниц (консолидация сигналов индексации).

Определите, какие параметры URL требуются для поисковых систем, чтобы сканировать каждую индивидуальный страницу с контентом (то есть, определить, какие параметры необходимы для создания, по меньшей мере одного клик-пути к каждому пункту). Обязательные параметры могут включать в себя item-id , category-id , page т.д.

Определите, какие параметры будут полезны для посетителей с их запросами, и какие скорее всего только вызовут дублирование при сканировании и индексировании. В примере с кондитерскими товарами (мармелад) параметр URL "taste " может быть ценным для пользователей с запросами в примере taste=sour . Тем не менее, логично посчитать параметр "price" вызывающим лишнее дублирование category=gummy-candies&taste=sour&price=over-10 . Другие распространенные примеры:

  • Ценные параметры для поисковиков: item-id , category-id , name , brand ...
  • Ненужные параметры: session-id , price-range ...
Рассмотрим реализацию одного из нескольких вариантов конфигурации для URL-адресов, которые содержат ненужные параметры. Просто убедитесь, что "ненужные" параметры URL действительно не требуются для сканирования поисковым роботам или для нахождения пользователем каждого отдельного продукта!

Вариант 1: и внутренние ссылки

Пометьте все ненужные URL-адреса атрибутом . Это уменьшит трудозатраты поискового робота и предотвратит снижение частоты сканирования. Глобально управлять сканированием нужно через robots.txt (Примеч. переводчика: см. статью " ").
Воспользуйтесь атрибутом rel="canonical", чтобы отделить страницы для поискового индекса от страниц, не нужных там (например на странице price=5-10 можно прописать атрибут rel="canonical", указывающий на категорию всего кислого мармелада example.com/category.php?category=gummy-candies&taste=sour& page=all ).

Вариант 2: Robots.txt и Disallow

URL-ы с ненужными параметрами включают в директорию /filtering/ , которая будет закрыта в robots.txt (запрет disallow). Это даст всем поисковым системам сканировать только "правильное" внутриссылочное (содержимое) сайта, но будет блокировать разом сканирование нежелательных URL. Например (example.com/category.php?category=gummy-candies ), если ценными параметрами были item, category и taste, и лишними были идентификатор сеанса и price, то URL будет для taste таким:
example.com/category.php?category=gummy-candies&taste=sour , но все ненужные параметры, такие как price, URL включит в предопределенный каталог - /filtering/:
example.com/filtering/ category.php?category=gummy-candies&price=5-10 ,
который затем через robots.txt будет запрещен:
User-agent: *
Disallow: /filtering/

Вариант 3: Раздельные хосты

Убедитесь, что лучшие решения, перечисленные выше (например, для ненужных адресов) все еще применяются. В противном случае поисковые системы уже сформировали большую ссылочную массу в индексе. Таким образом, ваша работа будет направлена ​​на снижение дальнейшего роста ненужных страниц, просмотренных с помощью робота Google и консолидацию сигналов индексации.

Используйте параметры со стандартной кодировкой и форматом ключ=значение (key=value).

Убедитесь, что значения, которые не меняют содержимое страницы, такие как идентификаторы сеансов, реализованы в виде ключ=значение, а не каталогов.

Не позволяйте кликать и не генерируйте URL-адреса, когда не существует элементов для фильтра.

Добавьте логику в отображение параметров URL: удалите ненужные параметры, а не добавляйте постоянно значения (например, избегайте такой генерации ссылки: example.com/product?cat=gummy-candy&cat=lollipops &cat=gummy-candy&item=swedish-fish ).

Сохраняйте ценные параметры в URL, перечислив их в первую (так как URL видны в результатах поиска) очередь и менее уместные параметры в последнюю (например, идентификатор сессии).
Избегайте подобной структуры ссылок: example.com/category.php?session-id=123&tracking-id=456 &category=gummy-candies&taste=sour
Настройте параметры URL в Инструментах для веб-мастеров, если имеете чёткое представление о работе ссылок на вашем сайте.

Убедитесь, что при использовании JavaScript для динамического управления контентом (sort/filter/hide) без обновления URL, есть реальные веб-адреса на вашем сайте, имеющие ценность в поиске, например, это основные категории и страницы продуктов, которые доступны для сканирования и индексирования. Старайтесь не использовать только домашнюю страницу (т.е. один URL) для всего вашего сайта, а через JavaScript динамически изменять контент навигацией - это, к сожалению, выдаст в поиске пользователям только один URL. Кроме того, проверьте, чтобы производительность не повлияла на работу динамической фильтрации в худшую сторону, так как помешает пользователю работать с сайтом.

Улучшите индексацию различных страниц одного контента указанием атрибута rel="canonical" на привилегированную версию страницы. Атрибут rel="canonical" может быть использован внутри одного и нескольких доменов.

Оптимизируйте индексацию контента, разбитого на страницы "паджинации" (например, page=1 и page=2 из категории "gummy candies") посредством (либо):

  • Добавьте атрибут rel="canonical" в серию страниц с указанием канонической категории с параметром “view-all” (например, page=1, page=2, и page=3 из категории "gummy candies" с with rel=”canonical” на category=gummy-candies&page=all ), удостоверившись, что страница необходима пользователям и загружается быстро.
  • Используйте разметку разбиения на страницы rel="next" и rel="prev" , чтобы указать на связь между отдельными страницами (см. статью "Paginaton with rel="next" and rel="prev" ") .
Включите только канонические ссылки в файлы Sitemap .

Протокол передачи гипертекста (HTTP) - это основа жизни в Интернете. Он используется каждый раз при передаче документа или в запросе AJAX . Но HTTP на удивление мало известен некоторым веб-разработчикам.

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

Переизданный урок

Каждые несколько недель мы пересматриваем некоторые из любимых сообщений наших читателей за всю историю сайта. Этот урок впервые был опубликован в ноябре 2010 года.

Почему REST?

REST - простой способ организации взаимодействия между независимыми системами.

REST - простой способ организации взаимодействия между независимыми системами. Он пользуется популярностью с 2005 года и вдохновляет дизайн сервисов, таких как API Twitter. Благодаря тому, что REST обеспечивает взаимодействие с такими разнообразными клиентами, как мобильные телефоны и другие веб-сайты. Теоретически, REST не привязан к сети, но почти всегда реализован как таковой и был вдохновлен HTTP. В результате REST можно использовать везде, где возможен HTTP.

Альтернативой является создание относительно сложных соглашений поверх HTTP. Часто это принимает форму новых XML-языков. Самый яркий пример - SOAP . Вам нужно выучить совершенно новый набор соглашений, но вы никогда не используете HTTP в полную силу. Поскольку REST был вдохновлён HTTP и играет на его сильные стороны, это лучший способ узнать, как работает HTTP.

После первоначального обзора мы рассмотрим каждый из строительных блоков HTTP: URL-адреса, HTTP-команды и коды ответов. Мы также рассмотрим, как использовать их в RESTful. Попутно мы проиллюстрируем теорию примером приложения, которое имитирует процесс отслеживания данных, связанных с клиентами компании через веб-интерфейс.

HTTP

HTTP - это протокол, который позволяет отправлять документы в Интернете.

HTTP - это протокол, который позволяет отправлять документы в Интернете. Протокол - это набор правил, определяющих, какие сообщения можно обменивать, и какие сообщения являются подходящими ответами для других. Другим распространенным протоколом является POP3, который вы можете использовать для извлечения электронной почты на вашем жёстком диске.

В HTTP есть две разные роли: сервер и клиент. Как правило, клиент всегда инициирует разговор; сервер отвечает. HTTP основан на тексте; то есть сообщения по сути являются битами текста, хотя тело сообщения может также содержать другие носители. Использование текста позволяет легко отслеживать обмен HTTP.

HTTP-сообщения состоят из заголовка и тела. Тело часто может оставаться пустым; оно содержит данные, которые вы хотите передать по сети, чтобы использовать их в соответствии с инструкциями в заголовке. Заголовок содержит метаданные, например информацию о кодировке; но, в случае запроса, он также содержит важные HTTP-методы. В стиле REST вы обнаружите, что данные заголовка часто более значимы, чем тела.

Шпионство HTTP на работе

Если вы используете Chrome Developer Tools или Firefox с расширением Firebug , щелкните на панели Net и установите его в enabled . После этого у вас будет возможность просматривать информацию о HTTP-запросах по мере вашего поиска. Например:

Другим полезным способом ознакомиться с HTTP является использование выделенного клиента, такого как cURL.

GET

GET - это самый простой тип HTTP-запроса; которым браузер пользуется каждый раз, когда вы нажимаете ссылку или вводите URL-адрес в адресную строку. Он инструктирует сервер передавать клиенту данные, идентифицированные URL-адресом. Никогда не последует изменений данных на стороне сервера в результате запроса GET . В этом смысле GET -запрос доступен только для чтения, но, конечно, как только клиент получит данные, он может самостоятельно выполнять любые операции с ними, например, форматировать для отображения.

PUT

Запрос PUT используется, когда вы хотите создать или обновить ресурс, указанный URL-адресом. Например,

PUT /clients/robin

может создать клиента с именем Robin на сервере. Вы заметите, что REST полностью независим от бэкэнда; в запросе нет ничего, что информирует сервер о том, как данные должны создаваться - просто так должно быть. Это позволяет вам легко менять базовую технологию по необходимости. Запросы PUT содержат данные для использования при обновлении или создании ресурса в body. В cURL вы можете добавить данные в запрос с помощью -d .

Curl -v -X PUT -d "some text"

DELETE

DELETE должен выполнять противоположное PUT ; его следует использовать, если вы хотите удалить ресурс, указанный URL-адресом запроса.

Curl -v -X DELETE /clients/anne

Это приведёт к удалению всех данных, связанных с ресурсом, идентифицированных /clients/anne .

POST

POST используется, когда обработка, которую вы хотите выполнить на сервере, должна повторяться, если запрос POST повторяется (то есть, они не являются идемпотентными , подробнее об этом ниже). Кроме того, POST -запросы должны вызывать обработку body запроса как подчинённого URL-адреса, который вы отправляете.

Проще говоря:

POST /clients/

не должен вызывать изменение ресурса в /clients/ сам, но ресурс URL начинается с него /clients/ . Например, он может добавить в список нового клиента, с id , сгенерированным сервером.

/clients/some-unique-id

Запросы PUT легко используются вместо запросов POST и наоборот. Некоторые системы используют только один, некоторые используют POST для создания операций и PUT для операций обновления (поскольку с запросом PUT вы всегда указываете полный URL-адрес), некоторые используют POST для обновлений и PUT для создания.

Часто запросы POST используются для запуска операций на сервере, которые не вписываются в парадигму Create/Update/Delete ; но это, однако, выходит за рамки REST . В нашем примере мы будем полностью придерживаться PUT .

Классификация методов HTTP

Безопасные и небезопасные методы:

безопасными являются методы, которые никогда не изменяют ресурсы. Единственными безопасными методами, из четырёх перечисленных выше, является GET . Другие небезопасны, так как они могут привести к модификации ресурсов.

Idempotent методы:

Эти методы достигают того же результата, независимо от того, сколько раз запрос повторяется: это GET , PUT и DELETE . Единственным неидемпотентным методом является POST . PUT и DELETE , считающиеся идемпотентами, могут быть неожиданными, хотя, на самом деле, это довольно легко объяснить: повторение метода PUT с точно таким же body должно модифицировать ресурс таким образом, чтобы он оставался идентичным описанному в предыдущем запросе PUT: ничего не изменится! Аналогичным образом, нет смысла дважды удалять ресурс. Из этого следует, что независимо от того, сколько раз запрос PUT или DELETE повторяется, результат должен быть таким же, как если бы это было сделано только один раз.

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

Представительства

HTTP-клиент и HTTP-сервер обмениваются информацией о ресурсах, определённых URL-адресами.

Мы можем суммировать то, что мы узнали до сих пор, следующим образом: HTTP-клиент и HTTP-сервер обмениваются информацией о ресурсах, определённых URL-адресами.

Мы говорим, что запрос и ответ содержат представление ресурса. Под представлением мы подразумеваем информацию в определённом формате о состоянии ресурса или о том, каким это состояние должно быть в будущем. Оба, и header, и body - являются частями представления.

Заголовки HTTP, содержащие метаданные, жёстко определяются спецификацией HTTP; они могут содержать только простой текст и должны быть отформатированы определённым образом.

Тело может содержать данные в любом формате, и именно здесь видна сила HTTP. Вы знаете, что можете отправлять простой текст, изображения, HTML и XML на любом человеческом языке. Через метаданные запроса или различные URL-адреса вы можете выбирать между различными представлениями для одного и того же ресурса. Например, вы можете отправить веб-страницу в браузеры и JSON в приложения.

HTTP-ответ должен указывать тип содержимого body. Это делается в заголовке, в поле Content-Type ; например:

Content/Type: application/json

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

Библиотеки клиента HTTP

cURL - это, чаще всего, HTTP-решение для PHP-разработчиков.

Чтобы поэкспериментировать с различными методами запроса, вам нужен клиент, который позволит указать, какой метод использовать. К сожалению, формы HTML не подходят для счёта, так как они позволяют делать только запросы GET и POST. В реальной жизни API-интерфейсы доступны программно через отдельное клиентское приложение или через JavaScript в браузере.

Именно поэтому в дополнение к серверу важно иметь хорошие возможности HTTP-клиента на выбранном вами языке программирования.

Очень популярная клиентская HTTP-библиотека, опять же, cURL. Вы уже были ознакомлены с командой cURL ранее в этом уроке. CURL включает в себя как автономную программу командной строки, так и библиотеку, которая может использоваться различными языками программирования. В частности, cURL является, чаще всего, идеальным решением HTTP-клиента для разработчиков PHP. Другие языки, такие как Python, предлагают больше собственных клиентских HTTP-библиотек.

Настройка примера приложения

Я хочу показать как можно более низкий уровень функциональности.

Наш пример PHP-приложения чрезвычайно тощ. Я хочу выставить как можно более низкоуровневую функциональность, без какой-либо магии framework . Я также не хотел использовать настоящий API, например, Twitter, потому что они могут неожиданно меняться, вам нужно настроить аутентификацию, что может быть проблемой и вы не сможете изучить реализацию.

Чтобы запустить пример приложения, вам необходимо установить PHP5 и веб-сервер с механизмом для запуска PHP. Текущая версия должна быть не ниже версии 5.2, чтобы иметь доступ к функциям json_encode () и json_decode () .

Что касается серверов, наиболее распространенным вариантом является Apache с mod_php , но вы можете использовать любые альтернативы, которые вам удобны. Существует пример конфигурации Apache, который содержит правила перезаписи, которые помогут вам быстро настроить приложение. Все запросы к любому URL, начиная с /clients/, должны быть направлены в наш файл server.php .

В Apache вам нужно включить mod_rewrite и поместить прилагаемую конфигурацию mod_rewrite где-нибудь в вашей конфигурации Apache или в ваш файл .htacess . Таким образом, server.php будет отвечать на все запросы, поступающие с сервера. То же самое должно быть достигнуто с Nginx, или с любым другим сервером, который вы решите использовать.

Как работает пример приложения

Есть два ключа по обработке запросов REST. Первый ключ - инициировать различную обработку, в зависимости от метода HTTP, даже когда URL-адреса одинаковы. В PHP в глобальном массиве $ _SERVER есть переменная, которая определяет, какой метод был использован для выполнения запроса:

$_SERVER["REQUEST_METHOD"]

Эта переменная содержит имя метода в виде строки, например " GET ", " PUT " и далее.

Другой ключ - узнать, какой URL был запрошен. Для этого мы используем другую стандартную переменную PHP:

$_SERVER["REQUEST_URI"]

Эта переменная содержит URL-адрес, начинающийся с первой косой черты. Например, если имя хоста - " example.com ", " http://example.com/ " вернётся " / ", как " http://example.com/test/ " вернётся " /test/ ".

Давайте сначала попытаемся определить, какой URL-адрес был вызван. Мы рассматриваем только URL-адреса, начинающиеся с " clients ". Все остальные недействительны.

$resource = array_shift($paths); if ($resource == "clients") { $name = array_shift($paths); if (empty($name)) { $this->handle_base($method); } else { $this->handle_name($method, $name); } } else { // We only handle resources under "clients" header("HTTP/1.1 404 Not Found"); }

У нас есть два возможных результата:

  • Ресурс - это клиенты, и в этом случае мы возвращаем полный список
  • Существует еще один идентификатор

Если есть ещё один идентификатор, мы предполагаем, что это имя клиента, и, опять же, перенаправляем его в другую функцию, в зависимости от method . Мы используем оператор switch , которого следует избегать в реальном приложении:

Switch($method) { case "PUT": $this->create_contact($name); break; case "DELETE": $this->delete_contact($name); break; case "GET": $this->display_contact($name); break; default: header("HTTP/1.1 405 Method Not Allowed"); header("Allow: GET, PUT, DELETE"); break; }

Коды ответов

Коды ответа HTTP стандартизируют способ информирования клиента о результате его запроса.

Вы могли заметить, что пример приложения использует PHP header() , передавая некоторые странные строки в качестве аргументов. Функция header() печатает HTTP headers и гарантирует, что они отформатированы соответствующим образом. Заголовки должны быть первым в ответе, поэтому не стоит выводить что-либо ещё до того, как вы закончите с заголовками. Иногда ваш HTTP-сервер может быть настроен для добавления других заголовков в дополнение к тем, которые вы указали в коде.

Сервер должен вернуть наиболее подходящий код ответа HTTP; таким образом клиент может попытаться исправить свои ошибки, если они есть. Большинство людей знакомы с распространенным кодом ответа 404 Not Found , однако есть много более доступных, в соответствии множеству ситуаций.

Имейте в виду, что значение кода ответа HTTP не является чрезвычайно точным; это следствие того, что HTTP сам по себе довольно общий. Вы должны попытаться найти код ответа, который наиболее точно соответствует ситуации. Но и не слишком переживайте, если не сможете найти точное соответствие.

Вот несколько HTTP-кодов ответа, которые часто используются с REST:

200 OK

Этот код ответа указывает, что запрос был успешным.

201 Created

Это означает, что запрос был успешным и был создан ресурс. Он используется в случае успеха запроса PUT или POST .

400 Bad Request

Запрос был утерян. Это происходит особенно с запросами POST и PUT , когда данные не проходят валидацию или находятся в неправильном формате.

404 Not Found

Этот ответ указывает, что необходимый ресурс не найден. Обычно это относится ко всем запросам, которые указывают на URL-адрес без соответствующего ресурса.

401 Unauthorized

Эта ошибка означает, что вам необходимо выполнить проверку подлинности перед доступом к ресурсу.

405 Method Not Allowed

Используемый метод HTTP не поддерживается для этого ресурса.

409 Conflict

Это указывает на конфликт. Например, вы используете запрос PUT для создания одного и того же ресурса дважды.

500 Internal Server Error

Когда всё остальное терпит неудачу; как правило, ответ 500 используется, когда обработка завершается неудачно из-за непредвиденных обстоятельств на стороне сервера, что вызывает ошибку сервера.

Выполнение образца приложения

Давайте начнем с простого извлечения информации из приложения. Нам нужны детали клиента, " jim ", поэтому давайте отправим простой запрос GET на URL этого ресурса:

Curl -v http://localhost:80/clients/jim

Это отобразит полные сообщения headers. Последней строкой ответа будет body сообщения; в этом случае это будет JSON, содержащий адрес Jim (помните, что пропуск имени метода приведет к GET -запросу, а также замените localhost: 80 на имя сервера и порт, который вы используете).

Затем мы можем получить информацию для всех клиентов одновременно:

Curl -v http://localhost:80/clients/

Чтобы создать нового клиента с именем Paul ...

Curl -v -X PUT http://localhost:80/clients/paul -d "{"address":"Sunset Boulevard" }

и вы получите список всех клиентов, содержащих Paul в качестве подтверждения.

Наконец, чтобы удалить клиента:

Curl -v -X DELETE http://localhost:80/clients/anne

Вы обнаружите, что возвращённый JSON больше не содержит никаких данных об Anne.

Если вы пытаетесь получить несуществующего клиента, например:

Curl -v http://localhost:80/clients/jerry

Вы получите ошибку 404, в то время как при попытке создать уже существующего клиента:

curl -v -X PUT http://localhost:80/clients/anne

вместо этого получите ошибку 409.

Заключение

В общем, чем меньше предположений за пределами HTTP вы делаете, тем лучше.

Важно помнить, что HTTP был задуман для взаимодействия между системами, которые ничто не разделяет, кроме понимания протокола. В целом, чем меньше допущений за пределами HTTP вы делаете, тем лучше: это позволяет широкому кругу программ и устройств получать доступ к вашему API.

Я использовал PHP в этом уроке, потому что это, скорее всего, язык, наиболее знакомый читателям Nettuts +. Тем не менее, PHP, хотя и предназначен для Интернета, вероятно, не самый лучший язык для работы при REST-способе, поскольку он обрабатывает запросы PUT совсем иначе, чем GET и POST .

Помимо PHP, вы можете принять во внимание следующее:

  • Различные Ruby frameworks (Rails и Sinatra)
  • В Python есть отличная поддержка REST. Должны работать Plain Django и WebOb , или Werkzeug .
  • node.js отлично поддерживает REST

Среди приложений, которые пытаются придерживаться принципов REST, классическим примером является Atom Publishing Protocol , хотя на самом деле он не используется слишком часто на практике. За современным приложением, основанным на философии использования HTTP в полной мере, обратитесь к Apache CouchDB .

Фанатов WordPress становится больше с каждым днём, и многие используют этот движок уже просто как CMS. Он настолько прост, что понятен даже новичку-не-программисту. Ниже я покажу несколько приёмов, которые используются многими продвинутым блоггерами, в основном приёмы эти направлены на юзабилити;

1) Динамичная подсветка меню

Как сделать динамичную подсветку меню,как, пример, . Пишем условие: если это первая страница Home / Category / Archive / Search / Single, добавим class=current к тегу li (он будет подсвечиватся как Gallery). Если второй элемент будет «About», добавьте класс «current». и т.д.

2) Динамичные теги в заголовке

Для того, чтобы использовать динамичные заголовки для страниц, пишем в header.php.

<?php if (is_home() ) { echo bloginfo("name" ) ; } elseif (is_404() ) { echo "404 Not Found" ; } elseif (is_category() ) { echo "Category:" ; wp_title("" ) ; } elseif (is_search() ) { echo "Search Results" ; } elseif ( is_day() || is_month() || is_year() ) { echo "Archives:" ; wp_title("" ) ; } else { echo wp_title("" ) ; } ?>

<?php if (is_home()) { echo bloginfo("name"); } elseif (is_404()) { echo "404 Not Found"; } elseif (is_category()) { echo "Category:"; wp_title(""); } elseif (is_search()) { echo "Search Results"; } elseif (is_day() || is_month() || is_year()) { echo "Archives:"; wp_title(""); } else { echo wp_title(""); } ?>

3) Динамичный контент:

Если хотите, чтобы какой-то контент находился только на первой странице, пишем:

5) Как сменить тему отдельной категории

Допустим, вы хотите сменить тему для постов какого-то отдельной категории. Для этого можно воспользоваться функцией in_category.
Если по-умолчанию стоит single.php, используйте этот код. Если пост в категории 1 используем single1.php, для категории 2, — single2.php, ну и для других single_other.php.

post; if ( in_category("1" ) ) { include (TEMPLATEPATH . "/single1.php" ) ; } elseif ( in_category("2" ) ) { include (TEMPLATEPATH . "/single2.php" ) ; } else { include (TEMPLATEPATH . "/single_other.php" ) ; } ? >

post; if (in_category("1")) { include(TEMPLATEPATH . "/single1.php"); } elseif (in_category("2")) { include(TEMPLATEPATH . "/single2.php"); } else { include(TEMPLATEPATH . "/single_other.php"); } ? >

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

6) Уникальная тема категории

Что если вы хотите особенную тему для определённой категории? Просто сохраним тему этой категории под именем category-2.php (именно по таком шаблону!). Так, category-2.php будет использоваться категорией categoryID 2, category-3.php — категорией categoryID 3 и т.д.

Довольно просто решаема задача. Для этого нам нужно задать переменную ($loopcounter) в цикл. Если $loopcounter меньше или равно 1, подключается код google-ad.php.

// the loop stuffs

// the loop stuffs

Query Posts

Query Posts используется для контроля над выводом постов внутри цикла. С его помощью можно управлять тем, что выводить, когда выводить и как выводить.

8) Выводим последние посты

последние 5 постов:

  • ">

  • ">

9) Посты определённой категории

  • ">

  • ">

Допустим, нам нужно исключить отображение какой- либо категории (categoryID 2):

//the loop here

//the loop here

Произвольные поля (Custom Field)

Custom Field — очень полезная вещь, довольно часто используется для вывода информации после поста. Используется, например, для вывода информации об авторе поста.

Для начала добавим Произвольное поле в пост.

Чтобы отобразить изображение и прикрепить к нему ссылку на пост, помещаем следующий код в цикл (перед самим текстом поста):

//получаем картинку (custom field) ?> ID , "article_image" , true ) ; ?> "> " alt=" " />

ID, "article_image", true); ?> ">" alt="" />

Не забывайте, что произвольных полей после поста может быть несколько. Похожий эффект можно увидеть на Best Web Gallery , где подобным образом отображены миниатюры, ссылки URL и подсветка информации. Также о произвольных полях можно почитать в данной статье — использование custom fields в WordPress .

WP List Pages

Тег wp_list_pages используется для отображения списка страниц в хедере и сайдбаре

12)Site map

Для того, чтобы отобразить Site map, достаточно добавить этот код в страницу sitemap.php

Замечу, что pageID 12 исключена, т.к. это страница — сама sitemap.php, и её не нужно отображать…
Метод работает, хотя, наверное, лучше воспользоваться более стандартным методом и построить карту сайта с помощью плагина .

13) Динамичное субстраничное меню

Добавьте этот код в sidebar.php и он отобразит субстраничное меню, если субстраницы есть на этой странице:

ID . "&echo=0" ) ; if ($children ) { ?>

ID."&echo=0"); if ($children) { ?>

14) Тема страницы

Хорошо бы не упускать и такую функцию как Page Template, которая позволяет задавать новую тему для вашего блога. Для начала, нужно создать саму тему, затем нужно обозначить странице своб собственную тему. Вот как она выглядит (напр., portfolio.php)

/* Template Name: Portfolio */ ?> //the loop here

//the loop here

При написании или редактировании страницы, справа можно будет увидеть “Page Template”, и там указать нужную тему.

Опции WordPress

Последнее, что мы рассмотрим, будут опиции самого WordPress и блога в целом.

15) Стартовая страница

По умолчанию, WordPress располагает блог на стартовой странице сайта. Но если вы хотите какую-то другую страницу, например, приветствие, то зайдите Admin > Options > Reading.

16) Адреса страниц

По умолчанию, WordPress использует ссылки вида Permalinks www.yoursite.com/?p=123, которе не красивы и не понятны поисковикам. Но можно поменять это в Admin > Options > Permalinks (Параметры > Постоянные ссылки). Неплохой вариант записи адресов вот этот: /%category%/%postname%/

По умолчанию, WordPress использует префикс категорий «category» (напр., yoursite.com/category/cat-name/). Но чтобы заменить его на «article» , зайдите в Options > Permalinks (Параметры > Постоянные ссылки), и ссылки будут выглядеть так: yoursite.com/article/cat-name/

Если хотите, то префикс с помощью специальных плагинов.

Вот такие получились эти 17 приемчиков для WordPress, спасибо Михаилу за них. Напоминаю, что много чего полезного вы также сможете найти в его блоге про веб-дизайн , где собрана масса интересной информации. В принципе, некоторые хаки уже рассматривались, но такого своего рода повторение, не помешает. Где это было возможным я добавил ссылки на полноценные (более подробные) с детальным рассмотрением вопроса. Хотя это больше для новичков, опытным разработчикам хватит приведенного в статье кода, вы, думаю, сможете сами добавить туда, что нужно:)

P.S. Постовой. Для тих, хто планує серйозно зайнятися дизайном будуть корисні Відеоуроки з веб-дизайну – українською! — приєднуйтесь до читачів сайту.
Интернет магазин ЛинзМастер предлагает контактные линзы , цветные контактные линзы, а также растворы и аксессуары.

Ни один сайт не обходится без навигации или как еще называют "меню сайта". Так вот меню сайта бывает одноуровневым и многоуровневым в виде дерева. Если с одноуровневым меню особых сложностей в плане реализации не возникает, то при создании многоуровневого меню нужно хорошо подумать.

Самое главное в этой задаче это спроектировать базу данных для нашего многоуровневого меню. Создадим таблицу Categories с тремя полями id , title , parent где:

  • ID - идентификатор
  • Title - Название меню
  • Parent - Родитель категории по умолчанию 0

За ветвление меню отвечает поле Parent если Parent = 0 , то эта категория является родительской. Для того чтобы добавить потомков к родительской категории нужно в поле parent указать ID нужного родителя. Например:

Таблицы с категориями

Как видно из таблицы, у родительской категории Автомобили есть два потомка - это Мазда и Хонда связанных по полю Parent . А у категории Мотоциклы два потомка - это Кавасаки и Харлей . При этом у категории Лодки нет потомков. Надеюсь, что Вы поняли,как связать категории.

Далее переходим от слов к практике. Создадим таблицу Categories.

CREATE TABLE IF NOT EXISTS `categories` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Дамп данных таблицы `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`) VALUES (1, "Автомобили", 0), (2, "Мотоциклы", 0), (3, "Мазда", 1), (4, "Хонда", 1), (5, "Кавасаки", 2), (6, "Харлей", 2), (7, "Мазда 3", 3), (8, "Мазда 6", 3), (9, "Седан", 7), (10, "Хечбэк", 7), (11, "Лодки", 0), (12, "Лифтбэк", 8), (13, "Кроссовер", 8), (14, "Белый", 13), (15, "Красный", 13), (16, "Черный", 13), (17, "Зеленый", 13), (18, "Мазда CX", 3), (19, "Мазда MX", 3);

Алгоритм работы состоит из следующего:

Создаем соединение с базой данных

query("SET NAMES "utf8""); /* * Это "официальный" объектно-ориентированный способ сделать это * однако $connect_error не работал вплоть до версий PHP 5.2.9 и 5.3.0. */ if ($mysqli->connect_error) { die("Ошибка подключения (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); } /* * Если нужно быть уверенным в совместимости с версиями до 5.2.9, * лучше использовать такой код */ if (mysqli_connect_error()) { die("Ошибка подключения (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); }

Пишем функцию получения данных из таблицы Categories

//Получаем массив нашего меню из БД в виде массива function getCat($mysqli){ $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Создаем масив где ключ массива является ID меню $cat = array(); while($row = $res->fetch_assoc()){ $cat[$row["id"]] = $row; } return $cat; }

Получаем массив вот такого вида, где ключ массива это ID категории.

Функция построения дерева из массива от Tommy Lacroix

//Функция построения дерева из массива от Tommy Lacroix function getTree($dataset) { $tree = array(); foreach ($dataset as $id => &$node) { //Если нет вложений if (!$node["parent"]){ $tree[$id] = &$node; }else{ //Если есть потомки то перебераем массив $dataset[$node["parent"]]["childs"][$id] = &$node; } } return $tree; }

Получаем массив в виде дерева

Скрипт целиком

query("SET NAMES "utf8""); /* * Это "официальный" объектно-ориентированный способ сделать это * однако $connect_error не работал вплоть до версий PHP 5.2.9 и 5.3.0. */ if ($mysqli->connect_error) { die("Ошибка подключения (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); } /* * Если нужно быть уверенным в совместимости с версиями до 5.2.9, * лучше использовать такой код */ if (mysqli_connect_error()) { die("Ошибка подключения (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); } //Получаем массив нашего меню из БД в виде массива function getCat($mysqli){ $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Создаем масив где ключ массива является ID меню $cat = array(); while($row = $res->fetch_assoc()){ $cat[$row["id"]] = $row; } return $cat; } //Функция построения дерева из массива от Tommy Lacroix function getTree($dataset) { $tree = array(); foreach ($dataset as $id => &$node) { //Если нет вложений if (!$node["parent"]){ $tree[$id] = &$node; }else{ //Если есть потомки то перебераем массив $dataset[$node["parent"]]["childs"][$id] = &$node; } } return $tree; } //Получаем подготовленный массив с данными $cat = getCat($mysqli); //Создаем древовидное меню $tree = getTree($cat); //Шаблон для вывода меню в виде дерева function tplMenu($category){ $menu = "
  • ". $category["title"].""; if(isset($category["childs"])){ $menu .= "
      ". showCat($category["childs"]) ."
    "; } $menu .= "
  • "; return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data){ $string = ""; foreach($data as $item){ $string .= tplMenu($item); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree); //Выводим на экран echo "
      ". $cat_menu ."
    "; ?>

    Результат работы

    Многоуровневое меню на PHP + MySQL для админки

    Если Вы хотите использовать данное меню в админке своего сайта, то нужно переписать пару функций tplMenu() , showCat() .

    ".$category["title"].""; }else{ $menu = ""; } if(isset($category["childs"])){ $i = 1; for($j = 0; $j < $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    Результат работы

    Выбери Автомобили → Мазда →→ Мазда 3 →→→ Седан →→→ Хечбэк →→ Мазда 6 →→→ Лифтбэк →→→ Кроссовер →→→→ Белый →→→→ Красный →→→→ Черный →→→→ Зеленый →→ Мазда CX →→ Мазда MX → Хонда Мотоциклы → Кавасаки → Харлей Лодки