Поддержка Проблемы и решения Отличия Unregister_setting() от Delete_option()

  • прочитал это https://truemisha.ru/blog/wordpress/option-pages.html

    оформляем в плагин, добавляем register_deactivation_hook, подключаем

    
    <?php
    /*
    Plugin Name: My New Plugin 2
    Version: 0.1
    */
    
    $true_page = 'gutp2.php'; // это часть URL страницы, рекомендую использовать строковое значение, т.к. в данном случае не будет зависимости от того, в какой файл вы всё это вставите
     
    /*
     * Функция, добавляющая страницу в пункт меню Настройки
     */
    function true_options() {
    	global $true_page;
    	add_options_page( 'Параметры1', 'Параметры2', 'manage_options', $true_page, 'true_option_page');  
    }
    add_action('admin_menu', 'true_options');
     
    /**
     * Возвратная функция (Callback)
     */ 
    function true_option_page(){
    	global $true_page;
    	?><div class="wrap">
    		<h2>Дополнительные параметры сайта</h2>
    		<form method="post" enctype="multipart/form-data" action="options.php">
    			<?php 
    			settings_fields('true_options'); // меняем под себя только здесь (название настроек)
    			do_settings_sections($true_page);
    			?>
    			<p class="submit">  
    				<input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />  
    			</p>
    		</form>
    	</div><?php
    }
     
    
    function untrue_option() {
     unregister_setting( 'true_options', 'true_options');
    // delete_option( 'true_options' ); // ОСНОВНОЙ ВОПРОС !!!
    }
    register_deactivation_hook( __FILE__ , 'untrue_option' );
    
    /*
     * Регистрируем настройки
     * Мои настройки будут храниться в базе под названием true_options (это также видно в предыдущей функции)
     */
    function true_option_settings() {
    	global $true_page;
    	// Присваиваем функцию валидации ( true_validate_settings() ). Вы найдете её ниже
    	register_setting( 'true_options', 'true_options', 'true_validate_settings' ); // true_options
    
    	// Добавляем секцию
    	add_settings_section( 'true_section_1', 'Текстовые поля ввода', '', $true_page );
     
    	// Создадим текстовое поле в первой секции
    	$true_field_params = array(
    		'type'      => 'text', // тип
    		'id'        => 'my_text',
    		'desc'      => 'Пример обычного текстового поля.', // описание
    		'label_for' => 'my_text' // позволяет сделать название настройки лейблом (если не понимаете, что это, можете не использовать), по идее должно быть одинаковым с параметром id
    	);
    	add_settings_field( 'my_text_field', 'Текстовое поле', 'true_option_display_settings', $true_page, 'true_section_1', $true_field_params );
     
    	// Создадим textarea в первой секции
    	$true_field_params = array(
    		'type'      => 'textarea',
    		'id'        => 'my_textarea',
    		'desc'      => 'Пример большого текстового поля.'
    	);
    	add_settings_field( 'my_textarea_field', 'Большое текстовое поле', 'true_option_display_settings', $true_page, 'true_section_1', $true_field_params );
     
    	// Добавляем вторую секцию настроек
     
    	add_settings_section( 'true_section_2', 'Другие поля ввода', '', $true_page );
     
    	// Создадим чекбокс
    	$true_field_params = array(
    		'type'      => 'checkbox',
    		'id'        => 'my_checkbox',
    		'desc'      => 'Пример чекбокса.'
    	);
    	add_settings_field( 'my_checkbox_field', 'Чекбокс', 'true_option_display_settings', $true_page, 'true_section_2', $true_field_params );
     
    	// Создадим выпадающий список
    	$true_field_params = array(
    		'type'      => 'select',
    		'id'        => 'my_select',
    		'desc'      => 'Пример выпадающего списка.',
    		'vals'		=> array( 'val1' => 'Значение 1', 'val2' => 'Значение 2', 'val3' => 'Значение 3')
    	);
    	add_settings_field( 'my_select_field', 'Выпадающий список', 'true_option_display_settings', $true_page, 'true_section_2', $true_field_params );
     
    	// Создадим радио-кнопку
    	$true_field_params = array(
    		'type'      => 'radio',
    		'id'      => 'my_radio',
    		'vals'		=> array( 'val1' => 'Значение 1', 'val2' => 'Значение 2', 'val3' => 'Значение 3')
    	);
    	add_settings_field( 'my_radio', 'Радио кнопки', 'true_option_display_settings', $true_page, 'true_section_2', $true_field_params );
    
     
    }
    add_action( 'admin_init', 'true_option_settings' );
     
    /*
     * Функция отображения полей ввода
     * Здесь задаётся HTML и PHP, выводящий поля
     */
    function true_option_display_settings($args) {
    	extract( $args );
     
    	$option_name = 'true_options';
     
    	$o = get_option( $option_name );
     
    	switch ( $type ) {  
    		case 'text':  
    			$o[$id] = esc_attr( stripslashes($o[$id]) );
    			echo "<input class='regular-text' type='text' id='$id' name='" . $option_name . "[$id]' value='$o[$id]' />";  
    			echo ($desc != '') ? "<br /><span class='description'>$desc</span>" : "";  
    		break;
    		case 'textarea':  
    			$o[$id] = esc_attr( stripslashes($o[$id]) );
    			echo "<textarea class='code large-text' cols='50' rows='10' type='text' id='$id' name='" . $option_name . "[$id]'>$o[$id]</textarea>";  
    			echo ($desc != '') ? "<br /><span class='description'>$desc</span>" : "";  
    		break;
    		case 'checkbox':
    			$checked = ($o[$id] == 'on') ? " checked='checked'" :  '';  
    			echo "<label><input type='checkbox' id='$id' name='" . $option_name . "[$id]' $checked /> ";  
    			echo ($desc != '') ? $desc : "";
    			echo "</label>";  
    		break;
    		case 'select':
    			echo "<select id='$id' name='" . $option_name . "[$id]'>";
    			foreach($vals as $v=>$l){
    				$selected = ($o[$id] == $v) ? "selected='selected'" : '';  
    				echo "<option value='$v' $selected>$l</option>";
    			}
    			echo ($desc != '') ? $desc : "";
    			echo "</select>";  
    		break;
    		case 'radio':
    			echo "<fieldset>";
    			foreach($vals as $v=>$l){
    				$checked = ($o[$id] == $v) ? "checked='checked'" : '';  
    				echo "<label><input type='radio' name='" . $option_name . "[$id]' value='$v' $checked />$l</label><br />";
    			}
    			echo "</fieldset>";  
    		break; 
    	}
    }
     
    /*
     * Функция проверки правильности вводимых полей
     */
    function true_validate_settings($input) {
    	foreach($input as $k => $v) {
    		$valid_input[$k] = trim($v);
     
    		/* Вы можете включить в эту функцию различные проверки значений, например
    		if(! задаем условие ) { // если не выполняется
    			$valid_input[$k] = ''; // тогда присваиваем значению пустую строку
    		}
    		*/
    	}
    	return $valid_input;
    }

    Вопросы.

    1. В чем отличия, в описании почти одно и тоже, только первая не работает. Тут http://onwp.ru/rabota-s-bazoj-dannyx/logika-raboty-s-tablicej-wp_options-v-wordpress.html прочитал что первая «вычеркивает», а вторая «удаляет». Не понятно назначение первой. В register_deactivation_hook в функции если вторая заремлена, то при деактивации плагина опция из настроек не удаляется.

    Дополнительные.

    2. Как на этапе формирования страницы опций воткнуть туда их дефолтные значения?
    3. Можно ли на этой странице добавить в начале например краткое описание (текст добавить)? проглядел, нашел
    4. Почему при добавлении опции используется хук add_action( ‘admin_init’, ‘true_option_settings’ );
    а не при register_activation_hook (и не хотят добавляться, если заменить)?
    5. Правильно ли, что все всамомделишные опции из этого примера записываются в одну (массив)? Доставать их потом по мере надобности (true_option_display_settings) довольно проблематично вижу. Есть ли более удобный\правильный способ?
    6. Много почитал про формирование настроек страницы опций для плагина. Единого мнения нет. Но сейчас вижу что в новых версиях WP уже есть инструменты для этого. Некоторые настаивают, чтобы опции плагина были в отдельных таблицах в БД + желательно отдельно каждая. Что думаете Вы?

    Спасибо.

    • Тема изменена 7 лет, 6 месяцев назад пользователем ☭Gu.
    • Тема изменена 7 лет, 6 месяцев назад пользователем ☭Gu.
Просмотр 7 ответов — с 1 по 7 (всего 7)
  • из всех статей взял, как мне кажется, оптимальную. кодекс пока не трогал, это «последняя инстанция» 🙂 только не направляйте сразу — https://codex.wordpress.org/%D0%9D%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0

    нужен ответ по тому, что выше.

    это, так понял устарело — http://dimio.org/pishem-plagin-dlya-wordpress-sozdanie-stranicy-nastroek-chast-3.html

    хотя бы мысли какие на эту тему?
    ну или если не на основной вопрос — по дополнительным тоже готов ответы услышать.

    • Ответ изменён 7 лет, 6 месяцев назад пользователем ☭Gu.
    • Ответ изменён 7 лет, 6 месяцев назад пользователем ☭Gu.

    я вообще не заморачиваюсь удалением опций, благо что пара сотен байт погоды не сделает.

    
    function cis_init() {
        $cis_options = array(); cis_setup();
        $cis_options['position'] = "bottomright";
        $cis_options['offsetx'] = "0";
        $cis_options['offsety'] = "0";
        $cis_options['orientation'] = "vertical";
        $cis_options['iconssize'] = "32";
        $cis_options['paddingx'] = "0";
        $cis_options['paddingy'] = "0";
        $cis_options['minwidth'] = "150";
        $cis_options['minheight'] = "150";
        $cis_options['reduce'] = "enabled";
        $cis_options['mobile'] = "enabled";
        $cis_options['iconshoverin'] = "zoomIn";
        $cis_options['iconshoverout'] = "zoomOut";
        $cis_options['iconshover'] = "brightness-more";
        $cis_options['imagehover'] = "sepia";
        $cis_options['netw'] = "facebook,twitter,google,pinterest,";
        $cis_options['theme'] = "default";
        $cis_options['dont_load_animatecss'] = "disabled";
        $cis_options['exclude'] = ".no-share";
        $cis_options['visibility'] = "disabled";
        $cis_options['iconstitle'] = "";
        $cis_options['shortlinks'] = "disabled";
    
        
        add_option('cis_options', $cis_options);
    }
    add_action('activate_cool-image-share/cool-image-share.php', 'cis_init');
    
    function cis_setup(){
        load_plugin_textdomain('cool-image-share');
    }
    add_action('init', 'cis_setup');
    

    это часть добавляет настройки при активации плагина.
    чтобы их читать выполняем:

    
    $cis_options = get_option('cis_options'); 
    

    ну а дальше смотрим, что и как:

    
    if($cis_options['mobile']=='disabled' and wp_is_mobile()) {return $content;}
    

    и все.

    PS вообще грохать настройки при деактивации плагина очень плохая идея. мало ли по каким причинам пользователь временно деактивировал плагин то?

    • Ответ изменён 7 лет, 6 месяцев назад пользователем Flector.
    • Ответ изменён 7 лет, 6 месяцев назад пользователем Flector.

    по поводу как воткнуть вот пример:

    
    <tr>
                    <th><?php _e("Orientation:", 'cool-image-share') ?></th>
                    <td>
                         <select name="orientation">
                            <option value="vertical" <?php if ($cis_options['orientation'] == 'vertical') echo "selected='selected'" ?>><?php _e("Vertical", "cool-image-share"); ?></option>
                            <option value="horizontal" <?php if ($cis_options['orientation'] == 'horizontal') echo "selected='selected'" ?>><?php _e("Horizontal", "cool-image-share"); ?></option>
                        </select>
                        <br /><small><?php _e("Display icons in the panel as a row or a column.", "cool-image-share"); ?> </small>
                    </td>
                </tr>
    

    код далеко не идеальный, но зато простой.

    привет.
    спасибо за детальный ответ, дорогой Flextor 🙂 Остальным списываю что заняты и Вас в пример ставлю 🙂

    >> ..что пара сотен байт погоды не сделает
    вот год после тестирования (новых\не новых\разных) плагинов — и базу сайта не узнать. и хз че удалять можно и что нельзя. думаю, что удалять обязательно нужно и желательно не допускать плагины в песочницу, которые за собой убирать не умеют.

    >> .. грохать настройки при деактивации плагина очень плохая идея
    полностью согласен. но это текст из примера статьи. оптимально, наверное так:

    
    if (function_exists('register_uninstall_hook')) register_uninstall_hook(__FILE__, 'my_uninstal_func');
    function my_uninstal_func() {
      delete_option('xxx..');
    ...
      delete_option('yyy..');
    }

    за код спасибо (вижу, тут редко кто им делится,…, не нетак, редко кто может им «оперировать», кроме основных отвечающих, это печально 🙁 ), постараюсь за выходные оттестить и отписАть результ.
    Хороших выходных.

    • Ответ изменён 7 лет, 6 месяцев назад пользователем ☭Gu.
    • Ответ изменён 7 лет, 6 месяцев назад пользователем ☭Gu.

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

    мне не нравится, когда плагины создают свои таблицы в базе данных, а потом при деинсталляции их не грохают. а один маленький текстовой массив — кому он помешает?

    впрочем, наверное вы правы и настройки надо удалять. но лень, если честно.

    Модератор Yui

    (@fierevere)

    永子

    один маленький текстовой массив — кому он помешает?

    еслт имеется ввиду массив в wp_options, а еще и помеченый как autoload = yes, то кушать память он будет, и время на запросы к БД увеличивать
    Разумеется если он один такой маленький, существенно это не изменит ничего, но бывает что таких накапливается много и очень много

    2 Fleсtor
    спасибо, помогло

    • Ответ изменён 7 лет, 6 месяцев назад пользователем ☭Gu.
Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Отличия Unregister_setting() от Delete_option()» закрыта для новых ответов.