Woocommerce 集成设置 API
Woocommerce Integration Settings API
我不太确定这是否需要在 WooCommerce、Wordpress 或 PHP 问题中进行,我也不知道该怎么称呼它,因为我不知道出了什么问题,但是希望你们中的一个 braniacs 可以在这里帮助我。
我正在进行 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;
问题是当我将 select 选项更改为是/否时,更改只会在我重新加载页面后反映出来。
换句话说,假设 select 选项设置为 "yes"。我将其更改为 "no",然后单击保存按钮并重新加载页面。表格显示 "no" 现在被 selected,var_dump() 的值是 "string 'no' (length=2)"。 text_function() 的预期输出现在应该是 "no"。但是,它仍然显示 "yes".
然后,当我刷新页面时,test_function() 的结果是正确的,它与 "no" 相呼应,但只有在我刷新页面之后。谁能解释一下这个问题?
我正在我的插件文件中正确初始化插件。不知道我是否也需要包括它?
更新:
我已经更新了上面的代码以反映我在 Magnavode 的回答后所做的更改。现在的问题是保存后值是正确的,但在页面重新加载后又消失了。
我确定这不是解决问题的方法,但我别无选择,直到有人能进一步阐明这一点。
我最终将以下内容添加到 admin_options() 函数中:
if($this->test_select !== $this->get_option('test_select')) {
header("Refresh:0");
}
如果两个(完全相同!!!)变量不匹配,这会强制重新加载页面。显然它需要检查所有选项,但这是基本思想。
您遇到的错误是因为在您的构造函数被调用时 process_admin_options() 尚未被调用,因此 posted 表单尚未保存到数据库中然而。导致 get_option 检索旧值。
您可以在处理完 post 数据后再次设置 class 变量来修复它。像这样覆盖 process_admin_options:
public function process_admin_options() {
parent::process_admin_options();
$this->test_select = $this->get_option('test_select');
}
或者完全删除 class 变量,每次只调用 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'));
}
希望对您有所帮助。
我的目标是 show/hide 某些设置取决于另一个值。由于默认情况下 init_form_fields()
在 process_admin_options()
之前调用,因此 show/hide 在保存设置后无法正常工作,但在重新定位设置页面后。我已经通过覆盖 process_admin_options()
:
实现了目标
public function process_admin_options() {
$saved = parent::process_admin_options();
$this->init_form_fields();
return $saved;
}
并添加 init_settings()
对 init_form_fields()
的调用:
public function init_form_fields() {
$this->init_settings();
$this->form_fields = [];
if ( ! empty( $this->settings['one'] ) ) {
// build a depending settings
}
}
我不太确定这是否需要在 WooCommerce、Wordpress 或 PHP 问题中进行,我也不知道该怎么称呼它,因为我不知道出了什么问题,但是希望你们中的一个 braniacs 可以在这里帮助我。
我正在进行 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;
问题是当我将 select 选项更改为是/否时,更改只会在我重新加载页面后反映出来。
换句话说,假设 select 选项设置为 "yes"。我将其更改为 "no",然后单击保存按钮并重新加载页面。表格显示 "no" 现在被 selected,var_dump() 的值是 "string 'no' (length=2)"。 text_function() 的预期输出现在应该是 "no"。但是,它仍然显示 "yes".
然后,当我刷新页面时,test_function() 的结果是正确的,它与 "no" 相呼应,但只有在我刷新页面之后。谁能解释一下这个问题?
我正在我的插件文件中正确初始化插件。不知道我是否也需要包括它?
更新:
我已经更新了上面的代码以反映我在 Magnavode 的回答后所做的更改。现在的问题是保存后值是正确的,但在页面重新加载后又消失了。
我确定这不是解决问题的方法,但我别无选择,直到有人能进一步阐明这一点。
我最终将以下内容添加到 admin_options() 函数中:
if($this->test_select !== $this->get_option('test_select')) {
header("Refresh:0");
}
如果两个(完全相同!!!)变量不匹配,这会强制重新加载页面。显然它需要检查所有选项,但这是基本思想。
您遇到的错误是因为在您的构造函数被调用时 process_admin_options() 尚未被调用,因此 posted 表单尚未保存到数据库中然而。导致 get_option 检索旧值。
您可以在处理完 post 数据后再次设置 class 变量来修复它。像这样覆盖 process_admin_options:
public function process_admin_options() {
parent::process_admin_options();
$this->test_select = $this->get_option('test_select');
}
或者完全删除 class 变量,每次只调用 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'));
}
希望对您有所帮助。
我的目标是 show/hide 某些设置取决于另一个值。由于默认情况下 init_form_fields()
在 process_admin_options()
之前调用,因此 show/hide 在保存设置后无法正常工作,但在重新定位设置页面后。我已经通过覆盖 process_admin_options()
:
public function process_admin_options() {
$saved = parent::process_admin_options();
$this->init_form_fields();
return $saved;
}
并添加 init_settings()
对 init_form_fields()
的调用:
public function init_form_fields() {
$this->init_settings();
$this->form_fields = [];
if ( ! empty( $this->settings['one'] ) ) {
// build a depending settings
}
}