Как делать AJAX-запросы в WordPress? Основы.

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

Задача: Без перезагрузки страницы отправить данные на сервер (сделать запрос), далее получить ответ, обработать и вывести на клиентской части (в браузере).

Решение: Прежде всего стоит отметить, что рассматриваемая последовательность действий и особенности работы с AJAX в этой статье справедливы только для WordPress и не будут соответственно работать в других CMS. Это нужно понимать. Что всё происходит в контексте CMS WordPress.

Последовательность

Прежде всего начнём с последовательности. Именно тут важно уловить принцип работы AJAX в WordPress.

  1. На странице происходит какое-то событие (клик, выбор варианта из выпадающего списка, отметка чек-бокса и т.п.)
  2. Это событие вызывает функцию JavaScript или на базе библиотеки jQuery.
  3. В эту функцию передаются данные и отправляются на сервер через HTTP-запрос.
  4. AJAX — это соединение технологий для асинхронной отправки данных (т.е. без перезагрузки страницы). AJAX-запрос можно выполнить на чистом JavaScript или через методы библиотеки jQuery. Так как jQuery входит в ядро WordPress принято писать запросы на базе её.
  5. Сервер получает наш запрос и обрабатывает данные — выполняет функции на уровне PHP и СУБД (база данных).
  6. Далее, сервер отправляет обработанные данные или просто какую-то служебную информацию браузеру в виде HTTP-ответа
  7. Функция (метод) библиотеки jQuery, которая изначально отправила запрос, получив ответ от сервера, может, например, вывести сообщение пользователю или обновить какую-то информацию на странице, естественно без её перезагрузки.

Примерно такая последовательность происходит при взаимодействии браузера (клиентская часть) с сервером по средствам AJAX. И сейчас с помощью кода мы восполним эту последовательность и посмотрим на неё в действии.

По классике создадим кнопочку и добавим её на страницу нашего сайта. Как создать кнопку в редакторе Gutenberg?

При создании кнопки задайте ей идентификатор. По ссылке выше есть полный пример добавления. Предположим ID нашей кнопки так и называется «knopochka». Теперь переходим к первому шагу — отслеживанию события. Отслеживать мы будем клик по этой кнопочке. Использовать AJAX мы будем на базе библиотеке jQuery при помощи метода .post()

И первый наш скрипт будет выглядеть вот так:

jQuery(document).ready(function ($) {
    $.post({
        url: url,
        data: data,
        success: success,
        dataType: dataType
    });
});

Давайте немного разберёмся в основных моментах. Самый главный момент это url — адрес куда будет отправлен наш запрос. В качестве данных (data) запроса у нас будет выступать строка или JSON объект.

Все AJAX-запросы для обработки в WordPress должны отправляться на специальный адрес wp-admin/admin-ajax.php. Естественно этот адрес на уровне jQuery получить не получится (хотя и можно его полностью прописать, но такой способ не будет универсальным). Для этого мы задействуем специальную функцию wp_localize_script() которая его и определит для дальнейшего использования.

Стоит отметить, что это необходимо делать для запросов в публичной части сайта, если вы разрабатываете функционал для Панели управления (“админка”) — приватной части сайта, то там уже необходимые переменные определены и вызывать wp_localize_script() перед вашим скриптом нет необходимости.

Подключение JS-скрипта

Создайте файлик с расширением js и подключите его на ваш сайт. Функция подключения скрипта из плагина может выглядеть примерно так:

function my_load_scripts( $hook ) {

	wp_register_script(
		'ajax_demo',
		get_template_directory_uri() . '/assets/js/public.js',
		array( 'jquery' ),
		filemtime( get_theme_file_path( 'assets/js/public.js' ) ), // Кэш?  Не-е, не слышали!
		array(
			//'in_footer' => true,
			//'strategy' => 'defer',
		)
	);

	// хак по борьбе с кешем)
	$my_js_ver = date( "ymd-Gis", filemtime( plugin_dir_path( __FILE__ ) . 'ajax-demo.js' ) );

	wp_register_script( 'ajax_demo', plugins_url( 'ajax-demo.js', __FILE__ ), array( 'jquery' ), $my_js_ver );
	wp_enqueue_script( 'ajax_demo' );
}

add_action( 'wp_enqueue_scripts', 'my_load_scripts' );

После подключения убедитесь в том, что ваш скрипт «инклудится» на странице. Так как мы передали одним из аргументов в функцию wp_enqueue_script подключения скрипта array(‘jquery’) — зависимость от библиотеки jQuery, то ожидаем, что наш скрипт будет подключён после jQuery. Это можно увидеть в примере ниже:

скрипт подключён

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

jQuery(document).ready(function ($) {
    $("#knopochka").click(function () {
        alert("Это вызов обработчика по событию .click()");
    });
});

Теперь клик по нашей кнопке будет вызывать метод alert()

метод alert()

Отлично! Теперь переходим непосредственно к отправке AJAX-запроса и первым делом нам нужно получить URL обработчика. В этом нам поможет специальная функция wp_localize_script()

function my_load_scripts( $hook ) {

	// хак по борьбе с кешем)
	$my_js_ver = date( "ymd-Gis", filemtime( plugin_dir_path( __FILE__ ) . 'ajax-demo.js' ) );

	wp_register_script( 'ajax_demo', plugins_url( 'ajax-demo.js', __FILE__ ), array( 'jquery' ), $my_js_ver );
	wp_localize_script( 'ajax_demo', 'demo_ajax_object',
		array(
			'ajaxurl'   => admin_url( 'admin-ajax.php' ),
			'demo_id'  => get_the_ID(),
			'data_demo' => 'value demo',
		)
	);

	wp_enqueue_script( 'ajax_demo' );
}

add_action( 'wp_enqueue_scripts', 'my_load_scripts' );

wp_localize_script() отработает в том случае, если зарегистрированный скрипт будет подключен. Наш скрипт зарегистрирован под идентификатором «ajax_demo», соответственно первым аргументом мы эту зависимость и указали функции wp_localize_script(), ну а следующий аргумент — это название объекта «demo_ajax_object», в котором будут находится данные в виде «ключ:значение«:

  • ‘ajaxurl’ который будет передавать полный УРЛ на файл wp-admin/admin-ajax.php для обработки AJAX-запросов
  • ‘demo_id’ — «айдишник» текущей страницы
  • ‘data_demo’ -и просто для примера какие-то произвольные данные

Если вы всё сделали правильно, то должны увидеть перед своим скриптом выполнение этой функции, где уже определенны нужные нам данные, которые в дальнейшем мы можем задействовать в нашем скрипте.

Вернёмся к нашему скрипту JS и добавим в него часть ранее рассмотренного кода:

jQuery(document).ready(function ($) {
    $("#knopochka").click(function () {
        $.post({
            url: demo_ajax_object.ajaxurl,
            data: {
                'action': "",
                'page_id': demo_ajax_object.demo_id,
                'demo_text': demo_ajax_object.data_demo,
            },
        });
    });
});

Я думаю код не нуждается в подробных комментариях. Мы просто получаем данные из ранее созданного объекта demo_ajax_object.

Единственное новое тут это ‘action’. Здесь мы должны будем указать функцию, которая будет обрабатывать наши данные.

Предположим, что по клику мы хотим получать заголовок текущей страницы. Назовем нашу функцию-обработчик на стороне PHP — «demo_get_title_by_id» и укажем её значением к ключу

‘action’: ‘demo_get_title_by_id’,

Если придерживаться плана, который был определён последовательно в начале статьи, то мы уже находимся на 3-ем шаге

Передача данных на сервер и их дальнейшая обработка

«Встречать» наши данные в файле wp-ajax.php (туда куда мы их направляем) будут специальные функции, которые в WordPress называются:

  • wp_ajax_{$action} — срабатывает только для авторизованных на сайте (вошедших в систему) пользователей
  • wp_ajax_nopriv_{$action} — соответственно для не авторизованных, т.е. для обычных посетителей сайта

В отличие от wp_ajax_{$action}, глобальное свойство на уровне объекта JavaScript ajaxurl не будет определяться автоматически и должно быть включено вручную или с помощью wp_localize_script() с admin_url(‘admin-ajax.php’) в качестве определённых данных (что собственно и было сделано выше).

https://developer.wordpress.org/reference/hooks/wp_ajax_nopriv_action/

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

add_action( "wp_ajax_demo_get_title_by_id", "demo_get_title_by_id" );
add_action( "wp_ajax_nopriv_demo_get_title_by_id", "demo_get_title_by_id" );

function demo_get_title_by_id() {

	echo "Это работает!";

	wp_die();

}

Допишем наш js скрипт. Добавим в него третий аргумент функцию обратного вызова которая выполняется в случае успешного выполнения запроса.

jQuery(document).ready(function ($) {
    $("#knopochka").click(function () {
        $.post({
            url: demo_ajax_object.ajaxurl,
            data: {
                'action': 'demo_get_title_by_id',
                'page_id': demo_ajax_object.demo_id,
                'demo_text': demo_ajax_object.data_demo,
            },
            success: function (response) {
                console.log('AJAX ответ : ',response);
            }
        });
    });
});

Если вы всё сделали правильно, то теперь по клику на кнопочку в консоли браузера вы должны увидеть результат работы функции-обработчика вашего AJAX-запроса 🙂

AJAX ответ :  Это работает!

Принимаем данные на сервере

Что ж, пришла пора встретить наши данные на уровне сервера в нашей PHP-функции. Сделать это можно при помощи $_GET, $_POST и $_COOKIE или общей переменной HTTP-запроса $_REQUEST, которая уже содержит в себе данные первых трёх.

В целях безопасности не рекомендуется использовать $_REQUEST (в связи с возможностью подлогом куки), а использовать ту глобальную переменную, которая соответствует вашему запросу.

add_action( "wp_ajax_demo_get_title_by_id", "demo_get_title_by_id" );
add_action( "wp_ajax_nopriv_demo_get_title_by_id", "demo_get_title_by_id" );

function demo_get_title_by_id() {

	$id = $_POST['page_id'];
	$txt = $_POST['demo_text'];

	echo $id . " " . $txt;

	wp_die();

}

Вот таким образом мы можем принять данные из нашего POST-запроса. Вот результат:

POST-запрос

Мы не будем затрагивать все аспекты безопасности (такие как чистка данных перед сохранением или выводом), а рассмотрим только один — защиту нашего запроса, чтобы быть уверенными, что обрабатываться на стороне PHP будет наш POST-запроса, который отправляется по клику на кнопку, а никакой-то там…

Защита запроса от ложного

Этот метод конечно же не панацея, но является хорошим тоном при отправке AJAX-запросов и не только. Это защита при помощи генерации уникального, одноразового значения, которое будет отправлено с клиента и проверено на стороне сервера.

Итак, создадим это уникальное значение в момент выполнения нашей функции wp_localize_script()

function my_load_scripts( $hook ) {

	// хак по борьбе с кешем)
	$my_js_ver = date( "ymd-Gis", filemtime( plugin_dir_path( __FILE__ ) . 'ajax-demo.js' ) );

	wp_register_script( 'ajax_demo', plugins_url( 'ajax-demo.js', __FILE__ ), array( 'jquery' ), $my_js_ver );
	wp_localize_script( 'ajax_demo', 'demo_ajax_object',
		array(
			'ajaxurl'   => admin_url( 'admin-ajax.php' ),
			'nonce'     => wp_create_nonce( 'demo_security' ),
			'demo_id'   => get_the_ID(),
			'data_demo' => 'value demo',
		)
	);

	wp_enqueue_script( 'ajax_demo' );
}

add_action( 'wp_enqueue_scripts', 'my_load_scripts' );

Мы добавили ‘nonce’ => wp_create_nonce( ‘demo_security’ ), соответственно, теперь в момент инициализации функции на странице будет это генерированное значение:

И теперь по цепочке передаём его дальше — в наш скрипт js, теперь он будет выглядеть вот так:

jQuery(document).ready(function ($) {
    $("#knopochka").click(function () {
        $.post({
            url: demo_ajax_object.ajaxurl,
            data: {
                'action': 'demo_get_title_by_id',
                'page_id': demo_ajax_object.demo_id,
                'demo_text': demo_ajax_object.data_demo,
                'nonce': demo_ajax_object.nonce,
            },
            success: function (response) {
                console.log('AJAX ответ : ', response);

            }
        });
    });
});

И на стороне сервера, на стороне «бэкэнд» мы должны проверить это значение с помощью специальной функции: check_ajax_referer(); в которую необходимо передать название нашего значения при создании (demo_security)

Вот такой вид примет наша функция-обработчик. В которую мы передали:

  1. Ключ, который был указан при создании nonce кода.
  2. Ключ, который указан в объекте отправляемым методом $.post (js файл)
function demo_get_title_by_id() {

	check_ajax_referer( 'demo_security', 'nonce' );

	$id  = $_POST['page_id'];
	$txt = $_POST['demo_text'];

	echo $id . " " . $txt;

	wp_die();

}

Примечание. Если определить название этих ключей, как ‘_ajax_nonce’ или ‘_wpnonce’, то второй аргумент можно не указывать, так как в POST-запросе WordPress будет уже брать значение из этих ключей.

И в завершении, давайте получим заголовок нашей текущей страницы и выведем его вместе с ссылкой на эту страницу, под нашей кнопкой, по которой был совершён клик.

Да, бессмысленная механика, но это просто ради примера, вероятнее всего такое вам вряд ли потребуется делать, хотя получение текущей ссылки может себя оправдать 🙂

function demo_get_title_by_id() {
	// Проверка
	check_ajax_referer( 'demo_security', 'nonce' );
	// Получаем айди страницы с которой идёт запрос
	$id = $_POST['page_id'];
	// Получаем заголовок (название) страницы по её айди
	$title = esc_html( get_the_title( $id ) );
	// Получаем постоянную ссылку на страницу по её названию
	$url = esc_url( get_permalink( get_page_by_title( $title ) ) );
	// вывод данных
	echo "Страница {$title} , ссылка {$url}";
	// завершаем выполнение
	wp_die();

}

В свою очередь, чтобы вывести данные под кнопкой нам необходимо дополнить наш js-код

jQuery(document).ready(function ($) {
    $("#knopochka").click(function () {
        $.post({
            url: demo_ajax_object.ajaxurl,
            data: {
                'action': 'demo_get_title_by_id',
                'page_id': demo_ajax_object.demo_id,
                'demo_text': demo_ajax_object.data_demo,
                'nonce': demo_ajax_object.nonce,
            },
            success: function (response) {
                console.log('AJAX ответ : ', response);
                $("#knopochka").after(function() {
                    return "<div>" + response + "</div>";
                });
            }
        });
    });
});

Результат по клику:

Результат по клику:

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

Как правильно подключить файл стилей в своей теме WordPress?

Подключение файлов CSS (для стилевого оформления элементов на странице) осуществляется при помощи специальной для этого функции wp_enqueue_style()

В принципе можно подключать стили (файлы CSS) по разному, хоть прямиком через HTML-элемент <link> 🙂 Но это будет не совсем правильно с точки зрения философии WordPress, его стандартов кодирования, так сказать.

Поэтому единственным правильным методом подключения файлов CSS в вашу тему (на страницы вашего сайта) будет являться метод через специальные функции.

Пример подключения основного файла стилей style.css и в примере после него — произвольного:

<?php

/**
 * Подключаем основной файл стилей темы (style.css)
 */
function poet_add_theme_styles() {
	wp_enqueue_style( 'style-main', get_stylesheet_uri() );
}
add_action( 'wp_enqueue_scripts', 'poet_add_theme_styles' );

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

<?php

/**
 * Подключаем основной файл стилей темы (style.css) и дочерний
 */
function poet_add_theme_styles() {
	wp_enqueue_style( 'style-main', get_stylesheet_uri() );

        wp_enqueue_style( 'child-style',
            get_stylesheet_directory_uri() . '/theme.css',
            array( 'style-main' ), // указываем зависимость
            wp_get_theme()->get('Version')
        );
}
add_action( 'wp_enqueue_scripts', 'poet_add_theme_styles' );

Рассмотрим ещё одну функции, при помощи которой мы можем зарегистрировать файлы стилей. Важно понимать отличие этой функции от рассмотренной ранее. Дело в том что при помощи wp_enqueue_style() мы сразу подключаем указанный стиль, а при помощи wp_register_style() мы только регистрируем его в окружении WordPress, что бы он (WordPress) знал этот файл стилей по имени и в нужный момент или при нужном условии мы можем его подключить.

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

<?php

/**
 * Подключаем основной файл стилей темы (style.css) и дочерний
 */
function poet_add_theme_styles() {
	wp_enqueue_style( 'style-main', get_stylesheet_uri() );

        wp_register_style( 'child-style',
            get_stylesheet_directory_uri() . '/theme.css',
            array( 'style-main' ), // указываем зависимость
            wp_get_theme()->get('Version')
        );

        wp_enqueue_style( 'child-style' );
}
add_action( 'wp_enqueue_scripts', 'poet_add_theme_styles' );

Теперь, после регистрации стиля по имени, мы можем его подключать простым вызовом функции wp_enqueue_style( ‘child-style’ ), в которую передаём имя этого файла CSS заданное при регистрации. На самом деле такой метод подключения даёт больше гибкости, особенно для опытных разработчиков.

ООП

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

<?php

/**
 * Подключаем основной файл стилей темы (style.css) и дочерний
 */
class Poet_Add_Styles
{
    /**
    * Constructor.
    */    
    public function __construct(
		// Add stylesheet.
		add_action( 'wp_enqueue_scripts', array( $this, 'poet_add_theme_styles' ) );
	}

	/**
	 * Add and enqueues stylesheet.
	 */
	public function poet_add_theme_styles() {
	wp_enqueue_style( 'style-main', get_stylesheet_uri() );

        wp_register_style( 'child-style',
            get_stylesheet_directory_uri() . '/theme.css',
            array( 'style-main' ), // указываем зависимость
            wp_get_theme()->get('Version')
        );

        wp_enqueue_style( 'child-style' );
	}
}

new Poet_Add_Styles();

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

Проблемы кеширования

Если посмотреть на исходный код страницы сайта на WordPress, то можно заметить вот такие добавки (называются гет-параметрами) к подключаемым файлам стилей

гет параметры после файлов

Если рассмотреть пример нашего кода, то он подключает файл theme.css и добавляет гет-параметром версию темы которая прописана в файле style.css. В итоге мы можем заметить версию 1.0

Если бы при регистрации или подключении файла CSS мы бы не указали параметр версии (функцией wp_get_theme()->get(‘Version’)), или установили бы значение false, то была бы тогда использована версия WordPress, как примере ниже, к нашему файлу добавилась версия WP

А если установить null, то никакая версия не будет установлена.

Чем это чревато? Представьте, что вы внесли правки в файл theme.css и изменили стиль оформления элемента, например, с зеленого фона на красный. То пользователь, который уже посещал ваш сайт снова будет видеть зелёный фон. Почему так?

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

Получается, что если пользователь не обновит страницу или не почистит кеш, он так и будет видеть зелёный фон у элемента. Вероятнее всего новый стиль загрузится и отобразится у него со сменой версии WordPress или сменой версии темы оформления.

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

Как решить эту проблему?

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

В этом поможет функция filemtime — Получает время последнего изменения файла. Тогда наш код немного преобразится:

<?php

/**
 * Подключаем основной файл стилей темы (style.css) и дочерний
 */
function poet_add_theme_styles() {
	wp_enqueue_style( 'style-main', get_stylesheet_uri() );

        wp_register_style( 'child-style',
            get_stylesheet_directory_uri() . '/theme.css',
            array( 'style-main' ), // указываем зависимость
            filemtime( get_stylesheet_directory() .'/theme.css' )
        );

        wp_enqueue_style( 'child-style' );
}
add_action( 'wp_enqueue_scripts', 'poet_add_theme_styles' );

Ну вот и всё!

P.S. конечно можно внести сюда небольшую оптимизацию и сократить вызов функции get_stylesheet_directory(), которая получает путь к файлу темы (родительской), до одного вызова, а не двух, как в примере. Но лучше остановимся на этом )

Как добавлять изображения и прочие медиафайлы в WordPress?

В WordPress существует специальный Экран библиотеки медиафайлов, который можно назвать медиатекой.

Именно сюда попадают загружаемые на ваш сайт файлы и располагаются в хронологическом порядке — свежие вначале.

Добавить новый медиафайл можно при помощи этих кнопочек:

Экран библиотеки медиафайлов

После загрузки ваш файл отобразится на Экран библиотеки медиафайлов:

загрузили файл

Помимо файлов изображений можно загружать PDF, видео, аудио форматы и прочие.

Можно просматривать файлы в виде простой визуальной сетки или списка со столбцами. Выберите желаемый вид с помощью иконок слева над файлами.

Экран библиотеки медиафайлов

Важно учитывать! Что после загрузки изображения WordPress делает его копии и в итоге получаем не одно, а несколько изображений:

несколько изображений:

Это происходит потому что по умолчанию в WordPress заданы параметры для нарезки копий изображения с целью оптимизации. Представьте, если вы загрузили большое изображение весом 5-10 мб, то сколько оно будет загружаться при слабом Интернет-соединении у пользователя, мм? Ну и в плане дизайна, дизайнер может требовать строгую обрезку для сохранения вида своего макета.

Где настраивать размер изображений?

Настройка этих размеров доступна в разделе Настройки > Медиафайлы

Если поставить значение «0» ширине и высоте, то нарезка не будет осуществляться. Например, средний размер можно выключить. Это позволит сэкономить не мало дискового пространства при объемных загрузках изображений.

В некоторых случаях изображений может создаваться значительно больше. На моей практике встречалось и 10 нарезок, то есть грузим одно, а получаем на диске 10-11 картинок. Это зависит от дополнительных функций, которые могут находиться в теме и плагинах вашего сайта. Функция называется add_image_size() — она регистрирует (для будущего создания при загрузке) новый размер картинки (миниатюры).

Как навсегда удалить изображение?

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

  • Редактировать открывает простой экран для редактирования метаданных отдельного файла. Вы также можете перейти на этот экран, нажав на имя медиафайла или его миниатюру.
  • Удалить навсегда удалит файл из медиатеки (а также из любых записей, к которым он в данный момент прикреплен).
  • Просмотр открывает общедоступную страницу этого файла.
  • Копировать URL в буфер обмена копирует URL медиафайла в буфер обмена.
  • Скачать файл предложит скачать оригинал медиафайла на ваше устройство.

Нас интересует ссылка Удалить навсегда

Как навсегда удалить изображение?

А в режиме сетки, чтобы удалить изображение, нужно сперва кликнуть на изображение, а затем удалить этот файл:

Как навсегда удалить изображение?

При первом способе мы сделали на один клик меньше и в режиме отображения таблицы есть еще одно преимущество — массовое удаление файлов. То есть выбираем файлы которые нужно удалить и затем действие, которое применится к ним.

Как навсегда удалить изображение?

Рекомендации при загрузке изображений

  1. Старайтесь не загружать слишком большие изображения, например, размером свыше 5мб, лично я считаю и 3-4 мб тоже «тяжелыми», но смириться можно. Помните, что это всё занимает ваше дисковое пространство.
  2. Старайтесь не лениться и сразу присваивать вашим загруженным изображениям атрибут ALT

Как добавить атрибут Alt?

При Загрузке через медиафайлы

Как добавить атрибут Alt?

Выбираем ссылку Изменить и далее заполняем поле для альтернативного текста

При Загрузке из Записи или Странице

В момент загрузки нужно выделить ваш элемент изображения и справа в его настройке блока будет это поле:

Как добавить атрибут Alt?

Учтите, что загружая изображение через редактор Записи или Страницы оно автоматически прикрепляется к ней и также будет доступно в общей медиатеке.

Теперь разница между изображениями в том, что загружая через редактор в Записи оно прикрепилось к ней, а при загрузке из раздела Медиафайлов — нет.

Как добавить атрибут Alt?

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

Прикрепить файл к записи

После прикрепления картинку можно будет сразу находить в Библиотеке путем сортировки «Загруженные для этой Записи»

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

WordPress: Как открывать изображение в лайтбоксе по клику?

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

Добиться этого можно путём выделения нужного изображения и клика по ссылке. Учтите, что выбрав блок Медиа и Текст вы не обнаружите эту возможность (проверял на версии: 6.5.3), вам будет доступно только прикрепления оригинала изображения.

Медиа и Текст

Ниже вы можете наблюдать последовательность прикрепления файла изображения к его миниатюре:

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

Как открывать изображения в лайтбоксе (всплывающее окно)?

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

вставляю в контент страницы картинку-миниатюру

И вот тут-то мы можем наблюдать нужную нам функцию! Она называется Развернуть при нажатии

Выбрав её, наше изображение будет открываться во всплывающем окне, тем самым не перескакивая со страницы на отдельный URL, об этом свидетельствует «крестик» при помощи которого мы можем свернуть обратно наше изображение

крестик закрытия лайтбокса

Но как же быть, если нам необходимо чтобы текст обтекал изображение справа? Для этого мы можем воспользоваться другим блоком, который называется Колонки

блок Колонки

И уже с его помощью реализовать задуманное. Оба изображения из примера ниже будут открываться в лайтбоксе.

Как открывать фото из галереи в лайтбоксе?

Теперь рассмотрим ещё один пример на основе галереи. Вначале добавим блок Галереи на нашу страницу:

добавим блок Галереи

После этого загрузим (или выберем из библиотеки файлов) нужные нам изображения и выделив всю галерею справа в её настройках укажем в качестве ссылки Медиафайл.

Что получится? Да то же самое что и в самом первом случае — изображения будут открываться в новых URL . Чтобы задействовать наш лайтбокс нужно присвоить эту функцию каждому изображению в галереи:

делаем ссылку на лайтбокс

Теперь изображения миниатюр галереи будут открываться в лайтбоксе.

Какие права должны быть на файлы и папки в WordPress?

Неправильные разрешения к файлам могут привести к неожиданным последствиям, вот одна из них:

ошибка 403

Для того чтобы это исправить или не допустить нужно выставить правильные права.

Все каталоги (директории) должны быть 755 или 750

Все файлы должны иметь права 644 или 640. Исключение: wp-config.php должен иметь номер 440 или 400, чтобы другие пользователи сервера не могли его прочитать.

Подробнее

Как из консоли изменить разрешения на файлы и папки?

sudo find . -type f -exec chmod 644 {} +
sudo find . -type d -exec chmod 755 {} +
sudo chmod 440 wp-config.php

Как изменить владельца у файлов и папок?

sudo chown -R www-data:www-data /var/www/mysite

Пример с wp-cli

Рассмотрим простой пример, когда из корня сайта мы при помощи WP CLI совершаем установку плагина и сразу, второй командой, меняем владельца всех файлов этого плагина

sudo wp plugin install woocommerce --allow-root
sudo chown -R www-data:www-data ./wp-content/plugins/woocommerce

Это можно было бы сделать немного эстетичней, например, запустив команду сразу под нужным пользователем:

sudo -u www-data wp plugin install woocommerce

Как подключить Турбо-страницы Яндекса для сайта на WordPress?

Эта технология позволяет создавать лёгкие версии страниц, которые открываются быстро даже при медленном подключении к интернету.

Официальный сайт

Подробно о турбо-страницах можно почитать по ссылке выше,а мы сразу перейдем к делу 🙂

Подключение Турбо-страниц в Вебмастере

Ваш сайт должен уже быть подключен к Яндекс Вебмастер. Далее, переходим по этой ссылке. Подключение Турбо-страниц в Вебмастере.

 Подключение Турбо-страниц в Вебмастере.

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

Официальный сайт (ссылка в начале поста) предлагает ряд бесплатных решений:

плагины для вордпресс для создания турбо-страниц

Не вижу причин для отсутствия в этом списке ещё одного решения — плагина Яндекс.Турбо (Автор: Flector), но мы его установим через стандартный интерфейс установки плагинов в CMS WordPress:

плагин  Яндекс.Турбо

Краткая Инструкция по установке

  1. Установите плагин через меню «Плагины\Добавить новый» (искать «RSS for Yandex Turbo» или «Яндекс.Турбо»).
  2. Активируйте плагин в меню «Плагины».
  3. Зайдите в настройки плагина «Настройки\Яндекс.Турбо» и сохраните их.
Настройки плагина «Яндекс.Турбо»

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

https://codeispoetry.ru/feed/turbo

ссылки

Всё зависит от общего количество записей на вашем сайте и их разбивке. По умолчанию это значение равно 50. Следовательно, если у вас 500 записей, то в итоге вы получите 10 ссылок по 50 записей в каждой.

ссылки фида

Теперь осталось добавить их в разделе Яндекс Вебмастер, который мы рассматривали ранее.

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

Исправление ошибок

Для выявления ошибок нужно перейти в режим отладки:

отладка

Далее, прямо в окне постарайтесь исправить разметку и снова перепроверить исправленную версию. В итоге, при правильной корректировке вы должны добиться результата «Без ошибок»

В моём случае валидатор ругался на тег <header>. Я просто исключил этот тег в разделе фильтров:

исключаем тег

Это можно было исправить и другим способом. Ошибка была связана с содержимом тега [CDATA[]] найдены закодированные символы

ошибка найдены закодированные символы

Можно исправить сам тег, например взять его в специальный тег code — это будет правильным решением.

После этого можно убедиться в исходном коде фида на его отсутствие и затем повторить валидацию:

валидный фид

Готово!

Учтите, что в режиме ВКЛ (фид включен) валидация пройдёт не сразу.

Проверка фида может занимать продолжительное время. Наберитесь терпения. Сам Яндекс оповещает о том, что обычно проверка занимает около 2 часов.

Во включенном состоянии переобход источника и перестроение примеров Турбо-страниц в поиске происходит раз в час.

Яндекс Вебмастер

Часто встречающиеся ошибки RSS-канала

А пока что, если у вас сайт подключен к Яндекс Метрики, то рекомендуется указать ваш счётчик чтобы не утратить аналитику за счет подключения технологии турбо-страниц.

подключаем счётчик

Где найти идентификатор (номер) счетчика?

Рекомендую посетить эту страничку.

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

Раздел доступен в разделе Настройки:

Настройки

Как установить фавикон (favicon) на сайт в WordPress?

Заходим в раздел Настройки -> Общие

Как добавить favicon

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

Значок сайта который Вы видите во вкладках браузера, строке закладок, и внутри мобильных приложений WordPress. Он должен быть квадратной формы с разрешением не менее 512 × 512 пикселей.

официальная рекомендация из панели управления WordPress
favicons

Как добавить заголовок «Last Modified» на сайте WordPress + Nginx?

Подробнее о заголовке Last-Modified можно почитать тут. Пожалуй, для SEO добавлю описание:

HTTP заголовок Last-Modified сообщает клиенту (браузеру, поисковому боту) время последнего изменения страницы (объекта). Если клиент получил заголовок Last-Modified, то при следующем обращении к адресу, при условии, что страница (объект) есть в локальном кэше, он добавит заголовок-вопрос If-Modified-Since (не изменилась ли страница после даты, полученной в Last-Modified).

В свою очередь сервер, получив запрос If-Modified-Since должен сверить полученную временную метку с временем последнего изменения страницы и, если страница не изменялась ответить 304 Not Modified.

Как добавить HTTP заголовок Last-Modified на PHP в WordPress?

В целом на официальном сайте уже существует реализация на PHP, которую остаётся немного адаптировать для WP.

Отправка Last-Modified и обработка HTTP_IF_MODIFIED_SINCE на PHP

// время последнего изменения страницы в формате unix time
$lastModified = strtotime('2022-06-18 19:01:58');

// дата последней загрузки, отправляемая клиентом
$ifModified = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'] ?? '', 5));

if ($ifModified && $ifModified >= $lastModified) {
    // страница не изменилась, отдача http статуса 304
    header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
    exit;
}

header('Last-Modified: ' . gmdate("D, d M Y H:i:s \G\M\T", $lastModified));
// дальнейшая загрузка страницы

Получаем время последнего изменения страницы, проверяем наличие If-Modified-Since, если есть — отдаем 304 Not Modified и останавливаем работу скрипта, иначе генерируем заголовок Last-Modified и отдаем страницу.

Версия для WordPress

Этот готовый код необходимо добавить в functions.php или через плагин. Я рекомендую добавлять этим методом.

/**
 * Last-Modified and If-Modified-Since Headers
*/

add_action('wp', poet_'last_if_modified_headers' );

function poet_last_if_modified_headers() {
    global $post;
        if(isset($post)){
            $LastModified_unix = strtotime($post->post_modified);
            $LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix);
            $IfModifiedSince = false;

            if (isset($_ENV['HTTP_IF_MODIFIED_SINCE'])) {
                $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5));
            }
            if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
                $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
            }

            if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) {
                header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
                exit;
            }

            header('Last-Modified: '. $LastModified);
        }
}

Настройки HTTP-сервера Nginx

Если вы используете в качестве веб-сервера Nginx , то есть вероятность столкнуться с проблемой отдачи заголовка. Всё дело в том, если у вашей конфигурации включена директива ssi

Модуль ngx_http_ssi_module — это фильтр, обрабатывающий команды SSI (Server Side Includes) в проходящих через него ответах.

https://nginx.org/ru/docs/http/ngx_http_ssi_module.html

Пример конфигурации при котором разрешается обработка команд SSI в ответах:

location / {
    ssi on;
    ...
}

Следовательно, прицепом к этой директиве необходимо включить еще одну, которая по умолчанию выключена:

location / {
    ssi on;
    ssi_last_modified on;
}

Позволяет сохранить поле заголовка “Last-Modified” исходного ответа во время обработки SSI для лучшего кэширования ответов.

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

Вот и всё 🙂

Обязательно перезапустите HTTP-сервер Nginx и протестируйте отдачу заголовка.

Вот правильная работа заголовка:

протестируйте отдачу заголовка

Как быстро улучшить производительность сайта на WordPress?

Самый простой плагин для оптимизации скорости WordPress, который позволяет ускорить работу сайта в несколько кликов, встречайте! Бесплатный плагин — Jetpack Boost.

После установки плагина и его активации в меню появится специальный раздел. Нас интересует ссылка Boost

Boost

Чтобы начать использовать функции плагина необходимо выбрать тарифный план. Его бесплатной версии более чем достаточно.

бесплатная версия плагина

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

Ну а если нет, то давайте улучшим эти показатели.

Оптимизация загрузки CSS

Первая настройка Оптимизация загрузки CSS создаёт критически важные CSS вашей главной страницы, публикаций и других страниц. Это позволяет значительно ускорить отображение контента на экране, в особенности на мобильных устройствах.Подробнее о создании критически важных CSS см. на web.dev

По умолчанию эта настройка включена. Единственное нужно дождаться ее завершения и не покидать страницу.

Оптимизация загрузки CSS

Кеш страниц

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

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

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

Кеш страниц

P.S. Рекомендую включить журнал и проверить работу кеширования. Если проблем на сервере нет, то при включенном страничном кешировании вы должны видеть попадание в кеш посещенных страниц.

кеширование

Отложенное выполнение второстепенного кода Javascript 

Отложенное выполнение второстепенного кода Javascript переносит выполнение ряда задач на время после загрузки страницы. Таким образом важная визуальная информация отображается раньше, а веб-сайт загружается быстрее. Подробнее об отложенном выполнении javascript см. на web.dev

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

Объединить и минифицировать CSS и JS

Объединить и минифицировать CSS и JS: объединяет и сжимает ресурсы JavaScript и CSS, чтобы снизить количество и объём запросов к серверу, что позволяет быстрее загружать контент.

Опытные пользователи могут найти для себя полезную настройку — исключений JS:

CDN изображений

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

Руководство по изображениям — функция, необходимая всем, кому требуется оптимизировать изображения на веб-сайте. С помощью этого руководства вы сможете гарантировать отображение всех изображений на вашем веб-сайте в нужном размере. Это необходимо для удобства пользователей, быстрой загрузки страниц и повышения рейтинга сайта. Следуя советам и методикам, приведённым в руководстве, вы сможете уменьшить размеры файлов изображений и ускорить загрузку вашего веб-сайта.

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

Ну вот и всё! В несколько кликов мы заложили неплохой фундамент для повышения производительности нашего сайта на WordPress.

Как изменить свой пароль от сайта WordPress с помощью WP-CLI?

Забыли пароль пользователя? Не беда! В этой статье мы его восстановим при помощи командной строки и инструмента WP-CLI (WP Command Line Interface) — это интерфейс командной строки для WordPress.

Откройте терминал, выберите директорию с нужным сайтом и введите первую команду:

wp user list

Эта команда отобразит всех пользователей вашего сайта.

+----+------------+--------------+---------------------------+---------------------+---------------+
| ID | user_login | display_name | user_email                | user_registered     | roles         |
+----+------------+--------------+---------------------------+---------------------+---------------+
| 1  | @admin     | @admin       | admin@gmail.com | 2023-11-29 10:25:31 | administrator |
| 2  | author     | author       | author@gmail.ru          | 2024-02-16 08:11:28 | subscriber    |
| 3  | dasha      | Даша         | dasha@gmail.ru  | 2024-03-14 09:58:12 | shop_manager  |
+----+------------+--------------+---------------------------+---------------------+---------------+

Нас интересует первый столбик. Запомните ID пользователя которому будете менять пароль и введите следующую команду:

wp user update id --user_pass=password

Вместо id — укажите нужное числовое значение, а вместо password — новый пароль. Всё!

Как настроить защиту от СПАМ-сообщений в плагине Contact Form 7?

Вы можете защитить свои контактные формы созданные в плагине Contact Form 7 с помощью функций защиты от спама, которые уже присутствуют в Contact Form 7, а это:

  • фильтрация СПАМа с помощью сервиса Akismet
  • фильтрация при помощи сервиса reCAPTCHA

Повторю, что эти возможности уже интегрированы в плагин и доступны в разделе Интеграций:

Различные защиты, такие как CAPTCHA созданы для того, чтобы отличать спам-ботов от людей, но если в качестве спамера будет человек, то в этом случае защита окажется бессильной. В отличие от традиционной CAPTCHA (где нужно ставить галочку, решать какие-то головоломки), Akismet работает немного иначе — он проверяет отправленные формы по глобальной базе данных спама; это означает, что Akismet является в некоторых случаях более комплексным решением против спама.

Защита при помощи Akismet

Первым шагом является активация плагина Akismet . Поскольку пакет плагинов Akismet входит в состав WordPress, нет необходимости устанавливать его вручную. Перейдите в меню «Плагины» и просто активируйте плагин под названием Akismet Anti-Spam .

Если по каким-то причинам плагин отсутствует у вас, то его необходимо установить.

Для использования Akismet вам понадобится ключ API. Его можно получить бесплатно.

Как задействовать Akismet в контактной форме?

Принцип работы достаточно простой. Вам нужно для полей по которым будет проходить проверка на предмет СПАМа указать специальную отметку в виде:

  • akismet:author — указывается для полей в которых отправитель должен вносить имя. Пример: [text* your-name akismet:author]
  • akismet:author_email — указывается для полей в которых отправитель должен вписать адрес электронной почты. Пример: [email* your-email akismet:author_email]
пример заполнения

Теперь, при подключенном и настроенном сервисе Akismet плагин контактной формы будет отправлять данные на проверку на СПАМ данному сервису и в случае, если «Акисмет» подтвердит наличие СПАМа, то плагин Contact Form 7 приостановит отправку электронного сообщения и отобразит уведомление: «Произошла ошибка при отправке вашего сообщения», которое будет в оранжевой рамке 🙂

Как тестировать фильтрацию спама?

Чтобы проверить, правильно ли работает фильтрация спама, попробуйте ввести «viagra-test-123» в поле предназначенное для ввода Имени (опция akismet:author) или «akismet-guaranteed-spam@example.com» в поле предназначенное для ввода адреса электронной почты (пометка akismet:author_email)

Поскольку эти служебные слова зарезервированы специально для тестирования, Akismet должен определить сообщение как СПАМ. и как следствие, вы увидите сообщение об ошибке в оранжевой рамке — это знак того что всё работает должным образом.

Спам ответ

Как добавить контактную форму на сайт в WordPress?

Задача: Создать страницу «Контакты» с формой обратной связи, для того чтобы посетители сайта могли оставлять нам сообщения.

Решение: Для быстрой реализации этой задачи мы задействуем один из самых популярных плагинов-конструкторов контактных форм для WordPress.

Плагин Contact Form 7

Официальная страница плагина

Как устанавливать плагины?

Плагин Contact Form 7

После установки и активации плагина, вам будет доступен его раздел в главном меню панели управления и ссылка Настроек в разделе ваших плагинов

Настройки плагина

Проследовав в раздел настроек плагина вы обнаружите уже предустановленную контактную форму.

Контактная форма по умолчанию

Эту контактную форму мы можем уже смело задействовать на страницах нашего сайта. Создадим страницу «Контакты» и в редакторе блоков Гуттенберг найдём нужный блок, например по поисковому слову «контакт» или «contact».

После чего добавить найденный блок Contact Form 7 на вашу страницу. Так как у нас всего одна контактная форма, которая была нам доступна по умолчанию, то выберем её:

Классический редактор

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

копируем шорткод

А после вставить его в область контента

добавляем шорткод на страницу

После обновления/публикации страницы, на публичной части сайта этой страницы появится наша контактная форма:

готовая контактная форма.

Полдела сделано. Контактную форму мы вывели. Но куда будут прилетать отправленные сообщения? Для этого необходимо нам настроить нашу форму. Если вы желаете чтобы отправленные пользователями сообщения сохранялись внутри вашего сайта, то необходимо установить и задействовать вот это решение.

Для настройки получателей нам необходимо вернуться на страницу всех форм и перейти в нужную форму

Переходим к настройкам формы

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

  1. Заголовок Контактной формы — его можно менять произвольно, этот заголовок для вас, чтобы вы ориентировались и различали формы между собой.
  2. Шорткод — это специальный механизм в WordPress, который позволяет в произвольных местах сайта вызывать ту или иную функцию. Принцип простой. Вы копируете этот уникальный шорткод и вставляете в то место контента, где хотите видеть вашу форму.

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

добавление формы в виджетах

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

В этом случае мы поступаем по аналогии с классическим редактором. То есть копируем шорткод и вставляем, например, в текстовый виджет

В результате получим:

  1. Шаблон формы — это те поля, которые учувствуют в нашей форме. Поля можно создавать произвольно из генератора полей, который находится повыше. Но об этом мы поговорим подробнее при создании новой формы.
  2. Вкладка Письмо — именно здесь мы можем указать получателей при отправке нашей формы.

Настройка получателей

Переходим на вкладку Письмо

Давайте познакомимся с разделами этого экрана:

  1. Почтовые теги (которые генерируются во вкладке Шаблон письма). Важно! Старайтесь сравнивать ваши теги с тегами которые участвуют в шаблоне для получателей. Частой ошибкой бывает отсутствие нужного тега (как правило из-за невнимательности) в шаблоне письма для получателей.

Я специально удалил тег Темы письма и в списке тегов мой тег стал подсвечиваться акцентирующим черным цветом

ошибка. отсутствует почтовый тег

Это говорит о том, что в шаблоне отсутствует почтовый тег и информацию из него получатель не получит.

  1. Кому — в этом разделе мы можем указать получателя письма. В данном примере указан специальный шорткод, который будет использовать E-mail администратора, который указан при создании сайта. Вобщем, этот E-mail находится в разделе Настройки > Общие вашего сайта, в поле Административный E-mail
Емэйл администратора сайта

Если требуется указать несколько получателей, то перечисляем их адреса через запятую, например так:

[_site_admin_email], kolya@gmail.com, tolya@gmail.com

Или так:

masha@gmail.com, sasha@gmail.com
  1. От кого — тут вы указываете адрес отправителя. Важно, чтобы он соответствовал домену вашего сайта. То есть, если адрес вашего сайта mysite.com, то в этом поле нужно указать, например, info@mysite.com
  2. Тема письма. Тут я думаю всё понятно. Схема по умолчанию [_site_title] «[your-subject]» выдаст примерно следующее: если ваш сайт называется «Мой магазин», а в теме письма пользователь указал тему «Пожелание», то получим: Мой магазин «Пожелание»
  3. Дополнительные заголовки — лучше их не трогать.
  4. Тело письма — это как раз та информация которую получат получатели. Как правило, в этом теле письма содержится информация полей, которые заполняет пользователь, соответственно все участвующие почтовые теги должны тут присутствовать, в противном случае информация не будет передана в полном объёме.

И в нижней части экрана рассмотрим ещё ряд возможностей:

  1. Отметив этот чекбокс мы исключим вывод строк, если данные не были у тега заполнены пользователем. Это оправдано тогда, когда формы выступают в роли опросного листа и содержат в себе большое количество полей для заполнения
  2. Если чекбокс отмечен, то мы можем использовать в теле письма HTML-теги. Это позволит придать ему читабельный внешний вид выделив заголовки и прочие элементы в письме
  3. Сюда нужно поместить тег (в том случае если он был создан для прикрепления файла*) Если не выполнить это условие, то прикреплённый пользователем файл не будет получен.
  4. Возможность сформировать второе письмо, отличительное содержанием от первого. Это оправдано когда требуется разделить при отправке заполненную пользователем информацию, например, часть для менеджера, а часть в службу доставки и т.п. Или обычно задействуют эту функцию при отправке автоматических ответов.

Полезно для ознакомления

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

Ну и последняя вкладка позволяет внести дополнительные настройки, например, JavaScript код, который будет отрабатывать при успешной отправке формы. Зачастую сюда добавляют отправку данных в системы аналитики: Яндекс Метрика или GA.

Как добавить контактную форму через функцию PHP?

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

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

echo do_shortcode( '[contact-form-7 id="09bcf5b" title="Форма 1"]' );

Как прикрепить и отправить файл в плагине Contact Form 7?

Задача: Предоставить возможность пользователям прикреплять в форму обратной связи файл и отправлять его в виде почтового вложения получателю.

Решение: Сперва нам необходимо создать форму. Если вы не работали ранее с плагином Contact Form 7, то рекомендую начать с этой заметки.

После создания формы, нам необходимо создать специальное поле для загрузки (прикрепления) файла, которое так и называется Файл.

Перед вами возникнет всплывающее окно с настройками данного поля:

настройки поля

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

Я оставлю все по умолчанию и добавлю в тело формы тег файл

добавлен тег файл

Далее нам необходимо перейти на вкладку Письмо и добавить этот уникальный тег поля файл в специальный раздел для прикреплённых файлов:

тег файла
  1. Добавляем…
  2. Сохраняем..

Готово! Теперь у пользователей нашего сайта появилась возможность прикреплять к почтовому сообщению файл:

контактная форма

Пример посложнее

Задача: Мы ожидаем от пользователя файлы исключительно в формате PDF и размером не превышающим 3 мегабайта.

Решение: Нам нужно вернуться на вкладку Шаблон формы и заново генерировать почтовый тег (шорткод) Файл

генератор поля файл

Указываем нужные значения и вставляем полностью новый тег или дополняем параметрами ( limit:3mb filetypes:pdf ) старый

Если требуется ограничить размер загружаемого файла, то значения можно указать следующим образом:

limit:1048576
limit:1024kb
limit:1mb

Просто цифры — воспринимаются байтами, а если указать постфикс kb или mb, то значения будут восприниматься уже в килобайтах или мегабайтах.

Если вам нужно установить несколько типов файлов, в качестве разделителя используйте | символ вертикальной черты. 

Расширения файлов которые можно использовать можно подсмотреть тут:

        // Image formats.
        'jpg|jpeg|jpe'                
        'gif'                         
        'png'                         
        'bmp'                        
        'tiff|tif'                    
        'webp'                        
        'ico'                        
        'heic'                        
        // Video formats.
        'asf|asx'                      
        'wmv'                         
        'wmx'                         
        'wm'                          
        'avi'                         
        'divx'                        
        'flv'                         
        'mov|qt'                      
        'mpeg|mpg|mpe'                
        'mp4|m4v'                      
        'ogv'                         
        'webm'                        
        'mkv'                         
        '3gp|3gpp'                     
        '3g2|3gp2'                    
        // Text formats.
        'txt|asc|c|cc|h|srt'           
        'csv'                         
        'tsv'                          
        'ics'                        
        'rtx'                          
        'css'                         
        'htm|html'                    
        'vtt'                          
        'dfxp'                         
        // Audio formats.
        'mp3|m4a|m4b'                 
        'aac'                         
        'ra|ram'                     
        'wav'                        
        'ogg|oga'                    
        'flac'                       
        'mid|midi'                     
        'wma'                        
        'wax'                         
        'mka'                          
        // Misc application formats.
        'rtf'                          
        'js'                           
        'pdf'                         
        'swf'                         
        'class'                       
        'tar'                          
        'zip'                          
        'gz|gzip'                     
        'rar'                         
        '7z'                           
        'exe'                         
        'psd'                          
        'xcf'                         
        // MS Office formats.
        'doc'                        
        'pot|pps|ppt'                 
        'wri'                          
        'xla|xls|xlt|xlw'             
        'mdb'                          
        'mpp'                         
        'docx'                        
        'docm'                        
        'dotx'                        
        'dotm'                       
        'xlsx'                        
        'xlsm'                         
        'xlsb'                         
        'xltx'                         
        'xltm'                        
        'xlam'                        
        'pptx'                        
        'pptm'                         
        'ppsx'                        
        'ppsm'                         
        'potx'                         
        'potm'                       
        'ppam'                        
        'sldx'                        
        'sldm'                        
        'onetoc|onetoc2|onetmp|onepkg'
        'oxps'                         
        'xps'                         
        // OpenOffice formats.
        'odt'                         
        'odp'                          
        'ods'                        
        'odg'                         
        'odc'                          
        'odb'                         
        'odf'   

Механика работы

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

По умолчанию эта временная папка имеет адрес wp-content/uploads/wpcf7_uploads, она создаётся автоматически, но в некоторых случаях может произойти ошибка, как правило связанная с недостаточными правами на запись…

В этом случае стоит определить новое место для загрузки через константу, которую можно объявить в файле wp-config.php

	define( 'WPCF7_UPLOADS_TMP_DIR', 'your-custom-tmp-dir' );

В качестве значения можно указать абсолютный путь или относительный. В случае относительного (как в примере) папка для загрузки будет создана в директории wp-content/

wp-content

Как создать кнопку в редакторе блоков Gutenberg?

В режиме редактирования Записи или Страницы добавьте новый блок:

добавьте новый блок

В строке поиска напишите запрос «Кнопки»

поиск кнопок

После добавления блока на страницу напишите название кнопки которое будет отображаться, например, «Отправить сообщение», «Написать нам WhatsApp» и т.п.

добавляем название кнопки

В момент когда выделение находится на блоке кнопки нам доступна панель инструментов при помощи которой мы можем позиционировать нашу кнопку

выравнивание кнопки

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

 мы можем задать ширину нашей кнопки.

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

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

настройки блока

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

типографика

Как задать ссылку кнопке?

В момент выделения кнопки, когда нам доступна панель её настроек, выбираем ссылку внутри страниц сайта или указываем произвольно

задаем ссылку

Как присвоить кнопке ID?

в момент выделения блока кнопки во вкладке настроек блока откройте раздел Дополнительно. Далее в поле HTML-якорь внесите какое-то название на латинице — оно то и будет служить в качестве идентификатора этого элемента.

присваиваем айдишник

А вот и результат нашей работы. Кнопка с заливкой по контуру с ссылкой на группу во ВК и с присвоенным идентификатором элементу:

вывод кнопки

Как добавить (включить) разметку Open Graph в плагине для WordPress Yoast SEO?

Стандарт Open Graph разработан социальной сетью Facebook. Он позволяет контролировать превью, которое формируется при публикации ссылки на сайт в социальных сетях, и передавать информацию другим интернет-сервисам.

https://yandex.ru/support/webmaster/open-graph/intro-open-graph.html

Например, если страница отображает статью, Open Graph может определить название статьи, автора, изображение и другую важную информацию.

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

Open Graph

Чтобы иметь возможность передавать эти данные нужно включить функцию Данные Open Graph. Переходим в Настройки плагина, раздел Обмен информацией в социальных сетях и включаем:

  • Данные Open Graph
  • Данные карты Twitter

Теперь после включения функций в исходном коде странице будет специальный блог с тегами этих микроразметок:

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

Разметки можно комбинировать. Поэтому, вполне нормально включение обоих стандартов на ваш сайт.

Как пользоваться Open Graph?

Для каждой странице вашего сайта вы можете создавать уникальные превью. Для этого в режиме редактирования страницы найдите раздел плагина Yoast SEO и перейдите во вкладку Социальные сети

Задаём настройки разметки

Именно здесь вы можете определите, как ваша публикация будет выглядеть в социальных сетях, таких как Facebook, Twitter, Instagram, WhatsApp, Одноклассники, LinkedIn, ВК и других.

Определите, как ваша публикация должна выглядеть в социальных сетях.

Стоит всего лишь заполнить три основных настройки: изображение, заголовок и краткое описание.

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

Рассмотрим простой пример. Предположим, мы разрабатываем коммерческий сайт и у нас есть страница Контактов, которую менеджеры в основном отправляют в качестве ссылки партнёрам и клиентам. Вот так по умолчанию выглядит ссылка когда её делятся, например, в WhatsApp

Теперь дополним её осмысленной информацией, например, это может быть брендированная картинка или схема проезда, вместо заголовка Контакты, что то позначимей, а кратком описании, для удобства можно передать номера телефонов.

Заполняем данные…

Заполняем данные

Теперь если мы поделимся ссылкой на нашу страницу Контактов, то можем увидеть насколько привлекательнее стало её превью:

Согласитесь, больше полезной информации в сравнении с первым случаем — по умолчанию.

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

Как создать XML-карту сайта в WordPress?

XML-карта сайта — это файл, в котором перечислены основные страницы вашего веб-сайта, благодаря чему поисковые роботы (Google, Яндекс, Bing и др.) найти и просканировать их все. Это также помогает поисковым системам понять структуру вашего сайта. Вы хотите, чтобы Google просканировал каждую важную страницу вашего сайта. Но иногда страницы оказываются без внутренних ссылок, что затрудняет их поиск. Карта сайта может помочь ускорить обнаружение контента.

XML-карта сайта (Sitemap) — это файл, который содержит информацию в виде ссылок о всех страницах сайта и их структуре.

Sitemap упрощает процесс индексации сайта для поисковых систем (Google, Яндекс, Bing и др.) и помогает им быстро и эффективно находить все страницы вашего сайта. Это особенно полезно для больших сайтов с множеством страниц и сложной структурой.

XML-карта сайта обычно имеет расширение .xml и содержит следующие данные:

  1. URL-адреса страниц сайта.
  2. Дату последнего обновления страницы.
  3. Информация о категориях и тегах, если используется на сайте.

После активации плагина для поисковой оптимизации сайта на WordPress — Yoast SEO, карта сайта должна быть включена и автоматически сгенерирует специальный файл, который будет будет доступен по адресу: ВАШ ДОМЕН/sitemap_index.xml

Пройдите в раздел Настройки плагина, где вы можете проверить текущее состояние функции генерации XML Sitemap, а так же по необходимости включить/отключить её.

Включение XML Sitemap

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

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

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

файл карты сайта