如何将_Filter添加到基于OOP的Apply_Filter(‘foo::bar’,$a);

时间:2017-02-22 作者:Harkály Gergő

我必须向$actions数组中添加更多元素,如何为第一个参数创建add\\u filter函数,如下所示:apply_filter(\'foo::bar\', $var);

完整块是:

public function get_bulk_actions()
{
    $actions = array();
    $actions[\'delete\'] = __( \'Delete\', ud_get_wp_property( \'domain\' ) );
    return apply_filters( \'wpp::all_properties::bulk_actions\', $actions );
}
因此,我想做一些类似的事情,为操作添加更多选项:

add_filter(\'wpp::all_properties::bulk_actions\', \'add_something\');
function add_something($actions)
{
    $actions[\'dosomething\'] = \'Do Something\';
    return $actions;
}

1 个回复
SO网友:Nathan Johnson

我不太确定你哪里有问题。添加和删除挂钩是WordPress编程的基础。一旦你了解了钩子系统,你会有一个更容易的时间。

什么是挂钩

您需要的一切都可以在Plugin API/Hooks. WordPress有两种类型的钩子:动作和过滤器,但它们基本相同。过滤器只需要返回一个可能修改过的变量。

什么是apply_filters(), 和add_filter()?f(). 我们的函数执行一些有用的操作并返回一个值。但我们希望允许其他开发人员可能修改该值。所以我们打电话apply_filters() 我们的价值观。apply_filters() 需要两个参数:第一个$tag 是字符串和第二个$value 可以是任何东西。

然后,其他开发人员或您可以使用add_filter() 函数修改该值。add_filter() 需要两个参数,两个参数是可选的。第一个是$tag. 这与上面使用的标签相同。第二个是callable: 这可以是一个简单的回调(字符串)、静态类调用、对象类调用等。请参阅PHP可调用链接。第三个(可选)参数是钩子应该触发的优先级(先触发较小的数字),第四个参数是将传递给函数的变量数。

那太好了。还有别的吗

是的。确保在apply_filters() 呼叫如果你不这样做,他们就不会被应用。要做到这一点,最简单的方法是知道何时挂钩和优先级apply_filters() 然后确保add_filter() (或过滤器)在挂钩之前。

你能举个例子吗

给你。

<?php
/**
 * Plugin Name: WPSE 257530
 * Description: WordPress StackExchange question 257530
 * Plugin URI: https://wordpress.stackexchange.com/questions/257530/
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Don\'t access this file directly
defined( \'ABSPATH\' ) or die();

if( ! class_exists( \'wpse_257530\' ) ):
  class wpse_257530 {

    protected $bulk_actions;

    public function plugins_loaded() {
      //* Add default actions at priority 0
      add_filter( \'wpse-257530-bulk-actions\', [ $this, \'default_bulk_actions\' ], 0, 1 );

      //* Add filter to a non-static method in the same class
      add_filter( \'wpse-257530-bulk-actions\', [ $this, \'move\' ], 10, 1 );

      //* Do something on init
      add_action( \'init\', [ $this, \'init\' ] );
    }

    public function init() {
      //* Get the bulk actions
      $this->bulk_actions = $this->get_bulk_actions();

      //wp_die( var_dump( $this->bulk_actions ) );
    }

    public function default_bulk_actions( $actions ) {
      return [
        \'create\' => __( \'Create\', \'wpse-257530\' ),
        \'rename\' => __( \'Rename\', \'wpse-257530\' ),
        \'update\' => __( \'Update\', \'wpse-257530\' ),
        \'delete\' => __( \'Delete\', \'wpse-257530\' ),
      ];
    }

    public function get_bulk_actions() {
      return apply_filters( \'wpse-257530-bulk-actions\', [] );
    }

    public function move( $actions ) {
      $actions[ \'move\' ] = __( \'Move\', \'wpse-257530\' );
      return $actions;
    }

    public static function slip( $actions ) {
      $actions[ \'slip\' ] = __( \'Slip\', \'wpse-257530\' );
      return $actions;
    }

    public function slide( $actions ) {
      $actions[ \'slide\' ] = __( \'Slide\', \'wpse-257530\' );
      return $actions;
    }
  }

  //* Start the plugin on plugins_loaded
  add_action( \'plugins_loaded\', [ new wpse_257530(), \'plugins_loaded\' ] );

  //* Add filter to a non-static method in another class
  add_filter( \'wpse-257530-bulk-actions\', [ new wpse_257530(), \'slide\' ], 20, 1 );

  //* Add filter to a static method
  add_filter( \'wpse-257530-bulk-actions\', [ \'wpse_257530\', \'slip\' ], 10, 1 );

  //* Add filter to a closure
  add_filter( \'wpse-257530-bulk-actions\', function( $actions ) {
    $actions[ \'water\' ] = __( \'Water\', \'wpse-257530\' );
    return $actions;
  }, 10, 1 );
endif;