Все записи автора Profer

программист

Шорткоды в 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 - это просто описание. Таким образом вы можете задать любой удобный для вас интервал.

Скрытие ссылок и блоков с помощью JS/Ajax

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

Скрытие блоков

Самый первый и простой способ, который мной был тестирован несколько лет назад - это просто оборачивание блока в JS-вывод. Например:

Такой способ прост, но в данном случае информация остаётся на странице, хоть и завёрнутая в блок script. Раньше поисковики не учитывали подобные js-блоки, но теперь они вполне способны это переварить, что нас может весьма не устраивать 🙂

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

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

В самом выводе есть два варианта. Первый - когда блок у вас статичен и не меняется. Тут всё просто, забиваем его в в скрипт вывода. Выглядеть будет примерно так:

В другом случае - блок динамический (например те же последние новости/записи). В этом случае нам нужно будет подсоединить к нашему скрипту ещё и сам движок WP. Делается это просто, необходимо подсоединить файл wp-config.php, а он за собой уже подтянет весь движок. Блок для вывода последних постов будет так:

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

Теперь необходимо это закинуть куда-нибудь на сайт, например в папку "ajax" в корень сайта, а сам файл назвать output.php.

Теперь приступим к выводу на стороне пользователя. Здесь мы просто должны сделать $_POST-запрос с названием нужного нам блока. Например так:

Перед этим надо не забыть вывести блок, куда собственно будет подставлять информация после AJAX-запроса:

Скрытие ссылок

Тут можно поступить так же, как и с блоками: самый простой - просто обернуть в JS, посложнее - AJAX, но тут для каждой ссылки нужно будет задавать своё название.

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

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

Как мы видим, здесь добавились классы, класс "replace" указывает, кто будет принимать ссылку, а по классу "donor" мы будем определять пару для поиска. Поиск и подстановка события onclick через JS выглядит так:

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

Есть и четвёртый вариант. В данном случае мы не будем указывать явно ссылку, а зададим её через сторонний атрибут "date-loc" и заменим слеши на пробелы, т.е. было так:

стало:

Теперь осталось через JS задать действие для перехода, для всех ссылок, которым мы указали класс "new_location":

Таким образом будут обратно подставляться слеши и делаться переход при клике.

Какой вариант лучше, выбирайте сами 🙂 Так же не забывайте, что для исправной работы всех представленных выше кодов, вам понадобится подключённая библиотека JQuery.

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

С версии 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'] - высота изображения.

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

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

Простые редиректы в WordPress

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

Первым аргументом функции указывается куда производиться редирект, а второй - статус код.

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

Здесь вызывается наша функция my_redirect перед тем, как будет загружен шаблон сайта. Последнее число в примере обозначает приоритет выполнения, чем выше число, тем позже выполнится функция. Теперь осталось написать функцию my_redirect, которая будет отвечать за условия редиректа и вставить это всё в function.php нашей темы. Ниже я приведу пример:

В данном примере я делаю редирект с неправильного URL-а поста на правильный, это бывает необходимо в том случае, если по какой-либо причине у вас где-нибудь просочился не верный URL. Например ссылка "www.example.com/my_category/post.html/123" будет открываться так же, как и "www.example.com/post.html", что не очень хорошо, особенно для поисковиков, ведь по сути это дубль. Таким образом можно задать автоматические условия для перенаправления на правильные URL-ы.