Статьи

Почему вы не должны кодировать URL-адреса в темах WordPress или плагинах

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

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

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

  • Если вы когда-нибудь решите изменить доменное имя сайта, вам придется редактировать все URL-адреса, которые вы жестко закодировали.
  • Если вы работаете над сайтом разработки, который при запуске вы будете перемещать на работающий сервер, вам придется изменить все URL-адреса, которые вы жестко запрограммировали.
  • Если вы решите использовать тему на другом сайте, вам придется редактировать все эти URL.
  • Если вы решите опубликовать тему для широкой публики или позволить другим разработчикам использовать ее, она сломается.
  • Если вы используете тему в качестве основы для другой темы, разработанной для другого сайта, вам придется отредактировать все URL-адреса.
  • Если ваш сайт находится в подкаталоге корневого каталога вашего домена, но вы сказали WordPress использовать корневой каталог для URL-адреса, ваши жестко запрограммированные URL-адреса могут указывать на неправильное место.
  • Если вы когда-нибудь забудете выполнить что-либо из перечисленного, ваш сайт получит 404 ошибки, и ссылки на такие ресурсы, как изображения и таблицы стилей, не будут работать.

Так что не делай этого!

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

  • Если ваш плагин будет перемещен в другой каталог (например, каталог must use), тогда все ссылки будут разорваны.
  • Если ваш плагин установлен в многосайтовой сети, работающей под управлением более старой версии WordPress, ваши ссылки могут сломаться.
  • Если ваш плагин установлен на сайте с использованием структуры каталогов, отличной от той, которую вы использовали для своих URL, ваши ссылки снова будут повреждены.

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

Итак, что вы делаете, чтобы избежать жесткого кодирования URL в WordPress?

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

  • функции для получения домашней страницы сайта
  • функции для извлечения других внешних ссылок (включая сообщения, страницы, вложения и архивы)
  • функции для получения URL-адресов для экранов администратора
  • функции для получения URL-адресов для файлов в вашем плагине и каталогах темы
  • функции для получения таблиц стилей и скриптов

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

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

  • bloginfo( 'url' ) : отображает домашний URL, указанный в настройках чтения в админке.
  • get_bloginfo( 'url' ) : извлекает URL сайта без его отображения.
  • home_url() : извлекает URL домашней страницы, не отображая его: используйте echo esc_url( home_url( '/' ) ); чтобы отобразить домашний URL с косой чертой. Это принимает два необязательных параметра: $path если вы хотите добавить путь к конкретной странице или добавить косую черту, и $scheme чтобы указать схему для URL, например, http , https и relative .
  • get_home_url() извлекает URL для домашней страницы и поддерживает мультисайт: вы можете включить идентификатор блога в качестве параметра.
  • site_url() : URL-адрес, на котором хранится WordPress, поэтому, если ваша установка WordPress находится в подкаталоге wordpress, будет получен URL-адрес http://mysite.com/wordpress .
  • get_site_url() : извлекает URL сайта без его вывода. Может также использоваться с параметрами для вывода URL-адреса сайта в сети Multisite, добавления пути и использования определенной схемы.
  • network_home_url() : домашний URL-адрес основного сайта в многоузловой сети, полезен, например, если вы хотите включить ссылку на главный сайт в нижний колонтитул каждого сайта в сети.
  • network_site_url() : URL сайта для основного сайта в многосайтовой сети.

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

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

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

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

  • post_permalink() выводит ссылку на сообщение с идентификатором сообщения в качестве параметра.
  • get_page_link() извлекает (но не выводит) ссылку на страницу с идентификатором страницы в качестве параметра.
  • get_permalink() извлекает (но не выводит) постоянную ссылку для поста или страницы с идентификатором поста или страницы в качестве параметра.
  • get_category_link() извлекает ссылку на архив категории с ID категории в качестве параметра.
  • get_tag_link() извлекает ссылку на страницу архива тега с идентификатором тега в качестве его параметра.
  • get_post_type_archive_link() извлекает ссылку на архив типа записи с типом записи в качестве параметра.
  • get_term_link() извлекает ссылку на термин таксономии с термином и таксономией в качестве его параметров.
  • the_attachment_link() выводит ссылку на вложение с идентификатором вложения в качестве первого параметра. Используйте другие параметры, чтобы определить размер изображения и указать, будет ли ссылка вести на сам файл или на страницу его вложения.
  • get_attachment_link() выбирает ссылку для вложения с ID вложения в качестве параметра.
  • wp_get_attachment_link() также извлекает ссылку на вложение, но дополнительно позволяет отображать изображение, если вложение является изображением, в указанном вами размере.
  • get_search_link() извлекает ссылку на страницу поиска. Вы можете определить запрос в качестве его параметра или оставить его пустым, в этом случае он будет использовать текущий запрос.

Если вы создаете плагин или тему с экранами настроек в админке WordPress или настраиваете экраны администраторов, вы можете добавить ссылки на экраны администраторов. Опять же, вы не должны жестко кодировать свои URL, а использовать один из следующих тегов:

  • admin_url() извлекает (но не выводит) URL-адрес администратора. Вам необходимо указать путь к URL-адресу в качестве параметра, а также при необходимости включить схему. Так, например, чтобы вывести URL-адрес экрана для создания нового сообщения, вы должны использовать echo admin_url( 'post-new.php' ); ,
  • get_admin_url() похож на admin_url() но поддерживает многоузловые сети: вы можете включить идентификатор блога в качестве параметра.
  • edit_post_link() отображает ссылку на страницу редактирования сообщения. Он может использоваться в цикле или вне цикла с идентификатором записи в качестве параметра.
  • get_edit_post_link() извлекает ссылку на экран редактирования сообщения с идентификатором сообщения в качестве параметра.

Так же, как когда вы кодируете URL-адреса на интерфейсном или административном экранах, вы также должны правильно кодировать URL-адреса и пути при обращении к файлам в вашем плагине или папках тем.

Во-первых, вот функции, которые вы должны использовать в файлах темы:

  • get_stylesheet_directory() извлекает полный путь к серверу (не URL) для каталога текущей активированной темы. Используйте это для вызова включаемых файлов, а не для вывода ссылок.
  • get_stylesheet_directory_uri() извлекает URL для текущей активированной темы без косой черты. Используйте его в файлах шаблонов для извлечения ресурсов, хранящихся в папке вашей темы: например, для отображения изображения, хранящегося в папке изображений вашей темы, используйте <img src="<?php echo get_stylesheet_directory_uri(); ?>/images/logo.jpg"> .
  • get_bloginfo( 'stylesheet_directory' ) извлекает URL-адрес для текущей активированной темы: использование get_stylesheet_directory_uri() .
  • get_template_directory_uri() аналогична get_stylesheet_directory_uri() но если вы используете get_stylesheet_directory_uri() тему, она выбирает URL для родительской темы. Аналогично, get_template_directory() работает так же, как get_stylesheet_directory() но для родительской темы.

Есть также функции для использования в файлах плагинов:

  • plugins_url() извлекает абсолютный URL-адрес в каталог плагинов (без косой черты). Он принимает два необязательных параметра: путь, который нужно добавить после URL, и плагин, к которому вы хотите, чтобы URL относился
  • plugin_dir_url() извлекает URL для каталога, в котором находится файл (с завершающей косой чертой), с этим файлом в качестве его параметра. Обычно вы используете __FILE__ качестве параметра для обозначения текущего файла.

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

1
plugins_url( ‘includes/myfile.php’, __FILE__ );

И чтобы получить тот же URL, используя plugin_dir_url() :

1
plugin_dir_url( __FILE__ ) .

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

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

Чтобы вызвать таблицу стилей, используйте wp_register_style() и wp_enqueue_style() в функции и подключите ее к wp_enqueue_scripts . Функция ниже сделает это в плагине:

1
2
3
4
5
6
7
<?php
function register_my_styles() {
    wp_register_style( ‘my-styles’, plugins_url( ‘/css/style.css’, __FILE__ ) );
    wp_enqueue_style( ‘my-plugin’ );
}
add_action( ‘wp_enqueue_scripts’, ‘register_my_styles’ );
?>

Обратите внимание, что я использовал __FILE__ выше, который сообщает WordPress, что путь к таблице стилей относительно текущего файла.

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

1
2
3
4
5
function register_my_scripts() {
    wp_register_script( ‘my_script’, plugins_url( ‘/js/script.js’, __FILE__ ) );
    wp_enqueue_script( ‘my_script’ );
}
add_action( ‘wp_enqueue_scripts’, ‘register_my_scripts’ );

Если ваш скрипт использует скрипт, связанный с WordPress, такой как jQuery, вам не нужно его регистрировать; просто поставьте в очередь это следующим образом:

1
2
3
4
function register_my_scripts() {
    wp_enqueue_script( ‘my_script’, plugins_url( ‘/js/script.js’, __FILE__ ), ‘jquery’, , ‘true’ );
}
add_action( ‘wp_enqueue_scripts’, ‘register_my_scripts’ );

Узнайте больше о wp_enqueue_scripts в этом руководстве, чтобы включить JavaScript и CSS в свои темы и плагины .

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