Время от времени мы, на нашем блоге, публикуем статьи, которые включают в себя сниппеты (хуки). Пользователь может их использовать на своем сайте, вставляя в файл 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 своей темы.
Другие советы
Могут возникать и ошибки функций из-за неверно написаного кода, или же если пользователь не следовал инструкциям.
Важно, чтобы вы активировали плагин, если он был указан в туториале. Некоторые авторы просто вызывают функцию плагина прямо в сниппете, без проверки, существует ли плагин вообще. Виноват и пользователь, и автор хука. Автор должен был вставить функцию, которая бы проверяла условие, но и пользователь должен был бы полностью прочитать статью и установить требуемый плагин.
Иногда вы находите сниппеты, которые ну уж очень хочется себе на блог. У авторов сниппетов есть тенденция пояснять код читателям своих блогов (что есть хорошо!), однако при «нарезании» кода на кусочки для пояснения могут появиться ошибки. В этом случае лучше поступить так: прокрутить статью в самый низ и скопировать итоговый код сниппета; не стоит копировать его кусочками.
А вы сталкивались с такими ошибками? Как боролись с ними? Может у вас есть замечания к статье? Просим в комментарии.