Архив рубрики: Внутренний функционал

Шорткоды в WordPress

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

Таким образом мы можем вызвать заранее определённую функцию, которая будет прикреплена к названию шорткода. Название может быть любое, в данном случае было выбрано "shortcode". Так же в данном случае в функцию будут переданы ещё два параметра: param1 и param2. Однако указывать параметры не обязательно, если ваша функция их не использует.

Теперь нужно написать нашу функцию и привязать её к соответствующему шорткоду.

С помощью специальной функции add_shortcode мы привязали нашу функцию shortcode_func к выводу шорткода shortcode. В функции сделана распаковка входных данных $atributs в отдельные переменные. Так же для переменных указаны значения по-умолчанию, которые будут использованы, если не указать при добавлении шорткода этих параметров. Если вы не используете параметры при добавлении вообще, то и тогда в самой функции не надо делать распаковку входных параметров.

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

Встроенный сron в WordPress

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

Главная функция, которая собственно цепляется за cron, выглядит так:

Разберёмся с параметрами:

  1. $timestamp - когда запустить cron, необходимо указать время в Unix-формате, если с текущего момента, то просто time()
  2. $recurrence - как часто запускать, по умолчанию доступны 3 варианта:
    • hourly - раз в час
    • twicedaily - каждые 12 часов
    • daily - раз в день

    так же можно добавить свои варианты, но об этом позже

  3. $hook - собственно название нашего cron-а, можно придумать любое, оно служит для идентификации для других функций
  4. $args  - аргументы, которые будут передаваться нашей запускаемой функции (не обязательный параметр)

Для примера буду использовать активацию плагина, т.к. внутренний cron как раз используется в основном в плагинах.

В данном примере, после активации плагина, будет запускаться функция funct_hourly (мы повесили её с помощью функции add_action на идентификатор cron-а), которая в свою очередь будет отправлять письмо с уведомлением о запуске. Обратите внимание на функцию wp_next_scheduled, она проверяет был ли запущен подобный cron или нет, иначе при каждой активации вы будете получать новый дубль cron-а. Так что в данном случае, если функцию проверки убрать и активировать плагин 3 раза, вы будете получать по 3 письма каждый час.

С включением крона разобрались, теперь осталось научиться его отключать. Для этого используется следующая функция:

Параметры:

  1. $timestamp - время, когда крон будет запущен в следующий раз
  2. $hook - название нашего cron-а

Пример отключения при деактивации плагина:

С помощью функции wp_next_scheduled мы получаем время, когда будет запущен в очередной раз наш cron, а потом передаём в функцию деактивации. Так же можно отключить все запланированные ранее кроны с помощью функции wp_clear_scheduled_hook(). Она основана на функции wp_unschedule_event() и вызывается так:

Ну и напоследок расскажу как задавать свои интервалы времени:

Мы указали свою функцию cron_add_new, которая передаёт параметры для нового интервала. Здесь всё просто: указываем interval в количестве секунд, а так же display - это просто описание. Таким образом вы можете задать любой удобный для вас интервал.

Изменение изображений с помощью встроенных средств

С версии 3.5.0 появился весьма удобный редактор изображений wp_get_image_editor. Сегодня поговорим о его возможностях, а в конце я приведу одну готовую полезную функцию.

Вызов осуществляется следующим образом:

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

Основной функционал следующий:

1) Изменение размера:

Первое значение соответственно ширина нового изображения, а второе - высота. Последний аргумент отвечает за то, будет ли использоваться обрезка изображения или нет. В данном случае будет создана миниатюра с разрешением 180х120, которая будет обрезана по большей стороне, если само изображение не соответствует данному соотношению сторон (3:2).

2) Изменение качества сжатия:

Главный аргумент - значение числа от 1 до 100, чем выше, тем лучше качество, чем ниже тем меньше размер итогового изображения.

3) Вырезка куска изображения:

Параметры $start_x и $start_y отвечают за отступ начальной позиции для вырезки, $width и $height - отвечают за ширину и высоту того куска, который будет вырезан. Последние два аргумента $new_width  и $new_height отвечают за новый размер вырезанного куска изображения, можно не указывать.

4) Вращение:

Вращает изображение на соответствующий угол. Если угол не кратен 90, то пустой фон нового изображения будет залит чёрным цветом.

5) Зеркалирование:

Здесь всего два аргумента, первый - будет ли повёрнуто изображение относительно горизонтали, а второе - будет ли повёрнуто изображение относительно вертикали.

6) Сохранение:

Сохраняет новое изображение и возвращает массив с данными о нём, $save_img['path'] - полный путь до изображения, $save_img['file'] - название файла, $save_img['width'] - ширина и $save_img['height'] - высота изображения.

А теперь полезная функция на основе этого функционала:

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

Разделяемый контент

Был у меня такой запрос от заказчика, чтобы контент был различный, в зависимости от того, где пользователь находится. Суть такова: на главной отображаются ссылки на новости и Статьи(соответственно рубрики «Новости» и «Статьи»), а так же список рубрик(конкретно – марки автомобилей, например «Ford»), при нажатии на которые ссылки, которые вели на общие новости и статьи, теперь должны вести на подрубрики новости и статьи из выбранной рубрики автомобиля, но есть одна особенность: новости и статьи – это подрубрики моделей авто, которые соответственно подрубрики марки (выглядит как Ford->Focus->Новости и Ford->Focus->Статьи или Ford->Mondeo->Новости и Ford->Mondeo->Статьи). Помимо этого в сайдбарах так же выводятся по 2 новости и статьи, и они соответственно должны меняться, когда заходишь в рубрику с маркой авто. Весьма интересная задачка, на мой взгляд, делаем :).

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

  • 1) главная страница (отображаем из рубрик «Новости» и «Статьи»)
  • 2) рубрики «Новости» и «Статьи» и посты в них (отображаем из рубрик «Новости» и «Статьи»)
  • 3) страницы (отображаем из рубрик «Новости» и «Статьи»)
  • 4) рубрики машин и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)
  • 5) подрубрики «Новости» и «Статьи» рубрик автомобилей и их посты (отображаем из подрубрик «Новости» и «Статьи» конкретной марки)

Строим последовательно алгоритм, который и проверяет где мы находимся. Определяем ID текущей рубрики, если находимся непосредственно в рубрике, то всё просто – берём ID по названию рубрики, если же находимся в посте, то берём последовательную иерархию рубрик (по сути «хлебные крошки») и берём саму главную рубрику.

Проверка is_front_page() используется в том случае, если главная – отдельная страница, если же у вас идёт просто вывод постов, то используйте is_home(). После выполнения алгоритма id рубрики сохранится в $id1, а её урл в $cat_url. Так же мы сохранили id в глобальном массиве ($GLOBALS["figna"] :)), чтобы была возможность использовать это значение во всех файлах темы.

Теперь выводим наши ссылки соответствующим образом:

ID 1 и 59 – это номера рубрик «Новости» и «Статьи», вместо них подставте свои. Как видите к ссылке рубрики я дополнительно прикрепил параметр act, который принимает 2 значения news и posts, т.е. в зависимости от этого параметра мы будем выводить посты или новости.

Всё это я прописывал в header.php, следующим для правок идёт archive.php, здесь уже будем разбирать, что же нам надо выводить.

Первым делом отлавливаем параметр act. если его нету, то выводим как обычно. Если параметр есть, то в зависимости от его значения делаем отсев с помощью query_posts. Суть отсева прост: берём все подрубрики нашей марки и отсеиваем по значению имени равного «Новости» или «Статьи».Выглядит это так:

Вставляем это перед основным циклом вывода записей.

Теперь осталось только в сайдбарах тот же отсев сделать, алгоритм практический идентичен, только добавляем ограничение на количество постов showposts=2.

Новости выводятся так же, просто нужно слово «Статьи» поменять на «Новости». Вот таким образом и решилась задачка.

Из 1С в WordPress

Возник как-то вопрос о том, каким образом можно перенести часть базы из 1с v7.7 в wordpress. Необходимо было сделать один из справочников из 1С в wordpress в виде каталога.

Итак разберёмся. В wordpress можно экспортировать данные файлом xml, определённым образом построенным. В 1С базы обычно хранятся в файлах dbf. Существует несколько путей решения, можно работать с dbf напрямую (используя инструмент dbase ) или же переконвертировать нашу базу в удобоваримый формат (xml, mysql или даже txt), благо конвертеров из одного формата в другой хватает на просторах интернета. Если пойти первым путём, то сперва стоит покопаться в файле 1cv77.dd, это словарь данных, который описывает таблицы БД, открывается обычным блокнотом. По второму пути – соответственно поискать необходимый конвертер в интернете.

Моя задача осложнялась тем, что база хранилась в формате MS SQL(не путать с MySQL :)), и доступ к базе был только через интерфейс 1С. Через какое-то время нашёл решение - tool2dbf.zip - обработка выгрузки любого справочника платформы 1С:Предприятие в таблицу формата *.DBF. Позволяет выгрузить любую таблицу в dbf файл. С dbf я возиться не стал и воспользовался конвертировщиком в xml . С получившимся файлом удобно работать используя SimpleXML (ещё один удобный инструмент php, предназначен для работы с xml, как и следует из названия). Для пример кусок получившегося xml файла:

Теперь необходимо выстроить этот файл таким образом, чтобы его воспринял wordpress. Структуру внутри wordpress будем строить такую: наименование – это собственно пост, ну а папка, в которой лежит это наименование – это категория. Структруа же нашего xml файла содержит примерно такие поля: код(CODE), короткое описание(DESCR), код родителя(PARENT), группа (GROUP, пусто, если не группа, и 1, если группа), полное описание(FULLDESCR) и некоторые другие поля, которые нам не важны.
Пример файла, который необходим для импорта, вы можете получить просто экспортнув свои данные через админку. В этом файле содержится много полей для каждого поста, я же пошёл путём минимализма и проверил какой минимум необходим при импорте, чтобы wordpress воспринял посты нормально. В итоге получилась примерно следующая схема для поста:

Первые пункты понятны из описания, пункт wp:status отвечает за то, опубликован пост или ещё находится в черновиках, ну а последний пункт – это соответственно тип данных(пост или страница).
Категории же выглядят следующим образом:

Стоит отметить, что такая запись отличается, от стандартной, которую вы увидите при экспорте в xml. Например:

И кусок из item:

По подобному принципу я пытался сделать импорт, но почему то статьи не привязывались к рубрикам. Немного поэксперементировав пришёл к решению, которое описал выше, главное чтоб у вас стоял и был автивирован плагин rustolat, он сделают всю работу по добавлению к рубрикам короткого названия на латинице для урла.
Исходный файл известен, файл, который мы должны изучить, тоже известен, приступим к преобразованию из одного в другой.
Алгоритм работы следующий:
1) собираем все рубрики, для этого нам поможет признак в файле, дополнительно не забываем собрать id-шники рубрик, они нам пригодятся на следующем шаге,
2) после отсева рубрик собираем наши посты и присваиваем их определённой рубрике, рубрика указана id-шником в , вот тут нам и пригодятся собранные id-шники с именами рубрик, чтобы заменить уже циферку на название.
Используем простое и удобное средство для работы с xml файлами SimpleXML, весь код:

Скрипт открывает файл export.xml и работает с ним через инструменты, а с выходным файлом – как с обычным текстовым. Собрав все категории сперва заносит их в файл, а потом поочерёдно ситывает и заносит наши пункты справочника в виде постов. Остаётся только произвести импорт через админку Инструменты -> Импорт, выбираем пункт WordPress и далее наш получившийся файл. После завершения импорта можно взглянуть на результат своих трудов :).