После получения сертификата на VPS сервере нужно правильно настроить работу сайта на WordPress через защищенный протокол.
Смотрите также статью получение бесплатного SSL сертификата. А если у вас панель Vesta, то установка сертификата ещё проще.
Отправляем весь трафик с http на https
Первая проблема, которая возникнет после установки сертификата – отсутствие замочка в адресе сайта, при заходе на него через https. Это происходит из-за того, что изображения, стили и скрипты продолжают подключаться через обычный протокол http.
А если заглянуть в код сайта через инспектор браузера, то там возле таких элементов, можно заметить сообщения с предупреждением, что данные передаются незашифровано.
Для начала я думал проблема в подключении файлов через:
И если её заменить на:
то всё должно заработать. Из WordPress документации следует, что get_bloginfo отдаёт адрес сайта без шифрования, в то время как get_template_directory_uri вставляет сразу с https. Но это проблемы не решило. Можно пути не менять.
Также в Интернете встречаются рекомендации внести в файл wp-config.php следующие параметры:
Однако, если точно следовать статье по получению сертификата SSL и дальнейшей настройки описанной в текущей статье, то это тоже не нужно.
Меняем адреса в MySQL
Заходим в phpMyAdmin. Сначала обязательно делаем резервную копию, а затем выполняем команды MySQL по замене старого URL http на новые https:
В коде выше замените адрес сайта на свой.
Я учел все данные с http в своей базе. Возможно в вашем случае поменяется не все URL адреса. Для проверки заходим в поиск и вводим свой сайт:
Смотрим результаты:
Видим, что сайтов с http:// больше нигде нет, кроме одного значения. Заходим внутрь и исправляем. У вас могут быть значения указаны в других местах.
При замене адреса http на https в MySQL могут полететь какие-нибудь настройки плагинов. У меня так произошло с плагином Contextual Related Posts. В этом случае, заново придётся настроить плагин.
Встречающиеся ошибки
Не получается войти в панель администратора wp-login.php или /wp-admin/. Прежде всего надо почистить cookie.
Файл .htaccess
Этот файл трогать не нужно. Если было сделано всё верно, то всё должно работать без внесений изменений в файл .htaccess. Перенаправлять в этом файле ничего не нужно. Иначе можно получить ошибки в браузере, он будет ругаться на превышение редиректов:
И страница открываться не будет.
Рабочая настройка для дружелюбных ссылок на WordPress в файле htaccess выглядет так:
И этого достаточно для работы HTTPS.
Не нужны никакие принудительные переводы на зашифрованный трафик, вроде:
Вместо этого лучше указать верные настройки в файле конфигураций Nginx. Они уже приведены выше.
ploshadka.net
Вот наша функция.
File: wp-includes/theme.php 320: /** 321: * Retrieve theme directory URI. 322: * 323: * @since 1.5.0 324: * 325: * @return string Template directory URI. 326: */ 327: function get_template_directory_uri() { 328: $template = str_replace( '%2F', '/', rawurlencode( get_template() ) ); 329: $theme_root_uri = get_theme_root_uri( $template ); 330: $template_dir_uri = "$theme_root_uri/$template"; 331: 332: /** 333: * Filters the current theme directory URI. 334: * 335: * @since 1.5.0 336: * 337: * @param string $template_dir_uri The URI of the current theme directory. 338: * @param string $template Directory name of the current theme. 339: * @param string $theme_root_uri The themes root URI. 340: */ 341: return apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri ); 342: } 343:
Вы пишете что-то вроде этого в своем плагине:
add_filter('template_directory_uri',function(){ return 'http://badserver.com/'; });
И у вас будет что-то подобное на веб-сайте:

Яркое будущее, потому что я вижу, что класс WP_Theme
не реализует фильтр в WP_Theme::get_template_directory_uri()
. Мы знаем, что WordPress становится все лучше и лучше и инкапсулирован.
File: wp-includes/class-wp-theme.php 898: /** 899: * Returns the URL to the directory of a theme's "template" files. 900: * 901: * In the case of a child theme, this is the URL to the directory of the 902: * parent theme's files. 903: * 904: * @since 3.4.0 905: * @access public 906: * 907: * @return string URL to the template directory. 908: */ 909: public function get_template_directory_uri() { 910: if ( $this->parent() ) 911: $theme_root_uri = $this->parent()->get_theme_root_uri(); 912: else 913: $theme_root_uri = $this->get_theme_root_uri(); 914: 915: return $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) ); 916: }
Другие заметки
Вы видите, что кто-то определяет в теме следующее:
define( 'TEMPL_URI', get_template_directory_uri() );
Они говорят, что это потому, что они хотели бы сделать 'TEMPL_URI'
нефильтрованным. Они не правы. Если плагин установил плохой фильтр, это произойдет перед темой, поэтому
'TEMPL_URI'
будет грязным.
Тем не менее, это нормально, чтобы определить константы, я просто хотел сказать, что константа не будет защищать вас.
Еще одна вещь, которую я нашел в Twenty Seventeen
. Там я увидел функцию get_theme_file_uri (@since 4.7)
File: wp-includes/link-template.php 4026: /** 4027: * Retrieves the URL of a file in the theme. 4028: * 4029: * Searches in the stylesheet directory before the template directory so themes 4030: * which inherit from a parent theme can just override one file. 4031: * 4032: * @since 4.7.0 4033: * 4034: * @param string $file Optional. File to search for in the stylesheet directory. 4035: * @return string The URL of the file. 4036: */ 4037: function get_theme_file_uri( $file = '' ) { 4038: $file = ltrim( $file, '/' ); 4039: 4040: if ( empty( $file ) ) { 4041: $url = get_stylesheet_directory_uri(); 4042: } elseif ( file_exists( get_stylesheet_directory() . '/' . $file ) ) { 4043: $url = get_stylesheet_directory_uri() . '/' . $file; 4044: } else { 4045: $url = get_template_directory_uri() . '/' . $file; 4046: } 4047: 4048: /** 4049: * Filters the URL to a file in the theme. 4050: * 4051: * @since 4.7.0 4052: * 4053: * @param string $url The file URL. 4054: * @param string $file The requested file to search for. 4055: */ 4056: return apply_filters( 'theme_file_uri', $url, $file ); 4057: }
Снова этот фильтр theme_file_uri
может наложить проблему безопасности, например @toscho, объясненную для
get_template_directory_uri
.
Вывод
Когда речь идет о безопасности, мы должны быть очень осторожны. Проблема здесь глубже, чем просто выйти из одного URL-адреса. Он рассматривает всю модель безопасности плагинов WordPress .
get_template_directory_uri()
не нужна
get_template_directory_uri()
и фильтр там, чтобы делать плохие вещи. Они могут выполняться с теми же привилегиями, что и ядро WordPress, – они могут делать что угодно.
Вредоносный код JavaScript, который могут вставлять плохие плагины, может читать ваши пароли во время ввода.
www.wordpressask.com
Уменьшаем количество запросов к базе данных
Каждый шаблон оформления содержит множество запросов к базе данных. Зачем? Шаблоны создаются максимально универсальными, чтобы они работали на любом блоге. В этом случае приходится жертвовать скоростью. Если вы просматривали код своего шаблона, вы наверняка обратили внимание на подобные вставки:
<?php echo get_option('home'); ?>
В этом примере код возвращает адрес главной страницы. Но зачем лишний раз спрашивать у БД эту информацию, если она неизменна? Это лишнее, поэтому такие вставки можно смело убирать, заменяя на ту информацию, которую возвращает запрос.
Вместо этого кода можно вставить такой:
http://gering111.com
В работе шаблона ничего не поменяется, а вот один запрос к БД мы уже убрали.
О подобных вставках я писал в статье “Общие функции WordPress”, где рассмотрены примеры вывода информации о блоге. Рекомендую ознакомиться, кто не читал.
А тут я напишу список функций, которые можно заменить на вывод статической информации:
Уменьшаем количество плагинов
Все красивости так или иначе ухудшают техническое состояние блога. Но без некоторых никак нельзя обойтись по тем или иным причинам. Что делать? Подумайте перед тем, как внедрять тот или иной плагин, нужен ли он на самом деле и можно ли заменить его функционал прямой вставкой кода. Например, у меня в сайдбаре есть блок вывода самых комментируемых записей. Этот функционал можно добавить с помощью плагина, а можно поступить иначе, вставив нужный код на PHP. Как это сделать я описал в статье “Как вывести самые комментируемые посты”.
Влияние каждого плагина на скорость загрузки можно проверить и отключить ненужные (либо заменить менее прожорливыми аналогами) — как это сделать я описывал в этой статье.
Оптимизируем картинки на блоге
Картинки — основная часть трафика, поэтому их размер, а точнее его уменьшение, очень важный пункт оптимизации WordPress. Написано много статей про оптимизацию изображений для веба, я не буду повторяться.
Для оптимизации картинок я использую сервис PunyPNG, меня устраивает его функционал. Он достаточно хорошо жмет картинки, понимает и JPG, и PNG. В общем, рекомендую.
Причем, оптимизации подлежат не только те изображения, которые вы вставляете в записи, но и те, из которых состоит ваш шаблон. Не забывайте об этом.
Кэширование сайта и сжатие CSS, JS и HTML
Есть множество плагинов для кэширования страниц. Принцип их работы одинаков — в специальной папке создаются сгенерированные статические страницы, которые отдаются при запросе браузера. Получается значительно быстрее, чем обычная генерация движком в режиме реального времени.
Сейчас я использую плагин WP Super Cache в связке с WP Minify. На сервере установлен nginx.
Чем хорош данный плагин? Он раскладывает файлы кэша по папкам, откуда nginx их замечательно забирает, даже не используя PHP. Этот механизм очень хорошо ускоряет работу блога. Вообще, я считаю, в вопросе оптимизации WordPress едва ли не самое пристальное внимание следует уделить именно кэшированию.
Приведу несколько скриншотов, которые я сделал с помощью сервиса gtmetrix.com:
Без кэширования и сжатия по технологии Minify:
И вторая пара скриншотов, с включенным кэшированием и Minify:
Настраиваем Apache для сжатия отдаваемых страниц
Apache — самый распространенный веб-сервер в мире. Если у вас шаред хостинг — 90% что там стоит Apache. Он поддерживает технологию gzip сжатия, которая значительно ускоряет отдачу страницы посетителю. Как это делается? В корневой папке вашего блога есть файл htaccess, в котором нужно прописать этот код:
<FilesMatch «.js.gz$»> ForceType text/javascript Header set Content-Encoding: gzip </FilesMatch> <FilesMatch «.css.gz$»> ForceType text/css Header set Content-Encoding: gzip </FilesMatch> <FilesMatch «.js$»> ForceType text/javascript RewriteEngine On RewriteCond %{HTTP_USER_AGENT} !».*Safari.*» RewriteCond %{HTTP:Accept-Encoding} gzip RewriteCond %{REQUEST_FILENAME}.gz -f RewriteRule (.*).js$ $1.js.gz [L] ForceType text/javascript </FilesMatch> <FilesMatch «.css$»> ForceType text/css RewriteEngine On RewriteCond %{HTTP_USER_AGENT} !».*Safari.*» RewriteCond %{HTTP:Accept-Encoding} gzip RewriteCond %{REQUEST_FILENAME}.gz -f RewriteRule (.*).css$ $1.css.gz [L] ForceType text/css </FilesMatch>
Пишем технически правильный код
Бесплатные шаблоны часто грешат невалидным кодом. Все это оттого, что их пишут не на продажу, поэтому о скорости работы и правильном коде мало задумываются. Есть, конечно, исключения… Но их настолько мало, что можно не учитывать. А зачем все это нужно, работает же, спросите вы. Поисковые боты подчиняются стандартам HTML, поэтому если у вас неверный код, поисковик попросту может не найти вашего контента на странице. По этому поводу Google пишет в своем руководстве для веб-мастеров:
Я написал отдельную статью “Правила хорошего тона веб-разработки”, в которой описаны основные приемы хорошего кода. Если вы знакомы с версткой и языком разметки HTML — вам не составит особого труда разобраться с кодом вашего шаблона.
На сегодня хватит. Спасибо всем, кто осилил, статья получилась нудная и огромная Кому есть что добавить или высказать свое мнение — пишите в комментариях.
Удачного дня
gering111.com
Дочерняя тема WordPress или Child Themes — это тема, которая расширяет функционал другой темы, называемой родительской темой, и позволяет вам изменять или дополнять функционал родительской темы.
Эта статья рассказывает как создать простую дочернюю тему, и объясняет что вы можете с ней сделать.
Для чего нужна дочерняя тема?
Есть несколько причин, для чего вы должны использовать дочернюю тему:
- Если вы вносите изменения непосредственно в готовую тему, то при её обновлении вы потеряете все внесенные изменения. При использовании же дочерней темы вы будете уверены, что все изменения будут сохранены.
- Использование дочерней темы может ускорить время наладки темы
- Использование дочерней темы поможет вам лучше разобраться, как устроены темы WordPress
Задача: Создать дочернюю тему для выбранной темы WordPress
Решение: Чтобы создать дочерную тему нам, конечно, понадобиться основная тема, с которой мы будем работать и которую мы будем изменять.
Дочерняя тема состоит из самой директории и двух файлов в ней style.css and functions.php, которые вы должны создать.
Первым шагом создания дочерней темы является создание её директории,т.е папки с названием темы и помещаем её в wp-content/themes.
Рекомендуется (хотя и не обязательно, особенно если вы создаете тему для общего пользования), чтобы название директории дочерней темы называлось, как и родительская, но с добавлением «-child».
Вы должны быть уверены, что в названии директории дочерней темы нет лишних символов или пробелов, которые могут привести к ошибке.
На картинке вы видите, что мы назвали директорию twentyfifteen-child, тем самым указывая, что родительской темой является тема Twenty Fifteen.
Следующий шаг — это создание файла со стилями для дочерней темы style.css
Файл со стилями должен иметь следующий информационыый заголовок:
/* Theme Name: Twenty Fifteen Child Theme URI: http://example.com/twenty-fifteen-child/ Description: Twenty Fifteen Child Theme Author: John Doe Author URI: http://example.com Template: twentyfifteen Version: 1.0.0 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Tags: light, dark, two-columns, right-sidebar, responsive-layout, accessibility-ready Text Domain: twenty-fifteen-child */
Краткое пояснение каждой строки:
Theme Name: (обязательно) Название дочерней темы.
Theme URI: (опционально) Адрес сайта дочерней темы.
Description: (опционально) Описание дочерней темы. Например: Моя первая дочерняя тема.
Author: (опционально) Имя автора дочерней темы.
Author URI: (опционально) Адрес сайта автора дочерней темы.
Template: (обязательно) Название папки родительской темы, регистрозависимое.В нашем случае -это тема twentyfifteen. Работая с другой родительской темой, вы её указываете соответственно.
ПРИМЕЧАНИЕ. При изменении данной строки вы должны переключится на другую тему и обратно на дочернюю тему.
Version: (опционально) Версия дочерней темы. Например: 0.1, 1.0.
License: лицензия, по которой работает тема
License URI: ссылка на лецензию
Tags: тэги, по которым можно описать вашу тему
Text Domain: определяет домен темы, чтобы сделать её переводимой (Codex рекомендация : load_theme_textdomain() )
Для дочерней темы обязательным является файл со стилями, но теперь рекомендуется создавать также и файл functions.php для корректной установки стилей.
Финальным шагом является установка связи стилей родительской и дочерней темы. Имейте ввиду, что предыдущий метод связывания стилей был импорт стилей родительской темы, используя @import. В настоящее время это уже устаревшая практика.
Сейчас корректным методом является использование функции wp_enqueue_script() в файле functions.php вашей дочерней темы. Именно поэтому необходимо создание файла functions.php в директории вашей дочерней темы.
Первой строчкой в файле functions.php должен быть открытый PHP tag < ?php , после которого вы можете устанавливать связь стилей. Следующий пример функции будет работать только в том случае, если родительская тема имеет только один главный файл стилей style.css, содержащий все стили. Если же в родительской теме имеется более, чем одного файла .css file (например,ie.css, style.css, main.css), то вы должны убедиться, что поддерживаются все зависимости стилей родительской темы.
< ?php add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles' ); function my_theme_enqueue_styles() { wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); } ? >
Стили вашей дочерней темы обычно будут загружаться автоматически. Если этого не происходит, то вам придется поставить в очередь и их. Настройки ‘parent-style’ как зависимость будет гарантировать, что стили вашей дочерней темы загрузятся.
< ?php function my_theme_enqueue_styles() { $parent_style = 'parent-style'; wp_enqueue_style( $parent_style, get_template_directory_uri() . '/style.css' ); wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array( $parent_style ) ); } add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles' ); ? >
Теперь ваша дочерняя тема готова к активации. Зайдите в админку вашего сайта- Внешний вид -Темы. Вы должны увидеть вашу дочернюю тему, готовую к активации.
Примечание: вы должны пересохранить ваше Меню в Внешний вид — Меню и настройки темы после установки дочерней темы.
Файлы шаблона
Если вы хотите изменить не только стили в родительской теме, но и какие-то другие файлы, то просто создайте аналогичные файлы с таким же названием в директории вашей дочерней темы. При загрузке вашей темы автоматически произойдет коррекция файлов родительской темы.Т.е. если вы хотите изменить PHP код в шапке сайта,вы можете включить файл header.php в директорию дочерней темы и этот файл с изменениями будет загружаться вместо такого же родительского файла.
Вы также можете подключать файлы в директорию дочерней темы, которых нет в родительской теме. Например, вы хотели бы создать больше специальных шаблонов, таких как, шаблоны страниц или шаблоны архивов, которых нет в родительской теме.
Использование functions.php
В отличии от файла style.css, файл functions.php дочерней темы не заменяет такой же файл родительской темы, а загружается в дополнение к родительскому файлу functions.php. А именно, он загружается прямо перед файлом родительской темы.
В этом случае файл functions.php дочерней темы обеспечивает умный, беспроблемный метод модификации функциональности родительской темы.
Итак, вы хотите добавить функцию в тему. Самый быстрый способ -открыть файл functions.php и положить функцию туда. Но это не «умный» вариант: в следующий раз, когда ваша тема обновится, функция исчезнет.
Но существует альтернативный метод -«умный» метод: создать дочернюю тему и файл functions.php в ней и положить функцию туда. Функция будет выполнять ту же самую работу и из дочерней директории, но с преимуществом того, что при обновлении темы она не пропадет.
Не нужно полностью копировать все функции родительской темы в аналогичный файл дочерней темы. Структура файла functions.php проста: открывающий тег PHP в начале, закрывающий тег PHP в конце, и между ними ваш код. Здесь вы можете определить любое количество ваших функций. Пример ниже показывает элементарный файл functions.php, который делает одну простую вещь: добавляет ссылку на favicon в элемент head HTML страниц.
СОВЕТ ДЛЯ РАЗРАБОТЧИКОВ ТЕМ. Факт, что файл functions.php дочерней темы загружается первым, означает что вы можете делать функции своей темы расширяемыми, т.е. заменяемыми посредством дочерней темы, объявляя их условно. Пример:
if (!function_exists('theme_special_nav')) { function theme_special_nav() { // Ваш код. } }
В этом случае, дочерняя тема может переопределить функцию PHP родительской темы просто объявив ее снова.
< ?php // Открытый PHP тэг - ничего не должно быть над ним, даже пробела // подключение необходимой функции function favicon_link() { echo '' . "n"; } add_action( 'wp_head', 'favicon_link' );
Привязка/вставка файлов в вашу дочернюю тему
Когда вам нужно вставить файлы, которые находятся внутри папки вашей дочерней темы, используйте get_stylesheet_directory(). Т.к. файл стилей родительской темы заменяется файлом style.css вашей дочерней темы, который находится в корневой папке дочерней темы, get_stylesheet_directory() указывает на папку вашей дочерней темы (а не на папку родительской темы).
Вот пример использования require_once, который показывает, как можно использовать get_stylesheet_directory(), когда подключаемый файл находится в папке дочерней темы. Ниже показан пример, используя функцию require_once, который показывает, как вы можете использовать get_stylesheet_directory, если хотите привязать файл, находящийся внутри директории дочерней темы.
require_once( get_stylesheet_directory() . ‘/my_included_file.php’ );
где my_included_file.php -это ваш подключенный файл .php
Другая полезная информация
Дочерняя тема наследует форматы записей, определенные в родительской теме. Но, при создании дочерних тем, будьте осторожны, т.к. функция add_theme_support(‘post-formats’) переопределит форматы, заданные родительской темой, а не добавит к ней.
Поддержка RTL (для языков с письмом справа налево)
Для поддержки языков с письмом справа налево (например, иврита или арабской письменности), добавьте файл rtl.css, содержащий ниже следующий код, в вашу дочернюю тему:
/* Theme Name: Twenty Fourteen Child Template: twentyfourteen */
WordPress автоматически загрузит файл rtl.css только если is_rtl() returns true. Даже если родительская тема не содержит файла rtl.css, рекомендуется добавить rtl.css в вашу дочернюю тему.
Локализация
Дочерняя тема, как и любые другие расширения, может быть переведена на любой язык, используя функцию gettext.
Для локализации делаем следующее:
- создаем директорию languages в дочерней теме, например, my-theme/languages/
- создаем языковые файлы. Ваши файлы должны быть с расширениями следующего вида ru_RU.po и ru_RU.mo (или другого необходимого языка)
- загрузите функцию textdomain. Используйте load_child_theme_textdomain() в файле functions.php при выполнении действия the after_setup_theme. Textdomain, определенный в load_child_theme_textdomain () , следует использовать , чтобы перевести все строки в дочерней теме.
- Используйте функции GetText, чтобы добавить i18n поддержку для строк.
Пример: textdomain
< ?php /** * Setup My Child Theme's textdomain. * * Declare textdomain for this child theme. * Translations can be filed in the /languages/ directory. */ function my_child_theme_setup() { load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' ); } add_action( 'after_setup_theme', 'my_child_theme_setup' ); ?>
Пример: gettext functions
< ?php _e( 'Code is Poetry', 'my-child-theme' ); ?>
Суммируя всё, все строки в «my-child-theme» должны быть переводимыми. Файлы перевода должны находится в директории «/languages/».
wordpress-helper.com
Иногда плагинам нужно предоставлять ссылки на файлы-ресурсы (изображения, css таблицы, или файлы сценария JavaScript), которые хранятся в директории плагина. Поскольку пользователи могут переименовать директорию плагина или даже установить файлы плагина прямо в каталог плагинов WordPress, то пути к таким файлам должны быть построены динамически на основе фактического местоположения плагина.
К счастью существует ряд функций для упрощения этой задачи. В этом рецепте мы напишем простой плагин, который будет добавлять мета-тег заголовка устанавливающий значок веб-сайта. Тут нам и понадобиться URI файла изображения, который будет лежать у нас в папке плагина:
<link rel="shortcut icon" href="http://xxx.xx/ ... " />
Итак поехали:
- Перейдите в каталог плагинов WordPress: wp-content/plugins
- Создайте новую директорию для плагина под названием favicon
- Найдите подходящее изображение 16×16 и сохраните его в папке плагина под именем favicon.png
- Зайдите в директорию плагина и создайте php-файл: favicon.php
- Откройте ваш новый файл в редакторе кода и добавьте заголовок в верхней части файла плагина:
/* Plugin Name: Plugin Header favicon Plugin URI: Description: Этот плагин добавляет favicon в хедер страницы. Version: 1.0 Author: Somebody Author URI: http://xxxxxx.xx/ License: GPLv2 */
- Добавьте следующую строку кода, чтобы зарегистрировать функцию, которая будет вызываться когда WordPress подготавливает блок head страницы:
add_action ('wp_head', 'page_header_favicon');
- Далее реализуем функцию page_header_favicon:
function page_header_favicon() { $icon_url = plugins_url( '/wordpress/122-funkcii-dlya-raboty-s-putyami.html/favicon.ico', __FILE__ ) ?> <link rel="shortcut icon" href="<?php echo $icon_url ?>" /> <?php }
- Сохраните и закройте файл плагина. Больше кода в нем не будет.
- Идем в админку нашего сайта во вкладку Plugins
- Находим наш плагин в списке и активируем его
- Теперь перейдите на главную страницу вашего сайта и обновите её чтобы увидеть что браузер показывает ваш значок favicon
Как это работает…
Функция plugins_url — это утилитарная функция, используется в сочетании с PHP константой __FILE__ и именем файла нашего значка favicon. plugins_url — дает нам возможность быстро получить URL-адрес в директорию плагина. Функция plugins_url может вызываться с параметрами или без. В первом случае функция вернет строку: URL-адрес, добавив путь, переданный в качестве первого параметра в расположении файла указанном в качестве второго аргумента. Во второй ситуации (без параметров) функция вернет строку: местоположение каталога плагина.
Функция plugins_url является одной из многих функций, которые могут использоваться в плагинах, чтобы помочь найти местоположение файлов в дебрях WordPress. Следующие функции так же могут вам пригодиться:
- get_theme_root() : Возвращает адрес директории куда устанавливаются темы (wp-content/themes)
- get_template_directory_uri(): Возвращает URI в директорию текущей активной темы
- admin_url(): Возвращает URI в директорию wp-admin (http://xxxxx.xx/wp-admin/)
- content_url(): Возвращает URI в директорию wp-content (http://xxxxx.xx/wp-content)
- site_url() и home_url(): Возвращает адрес сайта
- includes_url(): Возвращает URI в директорию wp-includes (http://xxxxx.xx/wp-includes/)
- wp_upload_dir(): Вернет массив, где хранится информация о директориях с файлами, загруженные пользователем
Более полный список утилитарных функций для работы с путями в WordPress
Предыдущие статьи этого цикла:
- WordPress: С чего начинаются плагины
- WordPress: Добавление контента в тег head страниц
На этом пока все, комментарии как всегда приветствуются…
php-zametki.ru
This DigWP tutorial explains the «new» way to include parent stylesheets in Child Themes. I put the word «new» in quotes because the technique actually has been around for years, but there are many developers and designers who still use the old @import
way of adding parent styles. This tutorial is for people who may be unfamiliar with using WordPress’ enqueue functionality for Child Themes.
Here you’ll find copy-n-paste techniques, examples, caveats, and numerous resources. Basically everything you need to know about including styles in your Child Themes. Let’s dig in..
The old way
If you’ve been around WordPress (or web development) for awhile, you’re probably familiar with the following technique for including a parent theme’s stylesheet:
/* Theme Name: Example Child Theme Template: themedirectory */ /* import default parent styles */ @import url("../themedirectory/style.css"); /* add child theme styles below */
So you just use the @import
query in the Child Theme’s style.css
and done. That way the parent stylesheet is included, and you can customize the Child Theme as desired by adding your own styles.
This method still works in general, but there are some gotchas and caveats now with certain browsers and JavaScript frameworks. Plus the performance aspect of using @import
is not optimal.
The new way
As performance issues and other downsides of using @import
were discovered, developers began using the enqueue method to include parent styles in Child Themes. You probably already are familiar with enqueueing scripts and styles:
function twentysixteen_scripts() { // enqueue style wp_enqueue_style('twentysixteen-style', get_stylesheet_uri()); // enqueue script wp_enqueue_script('twentysixteen-script', get_template_directory_uri() .'/js/functions.js', array('jquery'), '20150825', true); } add_action('wp_enqueue_scripts', 'twentysixteen_scripts');
This example is taken from the current default WordPress theme, Twenty Sixteen. It shows how the wp_enqueue_scripts
hook is used for enqueueing both scripts and styles. This is the recommended way of adding scripts and styles to any WordPress theme, including Child Themes.
Enqueue parent styles in child themes
Just as we use the enqueue method for parent themes, we also should use it for child themes. So instead of using @import
in your child theme’s style.css
file, you can add the following code to your child theme’s functions.php file:
// enqueue styles for child theme // @ https://digwp.com/2016/01/include-styles-child-theme/ function example_enqueue_styles() { // enqueue parent styles wp_enqueue_style('parent-theme', get_template_directory_uri() .'/style.css'); } add_action('wp_enqueue_scripts', 'example_enqueue_styles');
This function includes the parent theme’s stylesheet in the Child Theme. There are several parameters that may be defined when using wp_enqueue_style()
; check out the resources at the end of this tutorial for more information.
So again, instead of using the @import
query to include the parent stylesheet, use the enqueue method instead. Both techniques are simple enough, but enqueueing is optimal in most cases due to performance concerns, compatibility issues, and other nuanced gotchas.
Download the Example Child Theme
To see this technique for enqueueing parent styles in action, check out my related post at WP Mix, WordPress Example Child Theme. It’s a free download that works on any WordPress-powered site. Provides a dead-simple way to see how to create your own Child Theme.
Bonus: Enqueue parent and child stylesheets
To flesh this tutorial out a bit more, here is a function that will add both the parent and child stylesheets to the Child Theme. You can add this function to your child theme’s functions.php file:
// enqueue styles for child theme // @ https://digwp.com/2016/01/include-styles-child-theme/ function example_enqueue_styles() { // enqueue parent styles wp_enqueue_style('parent-theme', get_template_directory_uri() .'/style.css'); // enqueue child styles wp_enqueue_style('child-theme', get_stylesheet_directory_uri() .'/style.css', array('parent-theme')); } add_action('wp_enqueue_scripts', 'example_enqueue_styles');
When added to your Child Theme, this function will include both parent and child stylesheets. Notice that we’re defining the dependency parameter in the child-theme enqueue, array('parent-theme')
. This tells WordPress that the child styles are dependent on the parent styles, so WordPress will load the parent styles first. This is just a precaution, as the order in which the enqueue functions are called should dictate the correct order.
To enqueue or not to enqueue
Should you enqueue child styles as well as parent styles? Is it necessary? This is where a lot of confusion exists regarding enqueueing stylesheets in child themes. The answer depends on how the parent styles are included in the parent theme. For example, if the parent theme is using get_stylesheet_uri()
to enqueue styles, for example as in Twenty Sixteen:
wp_enqueue_style('twentysixteen-style', get_stylesheet_uri());
..then you don’t need to enqueue the child styles. This is because get_stylesheet_uri()
returns the URL of the current active theme, which in this case is the child theme.
Best advice if there is any confusion is to add something like this in the parent theme’s functions template:
// conditional enqueue styles function example_enqueue_styles() { $deps = false; if (is_child_theme()) { $deps = array('parent-styles'); // load parent styles if active child theme wp_enqueue_style('parent-styles', trailingslashit(get_template_directory_uri()) .'style.css', false); } // load active theme stylesheet wp_enqueue_style('theme-styles', get_stylesheet_uri(), $deps); } add_action('wp_enqueue_scripts', 'example_enqueue_styles');
This function checks if the current theme is a child theme. If so, it loads the parent styles and the child styles. If the current theme is not a child theme, only the parent styles are loaded. Notice the handling of the dependencies parameter, $deps
, which is set to false if the child theme is not active.
Register then enqueue
If you are developing themes for distribution, it is considered best practice to first register your stylesheets before enqueueing them. For example:
wp_register_style('child-theme', get_stylesheet_directory_uri() .'/style.css', array('parent-theme')); wp_enqueue_style('child-theme');
Registering scripts and styles provides greater flexibility and can help to keep your codes nice and tidy.
Disabling a stylesheet
If you need to disable a parent style, you can do this:
// disable parent theme styles function example_disable_parent_styles() { wp_dequeue_style('parent-theme'); } add_action('wp_enqueue_scripts', 'example_disable_parent_styles');
If you a different slug is used for the parent styles, you’ll need to change parent-theme
accordingly. See the resources at the end of this tutorial for more details.
URL reference
For your information, here are the URLs output by the various functions we’re using in this tutorial:
get_stylesheet_uri() = http://example.com/wp-content/themes/example-child/style.css get_template_directory_uri() = http://example.com/wp-content/themes/example-parent get_stylesheet_directory_uri() = http://example.com/wp-content/themes/example-child
I find this info can be super useful when diagnosing and testing different configurations, themes, and so forth.
digwp.com
First Things First: Don’t Hardcode Links
Don’t assume anything about file paths in WordPress—don’t hardcode URLs.
The first thing to know is: Don’t assume anything about file paths in WordPress. In other words, don’t hardcode URLs.
Never manually write out directories like the following:
http://mysite.com/wp-content/themes/my-theme/new.css
http://mysite.com/wp-content/plugins/my-plugin/img/image.png
Why? Because almost everything could change. Your site might someday no longer be at mysite.com
—or someone else might someday use your theme on her site with a different domain name. Similarly, the wp-content
, themes
, my-theme
, my-plugin
directory names are all subject to change—and if anything does, your hard-coded links will break.
Toto, We’re Not in the Database Anymore
WordPress comes with decent ways to rewrite links that are stored in the database. This is why you can hardcode links that you write in post content: those links are saved in the database, so if your site’s domain changes from mysite.com
to mysecondsite.com
, it’s easy to track down references to the old domain and change them.
Theme and plugin development is a different story: the links you’ll be writing are saved directly within PHP files, and changing them becomes a chore that you shouldn’t put yourself or others through.
The Goal: Get to the Theme or Plugin Root with WordPress Functions
To link to a theme or plugin’s resources, the crucial thing is to get to its root directory.
The only stable, hardcodable links are those inside the theme or plugin itself, because you determine those. In the example above, that would be:
new.css
img/image.png
In other words, to link to a theme or plugin’s resources, the crucial thing is to get to its root folder, or root directory. Here’s what a theme root looks like:
From there, you can hardcode the rest of your links to get where you need to inside your theme or plugin. Below, we’ll cover the WordPress functions to get you to your theme or plugin root.
If you need a primer on function writing, check out our quick tutorials on PHP functions, and on understanding WordPress functions specifically.
Getting to the Theme Root with get_stylesheet_directory_uri()
To get to your active theme’s root, you’ll use a WordPress function called get_stylesheet_directory_uri()
. This function will work flawlessly, whether you’re working in a parent theme or a child theme.
<!-- Environment: functions.php or a theme template file --> <!-- Points to the current theme's root directory, then photo.jpg --> <img src="<?php echo get_stylesheet_directory_uri(); ?>/photo.jpg"> <!-- Points to the current theme's root directory, then images/photo.jpg --> <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/photo.jpg">
The two resulting image links from the code above will look like:
<img src="https://mysite.com/wp-content/themes/mytheme/photo.jpg">
<img src="https://mysite.com/wp-content/themes/mytheme/images/photo.jpg">
Not-Quite-There Alternatives
get_template_directory_uri()
This function behaves almost exactly like get_stylesheet_directory_uri()
—but not if you’re using a child theme. get_template_directory_uri()
always links to the root of the parent theme, which is sometimes—but not very often—what you want if you’re working in a child theme.
get_theme_root_uri()
get_theme_root_uri()
gets you to the root of the folder usually called /themes/
. Great, right? You can just do that plus your theme’s name and the rest of it.
The problem is that if you—or someone else—renames your theme, all these calls will break. Renaming themes is perfectly legitimate, so don’t use get_theme_root_uri()
to link to theme resources.
Getting to the Plugin Root with plugin_dir_url()
If you’re writing a plugin and want to link to something inside it, you’ll use a WordPress function called plugin_dir_url()
. This function returns
the root directory of the plugin from which it’s called. The syntax is a little unusual, but you’ll get used to it:
<!-- Environment: a PHP file inside a plugin --> <!-- Points to the current plugin's root directory, then photo.jpg --> <img src="<?php echo plugin_dir_url( __FILE__ ) . 'photo.jpg'; ?>"> <!-- Points to the current plugin's root directory, then images/photo.jpg --> <img src="<?php echo plugin_dir_url( __FILE__ ) . 'images/photo.jpg'; ?>">
The two resulting image links from the code above will look like:
<img src="https://mysite.com/wp-content/plugins/myplugin/photo.jpg">
<img src="https://mysite.com/wp-content/plugins/myplugin/images/photo.jpg">
You can use this syntax as written out above anytime you want to link to another resource inside the same plugin you’re writing.
How Does This Work?
__FILE__
Well, the scary piece of this function is the huge __FILE__
argument, right? __FILE__
is a type of PHP variable called a magic constant. For our purposes, just think of it as meaning “The file I’m writing right now”—and the full function as meaning, “Get me to the root directory of the plugin that contains the file I’m writing right now.”
The Trailing Slash
Unlike get_stylesheet_directory_uri()
, plugin_dir_url()
does include a “trailing slash”—a slash after the name of the plugin folder. This is why we write:
plugin_dir_url( __FILE__ ) . 'photo.png'
rather than:
plugin_dir_url( __FILE__ ) . '/photo.png'
This is just an inconsistency in WordPress that you’ll need to keep in mind.
PHP String Concatenation
Finally, please note that:
<?php echo plugin_dir_url( __FILE__ ); ?>images/photo.jpg
ought to work just as well as:
<?php echo plugin_dir_url( __FILE__ ) . 'images/photo.jpg'; ?>
in the example we gave above. To us, though, the former looks weird. Furthermore, in plugin writing you’ll often need to be concatenating strings in PHP rather than pulling PHP into a raw HTML environment, so the second way of using the function is more broadly useful.
Not-Quite-There Alternatives
plugins_url()
Used without any arguments, plugins_url()
will get you to the folder usually called /plugins/
. Again, we don’t want this, because then we have to hardcode your plugin’s name, which may change.
Used with arguments, plugins_url()
is a viable alternative to plugin_dir_url()
. It’s used as follows:
<!-- Points to the current plugin's root directory, then /photo.jpg --> <img src="<?php echo <plugins_url( '/photo.jpg', __FILE__ ); ?>">
Syntax-wise, though, we think it’s a bit confusing: everything’s a function argument, and it’s just too different from get_stylesheet_directory_uri()
. If you can get closer to consistency, why not do it?
wpshout.com