Вопрос или проблема
Как следует из названия, при попытке программатически вставить несколько терминов, WordPress возвращает сообщение Ссылка, по которой вы следовали, истекла.
хотя значения PHP в .htaccess
и php.ini
были обновлены.
Код, пытающийся вставить термины, выглядит следующим образом:
add_action('init', function () {
$taxonomyName="category";
$states = [
"AK" => "Аляска",
"AL" => "Алабама",
"AR" => "Арканзас",
"AS" => "Американское Самоа",
"AZ" => "Аризона",
"CA" => "Калифорния",
"CO" => "Колорадо",
"CT" => "Коннектикут",
"DC" => "Округ Колумбия",
"DE" => "Делавэр",
"FL" => "Флорида",
"GA" => "Джорджия",
"GU" => "Гуам",
"HI" => "Гавайи",
"IA" => "Айова",
"ID" => "Айдахо",
"IL" => "Иллинойс",
"IN" => "Индиана",
"KS" => "Канзас",
"KY" => "Кентукки",
"LA" => "Луизиана",
"MA" => "Массачусетс",
"MD" => "Мэриленд",
"ME" => "Мэн",
"MI" => "Мичиган",
"MN" => "Миннесота",
"MO" => "Миссури",
"MS" => "Миссисипи",
"MT" => "Монтана",
"NC" => "Северная Каролина",
"ND" => "Северная Дакота",
"NE" => "Небраска",
"NH" => "Нью-Гэмпшир",
"NJ" => "Нью-Джерси",
"NM" => "Нью-Мексико",
"NV" => "Невада",
"NY" => "Нью-Йорк",
"OH" => "Огайо",
"OK" => "Оклахома",
"OR" => "Орегон",
"PA" => "Пенсильвания",
"PR" => "Пуэрто-Рико",
"RI" => "Род-Айленд",
"SC" => "Северная Каролина",
"SD" => "Южная Дакота",
"TN" => "Теннесси",
"TX" => "Техас",
"UT" => "Юта",
"VA" => "Вирджиния",
"VI" => "Виргинские острова",
"VT" => "Вермонт",
"WA" => "Вашингтон",
"WI" => "Висконсин",
"WV" => "Западная Вирджиния",
"WY" => "Вайоминг",
];
foreach ($states as $slug => $name) {
wp_insert_term($name, $taxonomyName, [
'slug' => $slug,
]);
}
}, 999);
Значения в .htaccess
и php.ini
следующие:
max_execution_time 5000
max_input_time 5000
max_input_vars 5000
memory_limit 1000M
post_max_size 750M
session.gc_maxlifetime 1440
upload_max_filesize 750M
Что я упустил?
Ответ или решение
Ошибка "The link you followed has expired" в WordPress, обычно связана с ограничениями, установленными в конфигурационных файлах PHP, и возникает при попытке управлять сроком выполнения скриптов или чрезмерно больших загрузках данных. Хотя вы уже обновили значения в файлах .htaccess
и php.ini
, все же проблема сохраняется. Давайте рассмотрим возможные причины и решения для устранения этой ошибки.
Теория
Когда PHP-скрипт выполняется в течение длительного времени, сервер может прервать его выполнение, если он превышает установленные лимиты на выполнение или работу с входными данными. Это объясняет, почему изменение max_execution_time
или max_input_time
может быть критично. Однако, несмотря на значительное увеличение этих параметров, ошибка все еще возникает. Скорее всего, это связано с тем, что ваши изменения не вступили в силу по ряду причин:
-
Неправильная конфигурация Apache или PHP:
- Изменения, внесенные в
.htaccess
иphp.ini
, могут не влиять на текущую версию PHP, используемую вашим сервером. Например, если ваш хостинг использует специфичную систему управления, как это бывает в некоторых панелях (например, cPanel), изменения могут быть локализованы в другом файле конфигурации.
- Изменения, внесенные в
-
Кеширование конфигурации:
- Некоторые серверы могут кешировать конфигурационные параметры. Перезапуск сервера или перезагрузка PHP может помочь во вступлении изменений.
-
Ограничение со стороны хостинга:
- Некоторые хостинг-провайдеры устанавливают жесткие лимиты на выполнение скриптов, которые вы не можете увеличить без перехода на более премиум-уровень услуги.
Пример
Расмотрим код, представленный в вашем вопросе:
add_action('init', function () {
$taxonomyName = "category";
$states = [ /* список штатов */ ];
foreach ($states as $slug => $name) {
wp_insert_term($name, $taxonomyName, [
'slug' => $slug,
]);
}
}, 999);
Этот код вставляет множество терминов в таксономию "category". Потенциально, выполнение такой операции через init
может вызывать истощение ресурса, вызывая проблему. Даже при увеличенных лимитах в PHP, такие массовые операции следует проводить с осторожностью.
Применение
Что можно сделать в вашей ситуации:
-
Проверка конфигурации PHP:
- Убедитесь, что ваши изменения в файлах
.htaccess
иphp.ini
действительно изменяют конфигурацию. Вы можете создать тестовый PHP-файл с вызовомphpinfo()
и распечатать все текущие настройки PHP, чтобы убедиться, что изменения видны и применимы.
- Убедитесь, что ваши изменения в файлах
-
Оптимизация кода:
- Разделите ваши операции добавления терминов так, чтобы они выполнялись в несколько этапов. Вместо того чтобы добавлять все состояния за один раз, используйте крон-задачи или разделите нагрузку на несколько транзакций.
-
Обновление и перезагрузка:
- Перезапустите ваш веб-сервер или службу PHP-FPM, чтобы изменения в конфигурации вступили в силу.
-
Журналирование и отладка:
- Добавьте журналирование в ваш код, чтобы определять, где именно процесс может занимать слишком много времени. Это позволит понять, какие операции требуют больше времени и ресурсов.
-
Связь с хостинг-провайдером:
- Если изменения ни к чему не привели, свяжитесь с вашим хостинг-провайдером для получения информации о возможных ограничениях на уровне сервера.
-
Рассмотрение альтернативных решений:
- Посмотрите, возможно ли использовать WP-CLI для массовых операций с терминами. WP-CLI работает в командной строке и позволяет выполнять многие задачи без ограничения времени PHP.
Применение вышеуказанных рекомендаций и тщательное изучение конфигурационных файлов и системного окружения поможет вам устранить проблему с истекшей ссылкой в WordPress. Это позволит вашему коду работать эффективно и устойчиво в долгосрочной перспективе.