Woocommerce 集成设置 API

Posted

技术标签:

【中文标题】Woocommerce 集成设置 API【英文标题】:Woocommerce Integration Settings API 【发布时间】:2017-03-16 19:39:27 【问题描述】:

我不确定这是否需要在 WooCommerce、Wordpress 或 php 问题中进行,我也不知道该怎么称呼它,因为我不知道出了什么问题,但希望你们中的一个聪明人可以帮帮我。

我正在进行 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() 的预期输出现在应该是“否”。但是,它仍然显示“是”。

然后,当我刷新页面时,test_function() 的结果是正确的并且它回显“否”,但只有在我刷新页面之后。请问有人能解释一下这个问题吗?

我正在我的插件文件中正确初始化插件。不知道我是否也需要包括在内?

更新:

我更新了上面的代码,以反映 Magnavode 回答后的更改。现在的问题是保存后值是正确的,但在页面重新加载后消失了。

【问题讨论】:

这快把我逼疯了。我检查了数据库,更改立即反映在那里。那么 _construct 函数从哪里获取数据呢?我在 _construct 函数中放置的任何“get_option()”都会返回旧值,并且仅在刷新页面后才显示新值。我放在“admin_options()”函数中的任何“get_option()”都会在保存时立即显示正确/预期的结果。有人吗?请帮助我保持理智。 【参考方案1】:

您遇到的错误是因为在调用您的构造函数时尚未调用 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'));

希望对你有帮助。

【讨论】:

我已经为此苦苦挣扎了三天!谢谢。我添加了您建议的 process_admin_options() 函数,并在我的课堂上调用了该函数,并将 admin_options() 函数更改为您的建议。现在工作!非常感谢:) 不。我说得太早了。该值在保存时确实会发生变化,但是一旦您离开页面或刷新它,这些值就会被丢弃并且变量是空的......:-/ process_admin_options 只有在需要处理实际发布数据时才应调用。通过单击保存更改删除该行并重置值。 也可以使用add_action( 'woocommerce_update_options_integration_' . $this->id, array( $this, 'process_admin_options' ) );,这样您在使用多个集成插件时就不会遇到同样的问题。 嗨。非常感谢您尝试提供帮助。就像我在上面的代码中所说的那样。如果我从构造函数中删除 $this->process_admin_options ,那么我会回到旧的行为,这就是我想要修复的。如果我添加该行,那么它会保存但会在页面刷新时被清除,所以无论哪种方式我仍然没有得到接受的结果。【参考方案2】:

我的目标是根据另一个值显示/隐藏一些设置。由于默认情况下init_form_fields()process_admin_options() 之前调用,因此在保存设置后显示/隐藏无法正常工作,但在重新加载设置页面后。我已经通过覆盖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
    


【讨论】:

【参考方案3】:

我确定这不是解决问题的方法,但我别无选择,直到有人能进一步阐明这一点。

我最终在 admin_options() 函数中添加了以下内容:

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

如果两个(完全相同!!!)变量不匹配,这会强制页面重新加载。显然它需要检查所有选项,但这是基本思想。

【讨论】:

更好的解决方案是使用 header('Location: '.$_SERVER['REQUEST_URI']);比标题(“刷新:0”);。这样刷新就不明显了。

以上是关于Woocommerce 集成设置 API的主要内容,如果未能解决你的问题,请参考以下文章

更新woocommerce后,woocommerce文件夹中的文件(与主题集成)无法正常工作

woocommerce 和 printful 集成

WooCommerce 支付网关与 PayPal 等外部页面的集成

Woocommerce Paypal REST api 与 React JS 的集成

WooCommerce 自定义支付网关集成不执行 POST

php WooCommerce集成演示