it-swarm.com.ru

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

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

// 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 :

ПРИМЕЧАНИЕ. Если вы используете "У вас недостаточно прав для доступа к этой странице." message на экране 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


РЕДАКТИРОВАТЬ 2 - исправлено 1/16/13

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

в файле functions.php:

<?php

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

в моей директории child-theme, файл 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');
}
1
Sparky

Я заметил, что 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.

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

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

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

EDIT:

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

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

Спасибо за предложения по устранению неполадок @ChipBennett.

Правка 2:

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

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

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

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

1
Sparky