Я использую WordPress Theme Customizer и обновляю настройки с помощью Javascript (и jQuery ).
Моя домашняя страница разделена на несколько разделов, а в Настройке темы есть флажки для отображения и скрытия каждого раздела.
.remove()
jQuery для ее удаления. $('#section-cont-id').load(theme_folder + '/file.php')
Где theme_folder
– это каталог темы, а file.php
– это раздел, который я хочу загрузить.
По умолчанию отображается раздел (для параметра установлено значение true
). .remove
флажка, чтобы скрыть раздел, отлично работает, он получает .remove
ed. Однако, когда я пытаюсь показать этот раздел, добавив флажок, он работает не так, как планировалось.
file.php
имеет в file.php
<style>
с одним небольшим количеством кода PHP. Тогда есть различные другие элементы: <h1>, <h3>, <p>
и т. Д. Когда секция предназначена для показа, я вместо этого получаю пустой белый квадрат. Я использовал Inspect Element для просмотра кода и нашел что-то интересное:
Тег <style>
загружается, но остальные элементы этого не делают, они даже не существуют. В теге <style>
существует только одна строка PHP, она получает настройку для фона этого раздела: <?php echo get_theme_mod('setting'); ?>
<?php echo get_theme_mod('setting'); ?>
. Когда я смотрю на CSS для фонового изображения раздела, он показывает следующее:
url('<br /> <b>Fatal error</b>: Call to undefined function get_theme_mod() in <b>C:XAMPPhtdocsWPwp-contentthemesmythemefile.php</b> on line <b>7</b><br />')
Кажется, функция get_theme_mod()
не определена? Кроме того, я не уверен, почему путь был echo
без обратных косых черт, но это могут быть инструменты Firefox Inspector, удаляющие их. Правильный путь должен быть:
C:\XAMPP\htdocs\WP\wp-content\themes\mytheme\file.php
Элементы после <style>
обозначаются следующим образом:
<h1><?php echo get_theme_mod('setting1'); ?></h1> <h3><?php echo get_theme_mod('setting2'); ?></h3> <p><?php echo get_theme_mod('setting3'); ?></p>
Однако они даже не выглядят пустыми (без содержимого, например <h1></h1>
). Их вообще не существует.
Поэтому мой вопрос:
Как удалить Fatal error: Call to undefined function...
вызвать Fatal error: Call to undefined function...
и загрузить остальную часть file.php
для правильной загрузки
То, что я думаю , происходит:
Прежде всего, я думаю, что элементы после <style>
не существуют, потому что после того, как PHP-код выдает ошибку, остальная часть файла не загружается.
Тем не менее, весь код в file.php
находится внутри <div>
, и этот тег закрытия закрывается. Может быть, он загружает элементы и закрывает теги, используя DOM, а не по очереди?
Чтобы справиться с ошибкой get_theme_mod()
не определена, вот моя теория:
get_theme_mod()
в файле с именем theme.php
(как указано в Codex, полный путь – wp-includes/theme.php
) Я думаю, что WordPress включает этот файл, затем все файлы тем, и после того, как все они были загружены, theme.php
удален. (Я не думаю, что PHP работает так, но я думаю, что это то, что происходит)
Мои доказательства для этого:
Fatal Error: Call to undefined function...
Если функция не определена, файл нельзя загружать theme.php
Это очень отличается от других вопросов о Fatal error: Call to undefined function...
Я не получаю ошибку, когда страница загружается, независимо от того, показан ли раздел или нет. Я получаю сообщение об ошибке в Настройке темы, когда я пытаюсь показать раздел (ранее скрытый)
По-видимому, для запуска PHP-кода (с помощью функций WordPress) вы должны использовать AJAX по-разному
Во-первых, вам нужно добавить wp_localize_script()
чтобы добавить данные в скрипт. Я использовал следующий код:
// For AJAX loading of sections wp_localize_script('customizer', 'ajax', array( 'url' => admin_url('admin-ajax.php') ));
Где customizer
– уникальный идентификатор для скрипта Customizer.
В скрипте customizer я использовал следующий код (внутри функции, прослушивающей изменения настроек в Настройке темы):
jQuery.ajax({ url : ajax.url, type : 'post', data : { action : 'load_section', section_name: 'section1' }, success : function(data) { $('div').append(data) // On success, add section to page } });
ajax.url
содержит URL-адрес, который был установлен в wp_localize_script()
. Вы используете ajax.
потому что 'ajax
был вторым аргументом
Затем вам нужно использовать add_action()
следующим образом:
// To get file.php ($_POST['data'] can be used to access data from the "data" object) function load_a_section() { get_template_part(echo $_POST['section'], echo $_POST['section'] + '_template'); die(); // To stop a "0" being added to the end of the data } // This is the "action" stored in the "data" object, prepended with wp_ajax_ add_action('wp_ajax_load_section', 'load_a_section');
Данные, возвращенные из load_a_section()
могут быть доступны из функции success
внутри запроса AJAX