ashleyg
  • 0
Учитель

Ошибка отправки формы с помощью get_template_part()

  • 0

Я столкнулся с интересной проблемой, связанной с get_template_part() .

Я создал страницу параметров темы (названную sitewideSettings.php)

обычно я бы включил это в functions.php так:

include(TEMPLATEPATH."sitewideSettings.php");

который отлично работает.

Но теперь я пытаюсь использоватьget_template_part();

get_template_part('sitewideSettings');

который также работает нормально, за исключением того, что при нажатии «обновить» для обновления настроек я получаю сообщение об ошибке: «Вы уверены, что хотите это сделать? Пожалуйста, попробуйте еще раз».

«Пожалуйста, попробуйте еще раз» возвращает вас на страницу параметров темы, и нажатие кнопки «Обновить» возвращает вас к сообщению об ошибке, которое возвращает вас к параметрам темы, и так по кругу.

Ничего не изменилось, кроме использованияget_template_part();

Кто-нибудь еще сталкивался с этой проблемой? Как вы обошли это? Я уверен, что это что-то простое и очевидное, но что именно, совершенно ускользает от меня.

(Это не проблема одноразового номера, поскольку одноразовый номер создается в обоих случаях)

Share
  1. Вставьте сюда URL-адрес, который используется для запроса страницы администратора. Кроме того, вставьте сюда URL-адрес, который используется при отправке формы. Если можете, добавьте также все параметры POST.

    • 0
    • Я получаю эту ошибку для некоторых плагинов, когда для wp-config.php DEBUG установлено значение true.

      • 0
    • Одноразовые номера работают нормально, когда код не сегментирован с помощью get_template_part, поэтому, если это проблема с одноразовым номером, почему он работает, если не используется get_template_part? Кроме того, одноразовый номер создается и отображается в исходном коде.

      • 0
    • Как я уже сказал, это, вероятно, связано с масштабом. Правка добавлена ​​выше.

      • 0
    • @John P Bloch — это может быть объяснением этого. Но, в конце концов, это приводит к тому, что эта функция не используется для включения вашего кода. Это просто не шаблон, это код. Таким образом, используется неправильная функция. Но хороший улов, это действительно может быть объяснением.

      • 0
    • @hakre Я думаю, что глупо настаивать на том, чтобы он не использовал эту функцию для администратора. Возможно, он создает фреймворк с определенной страницей администратора, которую дочерние темы должны переопределять. Дело в том, что вариант использования должен диктовать использование, а не ваше глупое заявление о разделении передней и задней частей.

      • 0
    • @Джон П. Блох — прошу прощения. Я не претендую на авторство разграничения между тем, что называется wp-admin и тем, что называется темой или шаблоном. Если вы называете это глупостью по отношению ко мне, вы обращаетесь не к тому человеку. Я также не хотел спрашивать, чего пытается достичь Эш, я просто хотел указать, что использование этой функции вызывает проблему, и вы предоставили техническое объяснение того, что может вызвать проблему. Ничего больше. Практически это может означать просто не использовать эту функцию или глобализировать область действия в этом коде. Все, что кажется подходящим. Просто выберите правильный инструмент для работы.

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

      • 0
    • @Ash G — Ну, одноразовый номер должен быть проблемой, основанной на сообщении об ошибке, которое отображается после отправки формы. Может быть, не поколение, а проверка его? О, ну есть и другие причины для этого сообщения, теперь я это вспомнил. Если страница не зарегистрирована должным образом, это также может произойти. Так что это может стать весьма конкретным. Для get_template_part() это просто функция темы, и, насколько мне известно, просто используйте ее только на главной странице. Я думаю, что ваш вариант включения отлично работает, и я не вижу причин его менять. Но это не убирает ошибку, верно?

      • 0
    • Include фактически удаляет ошибку, ошибка возникает только при использовании части шаблона get. В любом случае при просмотре исходного кода сгенерированной страницы все выглядит одинаково вплоть до одноразового номера.

      • 0
    • Смотрите мой обновленный ответ. Это проблема области, вызывающая сбой одноразового номера.

      • 0
    • @Ash G — только что снова проверил кодекс. Об ограничении речь не идет, но область применения шаблонная (не бэкэнд): «Загрузить часть шаблона в шаблон». codex.wordpress.org/Function_Reference/get_template_part

      • 0
    • Привет, Раст, я просмотрел это, но не нашел ничего, что могло бы это объяснить. Думаю, мне нужно копаться снова. Это должно быть там.

      • 0
    • Просто попробуйте загрузить файл с помощью load_template() и locate_template(), посмотрите, будет ли это иметь значение. Если что-то ломается в одной из этих функций, сначала нужно узнать, какая именно.

      • 0
    • После долгих копаний до сих пор нет никаких подсказок относительно того, что именно происходит, но я подозреваю, что это как-то связано с одноразовыми номерами.

      • 0
    • Удалось обойти это, просто используя биты шаблона, которые связаны с сохранением. Это работает нормально, пока я не попытался создать дочернюю тему. Дочерняя тема наследует все, но не сохраняет параметры. Похоже, вы просто не можете использовать get_template_part на бэкенде

      • 0
    • пренебрежение выше. Момент глупости… по моей глупости лишний пробел в названии темы в таблице стилей вызывал проблему

      • 0
    • Привет, спасибо за ответ, но не могли бы вы дать какой-то контекст? Должен ли я использовать это с get_template_part() или вместо?

      • 0
    • На самом деле, этот ответ не так уж и плох. Поскольку Эш указал использовать include (а не требовать), это альтернатива: include locate_template('sitewideSettings.php'); — преобразование в массив не требуется. Это найдет файл php с проверкой сначала в каталоге дочерней темы, а затем в родительской теме, сохраняя при этом контроль над областью действия и типом включения (include вместо require/_once).

      • 0
  2. Я знаю, вы говорите, что это не одноразовая проблема, но это явно так. Это уведомление является сообщением по умолчанию «Этот одноразовый номер не извлечен». Я не знаю точно, почему одноразовый номер терпит неудачу, но это то, что происходит.

    Я бы дважды проверил, как создаются и проверяются ваши одноразовые номера. Если вы используете wp_nonce_field(), убедитесь, что значения действия и значения аргумента совпадают. Кроме того, дважды проверьте правописание переменных или любые проблемы, связанные с областью действия, которые могут привести к сбою одноразового номера.

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

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

    • 0
  3. Пожалуйста, не используйте get_template_part() в Admin/Backend. Он был разработан для использования в шаблонах (отображение темы см. в кодексе ), поэтому он предназначен для использования в шаблонах и частях шаблонов в темах:

    Справочник по функциям/получить часть шаблона

    Загрузите часть шаблона в шаблон (кроме заголовка, боковой панели и нижнего колонтитула). Упрощает повторное использование темой разделов кода, что упрощает перегрузку дочерних тем.

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

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

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


    Обновлять:

    Если вы хотите загрузить php-файл в глобальную область видимости, просматривая каталоги дочерней и родительской тем, вы можете использовать функцию, которая выполняет поиск файла за вас: locate_template() :

    Получите имя существующего файла шаблона с наивысшим приоритетом.

    Поиск в STYLESHEETPATH ​​перед TEMPLATEPATH, чтобы темы, наследуемые от родительской темы, могли просто перегружать один файл.

    Для вашего примера включите include(TEMPLATEPATH."sitewideSettings.php"); это можно записать как:

    include(locate_template('sitewideSettings.php'));
    

    Это позволяет вам контролировать, где и как включается файл (include/_once; require/_cone), и предотвращает возникновение проблемы с областью действия в вашем примере, которая нарушает механизм NONCE.


    Сообщение «Пожалуйста, попробуйте еще раз» появляется, потому что wp-admin не может проверить запрос, а точнее так называемый nonce. Для этого может быть две причины: в запросе его нет (например, форма не предоставляет его или он не передается или не читается кодом администратора) или одноразовый номер недействителен. Nonces всегда представляет собой цепочку действий, и если эта цепочка разорвана, вы получите это сообщение. Но сообщение не говорит вам, где эта цепочка разорвана.

    Эти сообщения об ошибках в админке не всегда очень информативны и могут даже вводить в заблуждение (см. также: #14060 ). Чтобы выяснить, что здесь происходит, эффективнее всего отладить систему, в которой появляется ошибка, поскольку может быть довольно специфично, какая часть цепочки нарушена.

    Пожалуйста, ознакомьтесь с кодексом о том, как создавать страницы администрирования для вашей темы или плагина, для получения более подробной информации о одноразовых номерах, страницах администрирования и т. д. По какой-то причине запрос администратора не может проверить одноразовый номер.

    • 0
  4. Трудно угадать, это целая лестница функций. get_template_part() звонит locate_template(), который звонит load_template(), который делает require .

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

    • 0
  5. locate_template( array( 'sitewideSettings.php' ), true ) ?

    • 0
  6. Это более подробное объяснение первого ответа, т.е. «сфера — это ваша проблема».

    Моя простая визуализация get_template_part выглядит так:

    function get_template_part($slug) {
      require("$slug.php");
    }
    

    Итак, если у вас есть следующее в sitewideSettings.php:

    <?php
    echo $nonce;
    ?>
    

    Шаблон с включением:

    <?php
    $nonce = 'xxx';
    include('sitewideSettings.php');
    ?>
    

    Переводится (с помощью PHP) в:

    <?php
    $nonce = 'xxx';
    echo $nonce;
    ?>
    

    Шаблон с get_template_part:

    <?php
    $nonce = 'xxx';
    get_template_part('sitewideSettings');
    ?>
    

    Переводится на:

    <?php
    $nonce = 'xxx';
    get_template_part(
      echo $nonce;
    );
    ?>
    

    Так что теперь все в части шаблона обернуто внутри функции, и любые переменные, которые у вас есть в вашей части шаблона, нуждаются в global них.

    Таким образом, чтобы заставить его работать, вам нуженglobal файл в sitewideSettings.php, который будет переведен в:

    <?php
    $nonce = 'xxx';
    get_template_part(
      global $nonce;
      echo $nonce;
    );
    ?>
    
    • 0

Оставить ответ

You must login to add an answer.