Достаточно часто сталкиваемся с ситуацией, когда что-то нарушает структуру постоянных ссылки на всех сайтах в сети WordPress (Multisite установка), например, когда происходит ошибка активацией плагина по всей сети.
На одном сайте из сети это достаточно легко исправить, вручную зайдя в Настройки → Постоянные ссылки, в результате чего будут сброшены и восстановлены правила перезаписи, но если в сети несколько десятков сайтов, то это уже не практично и нужен способ сделать это автоматически для всех сайтов.
Типичный подход
Большинство попыток, которые мы видели, работали примерно так:
/*
* Это пример НЕПРАВИЛЬНОГО способа сбросить постоянные ссылки, не используйте его!
* Используйте лучший способ, описанный ниже.
*/
function wplb_wrong_flush_rewrite_rules_on_multisite() {
global $wp_rewrite;
$sites = wp_get_sites( array( 'limit' => false ) );
foreach ( $sites as $site_id ) {
switch_to_blog( $site_id );
$wp_rewrite->init();
flush_rewrite_rules(); // Нельзя так делать после вызова switch_to_blog().
restore_current_blog();
}
$wp_rewrite->init();
}
Функция отработает для основных типов записей POST и PAGE, но никак не повлияет на работу пользовательских типов записей CPT, а всё потому, что в работе функции switch_to_blog() есть несколько ограничений, и плагины – одна из таких вещей.
Если Вы используете мультисайт и у Вас есть пользовательские типы записей (CPT), которые регистрируются с помощью сторонних плагинов, то использование функции flush_rewrite_rules() бессмысленно!
Лучший способ
Достаточно просто удалить значение опции rewrite_rules, так как она будет автоматически сгенерирована заново при следующей загрузке сайта.
$sites = get_sites( array(
'number' => 10000,
'public' => 1,
'deleted' => 0,
) );
foreach ( $sites as $site ) {
switch_to_blog( $site->blog_id );
delete_option( 'rewrite_rules' );
restore_current_blog();
}
На этом всё. Спасибо.