API настройки сетевых сайтов в WordPress: руководство

# Настройки API для сетевых сайтов (Multisite)

В WordPress существует специальный API, который позволяет легко создавать страницы настроек (опций), например, для плагинов или тем. Данные для этих опций хранятся в таблице настроек. API упрощает создание таких страниц, обеспечивая защиту и следуя логике WordPress. Это значит, что, используя API, не нужно заботиться о HTML коде и CSS стилях формы — все это берет на себя API.

Эта статья является дополнением к статье про настройки API и объясняет, как создать страницу настроек в разделе "Сетевые сайты" (админка мультисайта).

Когда вы активируете режим MU (Multisite), создается отдельный сайт с привычным интерфейсом администратора и секцией "Управление сетью", где настраивается вся сеть.

![Сетевой админ WordPress](https://via.placeholder.com/600x400?text=Network+Admin+Image)

Итак, по умолчанию API опций не предназначен для использования в сетевых настройках. Основная логика API может быть использована, но нужно учитывать некоторые нюансы, которые мы обсудим.

## Как использовать "Options API" WordPress на страницах администрирования сетевых сайтов (Multisite)

Когда я искал решения этой задачи с помощью Google, я часто сталкивался с неуклюжими и неэффективными подходами. Я предлагаю более удобное решение.

### Суть проблемы

В стандартной версии опция регистрируется с помощью функции register_setting(), и её значения отправляются через POST-запрос в файл /wp-admin/options.php. После этого WordPress выполняет всю работу за нас: извлекает, защищает, обрабатывает и сохраняет данные опций в таблице wp_options. Однако в мультисетевой сети опции нужно сохранять в другой таблице — wp_sitemeta, и для этого логика API не предназначена. 

Была создана задача по этому вопросу, но готового решения пока нет. Это не значит, что задача не решаема — на самом деле, её довольно легко решить. 

Запомните различия. В MU сборке WordPress опции для отдельного сайта обрабатываются функциями get_option() и update_option(), в то время как сетевые опции обрабатываются через get_network_option()/get_site_option() и update_network_option()/update_site_option().

Главное различие в том, что данные сохраняются в разных таблицах, и каждый сайт имеет свои собственные настройки, тогда как сетевые настройки общие для всех сайтов.

Чтобы не запутаться, я покажу различия на примере. Я продемонстрирую, как создается стандартная страница настроек и как создается аналогичная страница для сетевых настроек. Изменений в коде всего 10%.

### Стандартная страница настроек

```php

    

'; } if($opt_name === 'my_option_two'){ echo ''; } } // Очистка сохраненных данных function sanitize_callback($options){ foreach($options as $name => &$val){ if($name == 'my_option') $val = sanitize_text_field($val); if($name == 'my_option_two') $val = intval($val); } return $options; } ?>

В итоге мы получаем такую страницу настроек.

Страница настроек плагина

Аналогичная страница настроек для сетевых сайтов


    

'; } if($opt_name === 'my_option_two'){ echo ''; } } // Очистка сохраненных данных function sanitize_callback($options){ foreach($options as $name => &$val){ if($name == 'my_option') $val = sanitize_text_field($val); if($name == 'my_option_two') $val = intval($val); } return $options; } // СЕТЬ - обновление опций в базе данных function myplug_options_update(){ // Проверка nonce check_admin_referer('myplug_nonce'); update_site_option('option_name', wp_unslash($_POST['option_name'])); wp_redirect(network_admin_url('settings.php?page=myplug_slug&updated=true')); exit; } ?>

Таким образом, мы получаем такую страницу настроек:

Страница настроек сетевого плагина

Различия

Вот все различия, чтобы вам не пришлось искать их самостоятельно:

  1. Используется хук network_admin_menu вместо admin_menu для регистрации страницы опций.
  2. add_submenu_page('settings.php', ... вместо add_options_page(...) — создание подпункта в другом меню.
  3. <form action="edit.php?action=myplug_options" вместо <form action="options.php" — отправка POST-запроса в файл /network/edit.php.
  4. Используется wp_nonce_field() вместо settings_fields() — для защиты. Стандартная функция API здесь не подходит.
  5. Используется get_site_option() вместо get_option() — для сохранения опций в другой таблице.
  6. Добавлен хук network_admin_edit_(action) вместе с функцией myplug_options_update(), которая сохраняет наши опции с помощью update_site_option(). Для сети автоматический перехват запроса не работает.

Заключение

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

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *