在另一个类中使用Add_Filter

时间:2018-11-05 作者:middlelady

我正在构建一个生成自定义css的插件,我有两个类:

主类,其核心函数编译器类如下(我简化了所有内容,因为有很多选项):

class compiler 
{
   public function __construct(){
      $this->generateCss();
      $this->enqueueCss();
      //other functions
   }
   public function generateCss(){
      //this is the filter
      $css = apply_filters(\'dynamic_css\', \'.your_code{}\');
      $content = $css;
      //the rest of the function which generates and upload the file
   }
   //other functions to enqueue the generated file
}

$compiler = new compiler();

class my_class
{
   public function __construct() {
      //blablabla
      $this->pluginSetup();
   }
   public function pluginSetup(){
      //other functions to save css in option "custom css"
      add_action(\'admin_init\', array($this, \'set_css\'));
   }
   public function set_css(){
      add_filter( \'dynamic_css\', array( $this, \'load_custom_css\' ));
   }
   public function load_custom_css(){
      //css has been inserted in option "custom css" through omitted functions
      $css = get_option("custom_css");
      return $css;
   }
}
$my_class = new my_class();
文件已正确生成并排队,但筛选器dynamic_css 不起作用,我只得到默认值.your_code{}.

中的代码option("custom_css") 存在并在上有效var_dump().

我想把这两个类分开,但我找不到解决方案,我试图改变初始化顺序,但没有成功。

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

看到默认值的原因是,在应用过滤器后添加过滤器,这会导致使用默认值。在构建对象时应用过滤器,我假设之前admin_init. 如果在之后admin_init 这也行不通,但那是因为admin_init 操作已启动。

这里有一种方法可以做到这一点(我不喜欢在构造函数中添加操作/过滤器,因此类的结构略有不同。

class compiler 
{
   public function generateCss(){
      $css = apply_filters( \'dynamic_css\', \'.your_code{}\' );
      $this->content = $css;
   }
}    
$compiler = new compiler();
add_action( \'admin_init\', [ $compiler, \'generateCss\' ], 11 );

class my_class
{
   public function set_css(){
      add_filter( \'dynamic_css\', [ $this, \'load_custom_css\' );
   }
   public function load_custom_css(){
      return get_option( \'custom_css\' );
   }
}
$my_class = new my_class();
add_action( \'admin_init\', [ $my_class, \'set_css\' ], 10 );

结束