在挂钩和筛选器中传递变量

时间:2015-12-05 作者:Busted Angon

我试图在过滤器中传递变量。这对我来说非常有效。

class my_class {
 function my_class() {
    add_filter(\'wp_list_categories\', array(&$this,\'cat_count_span\'));
 }
function cat_count_span($links) {
   $links = str_replace(\'</a> (\', \'</a> <span>\', $links);
   $links = str_replace(\')\', \'</span>\', $links);
   return $links;
   }
 } 
new my_class();
但现在我想根据主题选项值执行过滤器。假设我有我的主题选项值$search = ot_get_option(\'search_header\'); 基于这个值,我想添加过滤器并控制输出。像这样

class my_class {
   function my_class() {
     add_filter(\'wp_list_categories\', array(&$this,\'cat_count_span\'));
   }
 function cat_count_span($links) {
   $search = ot_get_option(\'search_header\');
   if ($search === \'on\') {
   $links = str_replace(\'</a> (\', \'</a> <span>\', $links);
   $links = str_replace(\')\', \'</span>\', $links);
   return $links;
   }
   }
 } 
new my_class();

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

我不太清楚为什么要这样做是一个类,因为您可以在这里简单地使用意大利面过滤器函数。

如果你真的需要在课堂上这样做,你的课堂上有几个问题

我们正朝着PHP 7发展,WordPress最终也觉醒了,现在它的类也朝着PHP 7发展。PHP 4类型构造函数随恐龙一起消亡,不应使用。Never ever 尝试支持使用EOL\'ed PHP版本的用户。不要牺牲性能和安全性来支持EOL\'ed版本。注意,PHP 4类型构造函数在PHP 7中折旧

Warning

PHP 7.0中不推荐使用旧式构造函数,并将在将来的版本中删除。在新代码中应始终使用\\uu construct()。

构造函数应该进行类初始化,而不应该执行任务。您不应该使用构造函数来添加筛选器或操作。把它移到你的课外

最好命名公共方法public function function_name(), 而且不仅仅是function function_name()

一般来说,过滤器应该总是返回一些东西。您的筛选器失败,因为如果您的条件失败,您的筛选器没有回退,因为它不返回任何内容

    类方法

    您可以将类重写为以下内容:(NOTE: 因为我们顺利通过了PHP5。3、善用namespacing when constructing classes. 关于这个主题,有很多很好的教程

    class MyClass
    {
        /**
         * Class instance.
         *
         * @see get_instance()
         * @type object
         */
        protected static $instance = NULL;
        
        // Access the working instance of the class
        public static function get_instance()
        {
            NULL === self::$instance and self::$instance = new self;
            return self::$instance;
        }
        
        // Use the __construct() method for constructors
        public function __construct() 
        {
            // Add initialization here. Do not add add_filter/add_action here
        }
    
        public function CatCountSpan( $links )
        {
            $search = ot_get_option(\'search_header\');
    
            if ($search === \'on\') {
                $links = str_replace(\'</a> (\', \'</a> <span>\', $links);
                $links = str_replace(\')\', \'</span>\', $links);
            }
       
            // Move the return statement outside the condition
            return $links;
        }
    } // end of class
    
    然后,您可以在类外添加筛选器,如下所示

    add_filter(
        \'wp_list_categories\',
        [MyClass::get_instance(), \'CatCountSpan\']
    );  
    
    现场资源丰富

    add_action reference a class

  • Where is the best place to use add_filter

    • 使用闭包的普通意大利面条正如我所说,我真的没有看到类在这里的用处,我可能只会使用普通的过滤函数

      add_filter( \'wp_list_categories\', function ( $links )
      {
          $search = ot_get_option(\'search_header\');
      
          if ($search === \'on\') {
              $links = str_replace(\'</a> (\', \'</a> <span>\', $links);
              $links = str_replace(\')\', \'</span>\', $links);
          }
      
          // Move the return statement outside the condition
          return $links;
      });
      

相关推荐

Apply_Filters(‘the_content’,$Content)与DO_ShortCode($Content)

假设我有一个主题选项或自定义的postmeta文本区域。现在我想执行多个短代码、一般文本、图像等。最佳实践是什么?为什么?选项1:$content = //my text area data; echo apply_filters(\'the_content\', $content); 选项2:$content = //my text area data; echo do_shortcode($content); 请告诉我哪一个是最佳实践,以及为什么。EDIT让我详细描