Достаточно часто сталкиваемся с ситуацией, когда что-то нарушает структуру постоянных ссылки на всех сайтах в сети 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(); }
На этом всё. Спасибо.