2016-11-03 3 views
0

Я не уверен, нужно ли это делать в вопросах WooCommerce, Wordpress или PHP, я также не знаю, как это назвать, поскольку я понятия не имею, что происходит не так, но, надеюсь, один из вас, браначары, могут помочь мне здесь.API-интерфейс интеграции интеграции Woocommerce

Я занимаюсь интеграцией WooCommerce. Вот мой код (урезанный для удобства чтения):

if (! class_exists('WC_My_Integration')) : 

    class WC_My_Integration extends WC_Integration { 

    public function __construct() { 

     global $woocommerce; 

     $this->id = 'my_id'; 
     $this->method_title  = __('My Title', 'my-text-domain'); 

     $this->test_select = $this->get_option('test_select'); 

     $this->init_form_fields(); 

     add_action('woocommerce_update_options_integration', array(&$this, 'process_admin_options')); 
     // If I don't do this the changes aren't showing immediately 
     $this->process_admin_options(); 
     var_dump($this->test_select); // Returns correct result on save, but then disappears after page reload 
    } 

    public function init_form_fields() { 
     $this->form_fields = array(
      'test_select' => array(
       'title'  => __('Test Select', 'my-text-domain'), 
       'type'  => 'select', 
       'options'  => array(
        'yes' => 'Yes', 
        'no' => 'No' 
       ) 
      ), 
     ); 
    } 

    public function test_function() { 
     if('yes' === $this->test_select) { 
      echo "Yes"; 
     } else { 
      echo "No"; 
     } 
    } 

    public function process_admin_options() {  
     parent::process_admin_options(); 

     $this->test_select = get_option('test_select'); 
    } 

    public function admin_options() { 
     parent::admin_options(); 

    } 
} 
endif; 

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

Таким образом, предположим, что для параметра выбора установлено значение «да». Я меняю его на «нет», нажмите кнопку «Сохранить» и перезагрузка страницы. Форма показывает, что теперь выбрано «no», а значение var_dump() - «string» no '(length = 2) ». Ожидаемый вывод text_function() теперь должен быть «no». Однако он все еще показывает «да».

Затем, когда я обновляю страницу, результат test_function() верен, и он перекликается с «нет», но только после обновления страницы. Может ли кто-нибудь пролить свет на этот вопрос, пожалуйста?

Я инициализирую плагин правильно в своем файле плагина. Не знаю, нужно ли мне это включать?

Update:

Я обновил код выше, чтобы отразить мои изменения после ответа Magnavode в. Проблема заключается в том, что после сохранения сохраняются значения, а затем исчезают после перезагрузки страницы.

+0

Это сводит меня с ума. Я проверил базу данных, и изменения тут же отразились. Итак, где функция _construct получает данные? Любые «get_option()», которые я вставляю в функцию _construct, возвращают старые значения и отображают только новые, как только я обновляю страницу. Любой «get_option()», который я ввел в функцию «admin_options()», сразу показывает правильный/ожидаемый результат при сохранении. Кто-нибудь? Пожалуйста, помогите мне сохранить то, что осталось от моего здравомыслия. –

ответ

0

Я уверен, что это не способ сделать это, но у меня нет выбора, пока кто-то не сможет пролить свет на это. Функция

Я в конечном итоге добавив следующее в admin_options():

if($this->test_select !== $this->get_option('test_select')) { 
    header("Refresh:0"); 
} 

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

+0

Лучшим решением является скорее заголовок ('Location:'. $ _ SERVER ['REQUEST_URI']); чем заголовок («Обновить: 0») ;. Таким образом, обновление не заметно. –

0

Ошибка, с которой вы столкнулись, заключается в том, что в то время, когда ваш конструктор называется process_admin_options() еще не был вызван, и поэтому опубликованная форма еще не была сохранена в базе данных. Вызов get_option для возврата старого значения.

Вы можете исправить это, установив переменные класса снова после обработки данных сообщения. Переписать process_admin_options как так:

public function process_admin_options() { 
    parent::process_admin_options(); 

    $this->test_select = $this->get_option('test_select'); 
} 

Или понижая переменные класса вообще и просто звоню get_option каждый раз, когда вместо этого.

Также вы должны перезаписать init_form_fields() и перенести свои поля формы.

Также ваш admin_options() скрывает родительский admin_options(). Используйте вместо этого:

public function admin_options() { 
    parent::admin_options(); 

    var_dump($this->test_select); 
    var_dump($this->get_option('test_select')); 
} 

Я надеюсь, что это помогает.

+0

Я боролся с этим в течение трех дней подряд! Благодарю. Я добавил функцию process_admin_options(), которую вы предложили, и вызвал ее в моем классе и изменил функцию admin_options() на ваше предложение. Работает сейчас! Большое спасибо :) –

+0

Добро пожаловать: D – Magnavode

+0

Нет. Я говорил слишком рано. Значение изменяется при сохранении, но как только вы переходите от страницы или обновляете его, значения отбрасываются, а переменные пустые ...: -/ –

Смежные вопросы