为什么来自类实例的操作回调函数总是从一个实例调用相同的函数?

时间:2019-04-01 作者:csaborio

我有一个类,其构造函数如下:

public function __construct( $content_type, $filter_fields, $meta_query = \'\', $taxonomy = \'\') {
        if ( !empty ( $content_type ) ) {
          add_action(\'wp_ajax_myfilter\', array($this, \'filter_function\'));
          add_action(\'wp_ajax_nopriv_myfilter\', array($this, \'filter_function));
...
我创建了该类的两个实例,如下所示(filter\\u list是一个数组,其中包含与此目的无关的属性)

    global $filter_builder;

    foreach ($filter_list as $filter ) {
        $filter_builder[$filter[\'content_type\']] = new FilterBuilder( 
            $filter[ \'content_type\' ], $filter[ \'filter_fields\' ], $filter[\'meta_query\'], $filter[\'taxonomy\']
        );
    }
实例创建正确,一切正常,直到进行ajax调用并调用回调函数“filter\\u function”。理论上,每个实例在创建时都有自己的回调函数,但是,每次进行ajax调用时,都会调用全局数组的第一个实例的函数。

全局数组有两个实例,当我尝试调试回调时,似乎对这两个实例调用了相同的回调。

即使回调具有相同的名称,也不会有什么不同。我创建了一个匿名函数,这种奇怪的行为还在继续。

我有什么遗漏吗?回调函数取决于调用时的内容类型,并且它始终默认为数组中首先定义的post类型。

以下是简化的实例创建,以防有所帮助:

    $filter_list = array(
        array(
            \'content_type\' => \'event\',
            \'filter_fields\' => array(
                // Text to Display => Field Name
                \'Suburb\' => \'city\',
                \'Postal Code\' => \'zip\',
            ),
            \'meta_query\' => \'\',
            \'taxonomy\' => \'\',
        ),
        array(
            \'content_type\' => \'contact_center\',
            \'filter_fields\' => array(
                // Text to Display => Field Name
                \'Suburb\' => \'suburb\',
                \'Postal Code\' => \'postal_code\',
            ),
            \'meta_query\' => \'\',
            \'taxonomy\' => \'\',
        ),
    );
如果你能做到这一点,我将向你表示感谢,如果你能提供帮助,我将更加感谢你!:-)

2 个回复
最合适的回答,由SO网友:tmdesigned 整理而成

我可能误解了你的问题,但它的编写方式似乎好像FilterBuilder类的每个实例都会被调用。

类的每个实例在其构造函数中都有:

add_action(\'wp_ajax_myfilter\', array($this, \'filter_function\'));

(以及未登录的用户版本)

这里没有条件告诉它何时根据您拥有的“内容类型”或类实例运行。WordPress从字面上被告知,“每当您收到对‘myfilter’的ajax请求时,请运行此实例的filter\\u函数。”由于您的示例中有2个实例,因此有2个构造函数,WordPress被告知两次(每次一次)。

WP-AJAX函数通常用于返回数据和模具。(可能很冷酷,但却是真的:)因此,如果您的是这样写的,那么只有第一个注册的操作才会运行。

因此,简而言之,每个注册的钩子都与各自的对象相关联(这一点),并且它们相似的名称不会成为障碍。然而,您还没有给WordPress或AJAX工作流提供任何信息来知道应该加载哪个实例。

SO网友:csaborio

作为捷克皇宫;tmdesigned指出,每个实例的ajax调用需要不同。操作注册现在如下所示:

            add_action("wp_ajax_myfilter_{$content_type}", array( $this, \'scorpiotek_filter_function\' ) );
            add_action("wp_ajax_nopriv_myfilter_{$content_type}", array( $this, \'scorpiotek_filter_function\' ) );
我必须匹配隐藏操作输入的值过滤器以反映此更改:

<input type="hidden" name="action" value="myfilter_<?php echo $this->get_content_type(); ?>">
谢谢两位!!:-)

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。