在类外部定义函数,并使用操作或筛选器挂钩调用该函数

时间:2022-01-01 作者:Abilash Erikson

嗨,目前我正在为我自己的主插件开发一个子插件。请参见下面的主要插件代码

<?php
class MyClass
{
    function __construct()
    {

        function test1()
        {
            echo \'hii- test1\';
        }
        $this->autoload_function();
    }

    function autoload_function()
    {
        $my_array = array(
            "test1"
        );

        foreach ($my_array as $my_function)
        {
            call_user_func($my_function);
        }

    }

}

$var = new MyClass();

?>

My sub plugin need to add more values to $my_array and i am allowed to use do_action or apply_filtere in main plugin.

我补充道apply_filters, 这样我就可以在我的子插件中修改$my\\u数组。

my-class.php

<?php
class MyClass
{
    function __construct()
    {

        function test1()
        {
            echo \'hii- test1\';
        }
        $this->autoload_function();
    }

    function autoload_function()
    {
        $my_array = array(
            "test1"
        );

        apply_filters(\'modify_array\', $my_array);
        foreach ($my_array as $my_function)
        {
            call_user_func($my_function);
        }

    }

}

$var = new MyClass();

?>
在我的子插件中,我检查了过滤器,我可以看到过滤器工作正常,因此我可以修改子插件中$my\\u数组的值。

my-newpage.php

add_filter (\'modify_array\', \'modify_array_function\', 0);


function modify_array_function($my_array){
 array_push($my_array, \'test2\')
}
在这里,我可以看到新的值被添加到数组中,但现在我必须在我的子插件中定义test2函数。

function test2(){
 echo \'hii- test2\';
}
当我在我的子插件中编写test2函数时,我发现了以下错误。

警告:call\\u user\\u func()要求参数1是有效的回调,类\'MyClass\' does not have a method\'test2\'

现在我该如何解决这个问题?我是否需要在子插件中添加更多操作或过滤器。

The issue is due to call_user_func(\'test2\'); is called inside my-class.php 但是test2函数是在mycalss之外定义的。它是在我的子插件中定义的

请帮助解决此错误。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

所以我假设你的子插件加载在主插件之后,对吗?

在这里,我可以看到新的值被添加到数组中,但现在我必须在我的子插件中定义test2函数

如果你确定test2 已成功添加到阵列test2 正在从MyClass::autoload_function(), 然后你可以试着用早钩like init 定义test2,类似于:

<?php
/* Plugin Name: My Sub Plugin */

// Defines the test2() function.
function my_define_test2() {
    function test2(){
        echo \'hii- test2\';
    }
}

// Now hook on init to ensure test2() is defined before your main plugin
// is loaded.
add_action( \'init\', \'my_define_test2\', 1 );

// And then add test2() to $my_array (that you defined in the main plugin).
add_filter( \'modify_array\', \'modify_array_function\' );
function modify_array_function( $my_array ) {
    array_push( $my_array, \'test2\' );
    return $my_array; // remember, filters must always return something =)
}
然而,如果MyClass 当WordPress加载插件时,会立即实例化,比如这样,那么我认为您不可能定义test2 之前MyClass 已实例化。除非可能,如果你使用Must Use 插件。

<?php
/* Plugin Name: My Main Plugin */

class MyClass { ... }

$var = new MyClass();

相关推荐

WP_Query filters

这个问题可能看起来很愚蠢,但我真的没有找到有用的链接。我正在尝试做一个简单的查询,在这里我选择了最近的10篇文章,我希望能够在循环中只显示这10篇文章中的1篇我的代码看起来像 // Query latest 10 records $the_query = new WP_Query( array( \'post_type\' => \'post\', \"order\" => \"DESC\", \'posts_per_page