Как обернуть html вокруг API настроек добавить раздел настроек ()
Я пишу плагин и в настоящее время внедряю свое меню администратора с помощью API настроек wordpress . Как всегда с API, это в определенной степени облегчает программирование, но, похоже, у меня проблема:
Мне нужно обернуть пользовательский html вокруг этих разделов. Например, я хочу обернуть элементы формы вокруг набора полей или расположить логические единицы в два столбца с помощью CSS (float: справа, float: слева). Для этого мне нужно упаковать эти секции в контейнер.
Это функция API, которая повторяет разделы.
function do_settings_sections( $page ) {
global $wp_settings_sections, $wp_settings_fields;
if ( ! isset( $wp_settings_sections[$page] ) )
return;
foreach ( (array) $wp_settings_sections[$page] as $section ) {
if ( $section['title'] )
echo "<h3>{$section['title']}</h3>\n";
if ( $section['callback'] )
call_user_func( $section['callback'], $section );
if ( ! isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section['id']] ) )
continue;
//MY WRAPPING NEEDS TO START HERE
echo '<table class="form-table">';
do_settings_fields( $page, $section['id'] );
echo '</table>';
//AND END HERE!
}
}
Насколько я правильно прочитал источник, нет способа обернуть вокруг него пользовательский html (только раньше, с помощью параметра add_settings_section ($id, $title, $обратный вызов, $страница) $обратный вызов).
Итак, как бы вы решили эту проблему? Должен ли я просто ввести соответствующие контейнеры в глобальные разделы $wp_settings_sections (с помощью обычного крючка я напишу div, а затем в последнем поле каждого параметра я могу закрыть контейнер с помощью /div. Но это очень, очень уродливый обходной путь, и он, мягко говоря, отталкивает!
Должен ли я отказаться от идеи использования API great settings?
2 answers
Я только что столкнулся с этой же проблемой сам в проекте, над которым я сейчас работаю.
По сути, я разбил свои настройки на группы, чтобы затем их можно было отобразить в виде отдельного раздела(разделов):
<?php
class MyPluginSettings
{
/**
* Constructor.
*
* @return void
* @access public
*/
public function __construct()
{
add_action('admin_menu', array($this, 'myPluginSettingsMenu'));
}
/**
* Register our admin settings menu/page.
*
* @return void
* @access public
*/
public function myPluginSettingsMenu()
{
add_options_page(
__('My Plugin Settings', TXTDMN),
__('My Plugin', TXTDMN),
'manage_options',
'my-plugin-settings',
array($this, 'myPluginSettingsPage')
);
add_action('admin_init', array($this, 'registerMyPluginSettings'));
}
/**
* Create the admin settings page.
*
* @return void
* @access public
*/
public function myPluginSettingsPage()
{
?>
<div class="wrap">
<h2><?php _e('My Plugin Settings', TXTDMN); ?></h2>
<hr>
<p class="howto"><?php _e('<strong class="label">Ahem:</strong> Introductory text/message/warning, etc.', TXTDMN); ?></p>
<form action="options.php" method="post">
<?php settings_fields('my-plugin-settings-group'); ?>
<!-- CUSTOM STYLABLE SECTION #1 -->
<div class="my-plugin-options section general">
<?php do_settings_sections('my-plugin-general-settings'); ?>
</div>
<!-- CUSTOM STYLABLE SECTION #2 -->
<div class="my-plugin-options section special">
<?php do_settings_sections('my-plugin-special-settings'); ?>
</div>
<!-- CUSTOM STYLABLE SECTION #3 -->
<div class="my-plugin-options section misc">
<?php do_settings_sections('my-plugin-miscellaneous-settings'); ?>
</div>
</form>
</div>
<?php
}
/**
* Register all of our sections.
*
* @return void
* @access public
*/
public function registerMyPluginSettings()
{
$this->myPluginGeneralSection();
$this->myPluginSpecialSection();
$this->myPluginMiscellaneousSection();
}
/**
* My Plugin general options.
*
* @return void
* @access public
*/
private function myPluginGeneralSection()
{
...
}
/**
* My Plugin special options.
*
* @return void
* @access public
*/
private function myPluginSpecialSection()
{
...
}
/**
* My Plugin miscellaneous options.
*
* @return void
* @access public
*/
private function myPluginMiscellaneousSection()
{
...
}
}
Надеюсь, это поможет и будет иметь для вас смысл:)
Удачи.
То, что работает для меня только для стилей css или сценариев js, - это использование admin_enqueue_scripts:
function my_plugin_enqueue($hook) {
if ( 'settings_page_my-plugin/my-plugin' != $hook ) {
return;
}
wp_register_style( 'my_plugin_admin_css', plugin_dir_url( __FILE__ ) . 'css/my_style_admin.css', false, '1.0.0' );
wp_enqueue_style( 'my_plugin_admin_css' );
}
add_action( 'admin_enqueue_scripts', 'my_plugin_enqueue' );
И с помощью if ('bla bla bla' != $hook)
вы просто return
перед любой постановкой в очередь, если это не ваша страница параметров плагина.
$hook
похоже, это то, что отправляется на обратный вызов в вызове add_action
, и я получил его значение для этой конкретной страницы параметров плагина, просто добавив print_r($hook)
на страницу параметров плагина для одной загрузки и вытащил его из браузера.
Меньше хакерский способ сделать это - записать в файл с такой функцией, как:
//For Testing
function write_to_file($message){
$handle = fopen("/Applications/MAMP/logs/some_file_name.txt", "a+");
fwrite($handle, "\nMessage:\t " . $message);
fclose($handle);
}
Который будет использоваться:
write_to_file($message);
И вы избежали бы уродливых сообщений о том, что заголовок уже написан.