Ошибка отправки формы с частью шаблона get()


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

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

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

include(TEMPLATEPATH."sitewideSettings.php");

Что прекрасно работает.

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

get_template_part('sitewideSettings');

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

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

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

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

(Это не проблема nonce, так как nonce создается в обоих экземпляры)

Author: hakre, 2010-09-14

5 answers

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

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

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

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

 6
Author: John P Bloch, 2010-11-10 13:53:51

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

Ссылка на функцию/получить часть шаблона

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

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

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

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


Обновление:

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

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

Выполняет поиск в ТАБЛИЦЕ СТИЛЕЙ перед ШАБЛОНОМ, чтобы темы, которые наследуют из родительской темы можно просто перегрузить один файл.

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

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

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


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

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

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

 4
Author: hakre, 2010-11-16 16:55:13

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

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

 0
Author: Rarst, 2010-09-14 07:05:05

locate_template( array( 'sitewideSettings.php' ), true )?

 0
Author: zeo, 2010-10-14 16:50:00

Это более подробное объяснение первого ответа, т.Е. "область действия - это ваша проблема"

Моя простая визуализация 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
Author: icc97, 2012-02-08 14:44:24