Intereting Posts

Проблема только при использовании require_once () в функции functions.php

Я использую add_theme_page() в functions.php моей дочерней add_theme_page() реализовал что-то вроде этого …

 // other functions located here that create a custom options page in the Dashboard. // THIS IS NOT A FILE PATH ISSUE -> THE CUSTOM PAGE IS CREATED IN BOTH CASES. function my_menu() { ... if ( 'save' == $_REQUEST['action'] ) { echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">'; die; } add_theme_page(...) } add_action('admin_menu', 'my_menu'); 

Согласно документам WordPress :

ПРИМЕЧАНИЕ. Если вы используете « У вас недостаточно прав для доступа к этой странице.» wp_die() экране wp_die() , вы слишком рано подключились. Крюк, который вы должны использовать, – admin_menu .

Это именно то, что я получаю сразу после сохранения моих опций. Тем не менее, я использовал правильный крючок, как рекомендовано.

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

 require_once('includes/functions-theme-options.php'); 

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

  • Когда код внутри functions.php , он работает нормально.

  • Когда код перемещается во внешний файл и ссылается на require_once() , он прерывается ( сообщения об ошибках при сохранении в соответствии с указанными документами выше ).

Очевидно, на данный момент я сохраняю его в function.php , но, возможно, кто-то может объяснить, почему он ломается, когда я его перемещаю.


РЕДАКТИРОВАТЬ

Это не проблема с файловым пути . Каждый файл, на который ссылается require_once() , найден и включен. Кажется, проблема заключается в том, как она выполняется.

Пожалуйста, прочтите этот ответ: https://wordpress.stackexchange.com/a/1406/11092


EDIT 2 – пересмотренный 1/16/13

Это урезанная версия, которая была проверена, чтобы полностью продемонстрировать проблему. Этот код создает подменю в разделе «Внешний вид», называемый «Параметры темы». Когда вы нажимаете кнопку «Сохранить параметры», страница должна перезагружать и отображать сообщение «Настройки вашей темы сохранены» . Однако вместо этого он показывает страницу с ошибкой WordPress: «У вас недостаточно прав для доступа к этой странице». Простое перемещение последней функции в functions.php Php устраняет эту проблему. Я хотел бы знать, почему и как я могу это исправить.

в файле functions.php :

 <?php require_once('includes/functions-test.php'); 

в моей директории child-theme, includes/functions-test.php файл includes/functions-test.php :

 <?php $themename = wp_get_theme(); function mytheme_admin() { global $themename; if ( $_REQUEST['saved'] ) echo '<div id="message" class="updated fade"><p><strong>'.$themename.' settings saved.</strong></p></div>'; ?> <div class="wrap"> <h2><?php echo $themename; ?> Options</h2> <div style="border-bottom: 1px dotted #000; padding-bottom: 10px; margin: 10px;">Options specfic to this theme.</div> <form method="post"> <p class="submit"> <input name="save" type="submit" class="button button-primary" value="Save Options" /> <input type="hidden" name="action" value="save" /> </p> </form> </div> <?php } function wp_initialize_the_theme_load() { if (!function_exists("wp_initialize_the_theme")) { wp_initialize_the_theme_message(); die; } } add_action('admin_menu', 'mytheme_add_admin'); /* move only the following function to 'functions.php' and the problem is gone __________________________________________________________________________*/ function mytheme_add_admin() { global $themename, $shortname; if ( $_GET['page'] == basename(__FILE__) ) { if ( 'save' == $_REQUEST['action'] ) { echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">'; die; } } add_theme_page($themename." Options", "Theme Options", 'edit_theme_options', basename(__FILE__), 'mytheme_admin'); } 

Solutions Collecting From Web of "Проблема только при использовании require_once () в функции functions.php"

Я заметил, что URL-адрес пользовательской страницы Dashboard – это …

 themes.php?page=functions-test.php 

Обратите внимание, как page является именем моих внешних функций в includes/functions-test.php .

Проблема заключается в этой строке, которая обновляет страницу перед ошибкой разрешения …

 echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions.php&saved=true">'; 

Теперь это кажется таким очевидным. Посмотрите на параметр page в URL-адресе … это functions.php где должно быть имя моего файла functions-test.php , functions-test.php .

Это исправление …

 echo '<meta http-equiv="refresh" content="0;url=themes.php?page=functions-test.php&saved=true">'; 

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

РЕДАКТИРОВАТЬ:

И без жестко закодированного имени файла … другими словами, используя basename(__FILE__) вместо этого, и я мог бы перемещать этот код где угодно без головной боли.

 echo '<meta http-equiv="refresh" content="0;url=themes.php?page=' . basename(__FILE__) . '&saved=true">'; 

Благодарим вас за советы по устранению неполадок @ChipBennett.

EDIT 2:

Сделав еще один шаг, я смог полностью удалить meta refresh; и die; , где вместо этого я использую action элемента form как и предполагалось. Это одно и то же action формы, которое используется на страницах WordPress App по умолчанию по умолчанию.

 <form action="<?php echo esc_url( add_query_arg( 'saved', true ) ) ?>" method="post"> 

add_query_arg( 'saved', true ) означает, что, когда страница перенаправляется обратно к себе, при add_query_arg( 'saved', true ) &saved=1 в свою строку запроса. Это единственная часть, которая требуется для этого кода, чтобы отобразить сообщение "options saved" . Очень неряшливое meta refresh; die meta refresh; die с жестко закодированным URL-адресом , корень исходной проблемы, полностью уничтожен.

FYI: Это проект, в котором я должен извлечь оригинальные параметры и функциональные возможности клиента из своей «пользовательской» темы и переместить их в дочернюю тему из Twenty Thirteen. Исходная сломанная тема, использующая эти небрежные методы кодирования, называется Delicate .