Как правильно добавлять сниппеты в WordPress

Время от времени мы, на нашем блоге, публикуем статьи, которые включают в себя сниппеты (хуки). Пользователь может их использовать на своем сайте, вставляя в файл functions.php своей темы. В то время как этот процесс (добавления сниппетов/хуков) прост для знающих основы работы PHP, он (процесс) немного утомителен для новичков. Часто новички хотят достичь финального результата, описываемого в статье, однако им не хватает знаний в PHP, для того, чтобы сделать это правильно и не сломать сайт. В этом нет ничего постыдного, и если вы читаете эту статью, потому что вы сломали сайт, то спешим вас заверить — вы такой не один (одна) :) Все мы начинали с этого, и все делали такие же ошибки. В этой статье мы расскажем как избежать наиболее частых ошибок при добавлении сниппетов/хуков из статей, найденых на просторах интернета и на нашем блоге, при добавлении в файл functions.php вашей темы.

Примечание: Файл functions.php темы расположен в папке /wp-content/themes/названиеВашейТемы/. Это НЕ файл ядра ВП, расположеный в папке /wp-includes/.

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

//Это открывающий тег кода на PHP
<?php

//Это закрывающий тег кода на PHP
?>

Причина, по которой вам нужно ознакомиться с этим, такова, что 95% проблем пользователей при вставке кода из-за того, что код вставляется в неправильном месте. А базовые знания синтаксиса PHP здесь очень пригодятся. Ниже — несколько наиболее распространенных ошибок.

1ая общая ошибка

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

<?php
add_filter( 'login_headerurl', 'custom_loginlogo_url' );
function custom_loginlogo_url($url) {
	return 'http://www.wpincode.com';
}
?>

Пример пример кода файла functions.php вашей темы (Обычно конечно в этом файле намного больше кода, но идея та же):

<?php
//Большое количество php-кода, который уже есть в вашем файле и расположен в этом месте	

//Пользователь скопирует в и вставить найденый сниппет примерно так:

<?php
add_filter( 'login_headerurl', 'custom_loginlogo_url' );
function custom_loginlogo_url($url) {
	return 'http://www.wpincode.com';
}
?>
?>

Теперь этот код наверняка изуродует WordPress, потому как у нас появляется открывающий php тег, но нет закрывающего существующий. Есть два способа устранить эту проблему. Первый из них — вставить сниппет в правильном месте:

<?php
//Большое количество php-кода, который уже есть в вашем файле и расположен в этом месте	

//Вот как правильно закрывать первый открывающий php-тег
?>
//Теперь мы открываем PHP тег.
<?php
add_filter( 'login_headerurl', 'custom_loginlogo_url' );
function custom_loginlogo_url($url) {
	return 'http://www.wpincode.com';
}
?>

Заметьте, как КОРРЕКТНО мы вставили сниппет в php тегах ПОСЛЕ того, как закрыли предыдущий.

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

<?php
//Большое количество php-кода, который уже есть в вашем файле и расположен в этом месте	

// Новый код вставляем здесь (с уже вырезанными тегами)

add_filter( 'login_headerurl', 'custom_loginlogo_url' );
function custom_loginlogo_url($url) {
	return 'http://www.wpincode.com';
}
?>

2ая общая ошибка

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

function custom_loginlogo() {
echo '<style type="text/css">
h1 a {background-image: url('.get_bloginfo('template_directory').'/images/login_logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_loginlogo');

Автор предполагает, что вы понимаете, что код должен заключаться в php-теги. Некоторые даже предлагают вставлять их код в конец файла functions.php вашей темы. Примером ошибки новичка является:

<?php
//Большое количество php-кода, который уже есть в вашем файле и расположен в этом месте	
?>

//Затем пользователь вставляет код здесь (Заметьте, что php теги уже закрыты выше):

function custom_loginlogo() {
echo '<style type="text/css">
h1 a {background-image: url('.get_bloginfo('template_directory').'/images/login_logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_loginlogo');

Если вы обратили внимание, то что пользователь вставил код ВНЕ тегов. WordPress не понимает, что это за код, и «ломается». Правильный код должен выглядеть так:

<?php
//Большое количество php-кода, который уже есть в вашем файле и расположен в этом месте	

//Новый код идет здесь
function custom_loginlogo() {
echo '<style type="text/css">
h1 a {background-image: url('.get_bloginfo('template_directory').'/images/login_logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_loginlogo');

//Закрывающий PHP тег
?>

3я общая ошибка

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

Функция обычно выглядит так:

function custom_function_name() { // Открывающий тег для функции

// код, относящийся к функции будет здесь

} // Здесь закрывающий тег для функции

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

function custom_function_name() { // Открывающий тег для функции

// код, относящийся к функции будет здесь

function custom_loginlogo() {
echo '<style type="text/css">
h1 a {background-image: url('.get_bloginfo('template_directory').'/images/login_logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_loginlogo');

} // Здесь закрывающий тег для функции

Так делать нельзя. Каждая функция независима, их нельзя «миксовать». Правильным будет следующий код:

function custom_function_name() { // Открывающий тег для функции

// код, относящийся к функции будет здесь


} // Здесь закрывающий тег для функции

function custom_loginlogo() {
echo '<style type="text/css">
h1 a {background-image: url('.get_bloginfo('template_directory').'/images/login_logo.png) !important; }
</style>';
}
add_action('login_head', 'custom_loginlogo');

Выше мы рассмотрели три ошибки, которые скорее всего и явились причиной поломки сайта, после того, как вы вставили сниппет, найденый на просторах интернета, в файл functions.php своей темы.

Другие советы

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

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

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

А вы сталкивались с такими ошибками? Как боролись с ними? Может у вас есть замечания к статье? Просим в комментарии.

VN:F [1.9.22_1171]
Rating: 4.2/5 (6 votes cast)

Об авторе ADv

Занимаюсь разработкой сайтов и магазинов на WordPress. Оказываю платные помощь и консультации. Skype: advokat_b
  • Дмитрий

    Спасибо большое. Сниппеты пишут многие — а куда их ставить пишут редко. Уточните пожалуйста, снипппет можно вставить как в самое начало так и в конец файла functions.php ? Также где-то читал, что в некоторых случаях сниппет ставится в файл плагина. Проясните пожалуйста?

    • http://web-devise.com/ ADv

      Да, верно, можно вставлять в любое место файла функций. Однако стоит обращать внимание, обернута ли функция в открывающий и закрывающий теги php. См.п.2 статьи. В файл плагина сниппет вставляется только тогда, когда это решение — доработка функционала плагина. Учтите, что при обновлении плагина в таком случае Ваши изменения будут утеряны. В 99% случаев сниппеты должны быть добавлены в файл функций.

      • Дмитрий

        Ещё раз огромное спасибо. В том числе за оперативный ответ. Если честно — не очень рассчитывал, т.к. посту полтора года.

        • http://web-devise.com/ ADv

          Всегда пожалуйста 😉

      • Дмитрий

        Еще один вопрос: если один и тот же параметр определен и стилями шаблона и стилями плагина (Вукоммерс) — у каких стилей приоритет?

  • Друг

    А почему у вас он не показывается в серпе?

    • ADv

      Кто — он? Речь здесь идет не о сниппетах сайта в выдаче, а о сниппетах кода (кусочках кода).

Scroll To Top