Поддержка Проблемы и решения помогите вставить опцию в плагин

  • есть некий плагин, с минимум опций. опции в нем сохраняются средствами WP так:

    ...
    <form method="post" enctype="multipart/form-data" action="options.php">
    ...
    <?php settings_fields($plugin_option); do_settings_sections($plugin_page); ?>
    <input type="submit" class="button-primary" name = "ButSave" id = "iButSave" value="<?php echo __('Save',$plugin_option); ?>" >
    /form>
    ...
    functions My() { ... некие действия ...};
    ....

    Нужно: вставить (в перспективе заменить) кнопу Save на свою, которая бы перед сохранением настроек выполняла бы мою функцию My. (Просьба не предлагать сделать свою опцию одной из опций плагина, интересен другой момент).

    Почитав про action понимаю, что любая кнопа, добавленная с type=»submit» в этой форме функцию My() не выполнит, так?

    сначала добавил свою форму перед формой сохранения, кнопу в ней и реакцию на нее:

    ...
    <?php
    if(@$_POST['MySave']) {My(); }
    ?> <br/><br/>
    <form method="post">
    <input type = "submit" class="button-primary" name = "MySave" id = "iMySave" ?>" value = "<?php echo __('MySave',$v_gusoft_plugin_option) ?>">> 
    <input type="checkbox" name="MyCh" id="iMyCh" value="My" checked="checked"> MyCheckbox
    </form>
    ...

    Это работает, но настройки плагина не сохраняются.
    Погуглив, объединил формы, убрал action из заголовка формы и перенес в кнопку Save (formaction), переделал форму на

    ...
    <form method="post" enctype="multipart/form-data" >
    ...
    <?php settings_fields($plugin_option); do_settings_sections($plugin_page); ?>
    <input type="submit" class="button-primary" name = "MySave" id = "iMySave" value="<?php echo __('MySave',$plugin_option); ?>" >
    <input type="submit" class="button-primary" formaction="options.php" name = "ButSave" id = "iButSave" value="<?php echo __('Save',$plugin_option); ?>" >
    /form>
    ...
    functions My() { ... некие действия ...};
    ....

    Теперь работает и сохранение опций плагина и моя кнопа отдельно.

    Вопрос — как
    — либо в функции My() (после необходимых действий) вызвать нажатие кнопки Save
    — либо в ней каким то образом вызвать обработчик action=»options.php»

    Еще раз: требуется убрать кнопку Save, оставив MySave, которая бы сначала выполняла функцию My(), а затем вызывала штатный обработчик WP по сохранению опций плагина.

    Или др. идеи.

    Спасибо.

    • Тема изменена 7 лет, 6 месяцев назад пользователем ☭Gu.
    • Тема изменена 7 лет, 6 месяцев назад пользователем ☭Gu.
    • Тема изменена 7 лет, 6 месяцев назад пользователем ☭Gu.
Просмотр 10 ответов — с 1 по 10 (всего 10)
  • вам давно надо было бы взять какой-нибудь подходящий плагин и вырезать оттуда куски нужного вам кода.

    
    if (isset($_POST['submit'])) {
        $cis_options = get_option('cis_options');
        $cis_options['position'] = $_POST['position'];
        update_option('cis_options', $cis_options);
        //тут ваша функция
    }
    

    спасибо, это я видел.
    но проблема в том, что опции созданы и отображаются «правильным способом», т.е. через

    settings_fields($plugin_option); do_settings_sections($plugin_page);

    и последующую обработку через option.php, а ваше решение предполагает свою обработку. так что вопрос все еще актуален.

    Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Возможно, поможет фильтр pre_update_option.

    интересная идея, затестил.
    эта штука отлично работает в варианте Flector, но в моем варианте, вызываемая из глубин option.php, работает «не так, как надо».
    сама функция отрабатывает, но все попытки из нее что то вывести (echo и проч), выводят текст до обновления страницы.

    еще идеи?

    попутный вопрос.
    где применить опции? ну т.е. вот опции заданы, где по ним «пройтись» и задействовать непосредственные функции, за каждую опцию отвечающие?
    pre_update_option из решений выше вроде как подходит идеально, но.. что то не то.
    вот нет этой функции, задал я опции в плагине, нажал Save (не Flector’a решением, а обычным (и Дениско нет)), они сохранились. …мм а где тогда, я могу узнать:
    — что опции обновлены
    — если переделаны — применить — т.е. запустить процедуру, кот. в зависимости от опций те или иные функции, хуки и тд задействует?

    вопрос не понятен.
    в каждой своей функции в начале читаете опции и потом уже в этих функциях делаете то, что вам надо в соответствии с прочитанными опциями.

    спасибо за ответ.
    .. так, это подробней позже, надо обдумать еще.

    ++ вопрос

    вот у формы \ кнопки есть action=»options.php» \ formaction=»options.php»
    (**)

    поизучал стандартный wp-includes\options.php (его вызываем?), не вижу там кода, который бы обрабатывал (**). может какая-то конкретная функция вызывается? или что-то из include options-*.php? 🙁

    тогда можно было бы сделать что-то типа

    action=»my_options.php» \ formaction=»my_options.php»

    а в my_options.php

    <?php
    // тут делаем что нужно
    wp_user_settings(); // например. не знаю кто там сохраняет всю ботву из settings_fields ($plugin_option); везде только примеры, без разбирательств механизма работы :(
    ?>

    что думаете?

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

    а зачем вам вообще через options.php что-либо делать?

    1. разобраться хочу
    2. это вроде как официальный рекомендуемый метод

    где и кем рекомендуемый то?

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Тема «помогите вставить опцию в плагин» закрыта для новых ответов.