Добавление стороннего кода в файл functions.php WordPress темы — достаточно распространённое явление. В то время как этот процесс является достаточно простым для тех, кто знает как функционирует PHP, для новых пользователей он является немного трудоёмким. Очень часто новички хотят достигнуть финального результата урока, но у них не хватает знаний в области PHP, чтобы понять как правильно вставить код, не сломав при этом весь сайт. В этом нет ничего плохого, и если вы читаете эту статью из-за того, что сломали свой сайт, то мы хотим вас заверить, что вы такие не одни. Все мы с этого начинали и все мы делали эту ошибку. В этой статье мы расскажем вам как избежать самые распространённые ошибки при вставке PHP-кода из уроков в файл functions.php вашей WordPress темы.
Обратите внимание: Файл functions.php находится в папке /wp-content/themes/yourthemename/. Это НЕ тот же самый файл ядра functions.php, который находится в папке /wp-includes/.
Чтобы понимать как правильно вставлять код, вам необходимо понимать базовую семантику PHP.
1 2 3 4 5 | //Это открывающий тэг PHP кода <?php //Это закрывающий тэг PHP кода ?> |
Причина, по которой вам нужно разобраться с этим, заключается в том, что больше 95% проблем, возникающих у пользователей, связаны с неправильной вставкой кода. Так что знание семантики PHP может пригодиться. Ниже описаны некоторые самые часто встречающиеся ошибки.
Первая самая распространённая ошибка
Пользователь находит код на вебсайте, который обёрнут в PHP, как показано ниже, и они вставляют его не туда, куда надо.
1 2 3 4 5 6 | <?php add_filter( 'login_headerurl', 'custom_loginlogo_url' ); function custom_loginlogo_url($url) { return 'http://www.wpbeginner.com'; } ?> |
Пример кода из файла темы functions.php (обратите внимание, что обычно файл functions.php содержат гораздо больше кода, но суть примерно такая же):
1 2 3 4 5 6 7 8 9 10 11 12 | <?php //Тонны всякого разного PHP кода, который уже есть в вашем PHP файле //Пользователь скопирует и вставит сниппет, который они нашли в сети таким образом: <?php add_filter( 'login_headerurl', 'custom_loginlogo_url' ); function custom_loginlogo_url($url) { return 'http://www.wpbeginner.com'; } ?> ?> |
Очевидно, что это приведёт WordPress в недоумение, так как у вас открывающийся тэг PHP внутри другого, незакрытого, тэга PHP. Есть два способа решить эту проблему. Первый метод заключается в том, что мы вставляем код в нужное место:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php //Тонны всякого разного PHP кода, который уже есть в вашем PHP файле //Обратите внимание как мы закрыли первый открытый PHP тэг ?> //Теперь можно открыть PHP тэг <?php add_filter( 'login_headerurl', 'custom_loginlogo_url' ); function custom_loginlogo_url($url) { return 'http://www.wpbeginner.com'; } ?> |
Заметьте, что мы сделали всё правильно и вставили PHP код после того, как был закрыт предыдущий.
Второй способ заключается в том, чтобы просто убрать открывающий и закрывающий тэги из вашей новой функции WordPress. Вот так примерно это будет выглядеть на практике:
1 2 3 4 5 6 7 8 9 10 | <?php //Тонны всякого разного PHP кода, который уже есть в вашем PHP файле //Новый код будет здесь (Обратите внимание, что мы убрали открывающий и закрывающий PHP тэги из нового кода) add_filter( 'login_headerurl', 'custom_loginlogo_url' ); function custom_loginlogo_url($url) { return 'http://www.wpbeginner.com'; } ?> |
Вторая самая распространённая ошибка
Каждый автор уроков обладает своим собственным стилем письма. Некоторые оборачивают свои сниппеты в тэги PHP, как вы видели в примере выше. Другие авторы не оборачивают сниппеты в тэги PHP. Это приводит нас ко второй проблеме. Если вы видите такой вот код:
1 2 3 4 5 6 | 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 вашей темы. Пример ошибки новичка:
1 2 3 4 5 6 7 8 9 10 11 12 | <?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'); |
Как вы могли заметить, пользователь вставил код вне тэгов PHP. WordPress понятия не имеет, что это за код, потому и ломается. Вот так будет выглядеть правильно вставленный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?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 ?> |
Третья самая распространённая ошибка
Теперь, когда мы рассмотрели проблему с открытием и закрытием PHP тэгов, рассмотрим последнюю самую распространённую проблему, с которой сталкиваются пользователи, — вставка нового кода внутри существующей функции.
Структура функции выглядит примерно так:
1 2 3 4 5 | function custom_function_name() { //Начало функции //здесь идёт характерный для функции код } //Конец функции |
Если вы вставите другую функцию внутри функции, то это приведёт к поломке вашего сайта. Пример такой ошибки будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 | 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'); } //Конец функции |
Нельзя так. Каждая функция является обособленной и независимой, так что нельзя просто так взять и разместить их вместе. Правильный способ вставки будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 вашей WordPress темы.
Другие полезные советы
Бывают ситуации, когда проблемы связаны с тем, что вставленный код содержит ошибки. Некоторые ошибки достаточно небрежные, например разработчик забыл поставить ; или закрыть кавычки. Другие ошибки, в свою очередь, либо носят чисто функциональный характер и связаны с самим кодом, либо возникают из-за того, что пользователь не чётко следует инструкциям.
Крайне важно, чтобы вы активировали плагин, если таковой используется в уроке. Некоторые авторы уроков просто вызывают функцию плагина напрямую в своём сниппете, не имея при этом условную конструкцию для проверки существования плагина. Можно винить как пользователя, так и автора за это. Автору следовало разместить условную конструкцию, а пользователю следовало более внимательно читать статью и установить требуемый плагин.
Бывают случаи, когда вы натыкаетесь на длинные сниппеты, которые вы очень хотите скопировать. У авторов есть тенденция объяснять код своим пользователям (что очень даже хорошо), но это так же приводит к ошибкам в коде. Так что всё, что мы делаем, это прокручиваем вниз или вверх, чтобы получить итоговый сниппет, вместо того, чтобы самим собрать его по кусочкам.
Вы когда-нибудь сталкивались с подобными ошибками? Как вы с ними справлялись? Сталкивались ли вы с проблемами, которые мы не описали? Обязательно поделитесь с нами в комментариях.
Если вам интересно то, о чем пишем, то подписывайтесь на наш блог и вступайте в нашу группу Вконтакте