最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

actions - How to call a static function in add_action() inside another static function?

programmeradmin0浏览0评论

In my plugin, I would like to load css only when the front-end current page is using one of my plugin shortcodes.

All my shortcodes are classes extending Shortcode class. Shortcode class helps me to automate the callback function.

Shortcode abstract class

namespace PluginFoo\Shortcodes;


abstract class Shortcode {

    public $tag;
    public $attrs;
    public $function;

    public function __construct($tag) {
        $this->attrs = array();
        $this->tag = $tag;
        $this->function = static::className().'::getCallBack';

        add_shortcode( $this->tag, $this->function );

    }

    abstract public static function className();

    abstract public static function getCallBack( $attrs ); 
}

FooShortcode class

namespace PluginFoo\Shortcodes;

class FooShortcode extends Shortcode {

    public static function getCallBack( $attrs = null ){

        add_action('wp_enqueue_scripts', array( __CLASS__, 'set_bootstrap' ) ); // <-- Here - function set_bootstrap not called !

        $output = '';

        ob_start();

        //HTML Template
         include_once 'shortcode-view.php';

        $output .= ob_get_contents();
        ob_end_clean();

        return $output;

    }

    public static function set_bootstrap() {
         wp_enqueue_style( 'bootstrapstyle', PLUGIN_DIR_URL . 'css/bootstrap.min.css' );
    }

    public static function className(){
        return __CLASS__;
    }
}

How can I call correcty the static function set_bootstrap() in add_action() inside an another static function ?

In my plugin, I would like to load css only when the front-end current page is using one of my plugin shortcodes.

All my shortcodes are classes extending Shortcode class. Shortcode class helps me to automate the callback function.

Shortcode abstract class

namespace PluginFoo\Shortcodes;


abstract class Shortcode {

    public $tag;
    public $attrs;
    public $function;

    public function __construct($tag) {
        $this->attrs = array();
        $this->tag = $tag;
        $this->function = static::className().'::getCallBack';

        add_shortcode( $this->tag, $this->function );

    }

    abstract public static function className();

    abstract public static function getCallBack( $attrs ); 
}

FooShortcode class

namespace PluginFoo\Shortcodes;

class FooShortcode extends Shortcode {

    public static function getCallBack( $attrs = null ){

        add_action('wp_enqueue_scripts', array( __CLASS__, 'set_bootstrap' ) ); // <-- Here - function set_bootstrap not called !

        $output = '';

        ob_start();

        //HTML Template
         include_once 'shortcode-view.php';

        $output .= ob_get_contents();
        ob_end_clean();

        return $output;

    }

    public static function set_bootstrap() {
         wp_enqueue_style( 'bootstrapstyle', PLUGIN_DIR_URL . 'css/bootstrap.min.css' );
    }

    public static function className(){
        return __CLASS__;
    }
}

How can I call correcty the static function set_bootstrap() in add_action() inside an another static function ?

Share Improve this question edited Oct 9, 2017 at 17:05 J.BizMai asked Oct 9, 2017 at 16:37 J.BizMaiJ.BizMai 9002 gold badges10 silver badges30 bronze badges 5
  • what do you mean by "Does not work" ? give more details – mmm Commented Oct 9, 2017 at 16:57
  • the function set_bootstrap() is not called. – J.BizMai Commented Oct 9, 2017 at 17:04
  • have you activated WP_DEBUG ? codex.wordpress/WP_DEBUG – mmm Commented Oct 9, 2017 at 17:20
  • Yes, of course. I have got any error in the debug.log file. – J.BizMai Commented Oct 9, 2017 at 17:28
  • Do you think, it's not called because the action 'wp_enqueue_scripts' was run before ? – J.BizMai Commented Oct 9, 2017 at 17:30
Add a comment  | 

2 Answers 2

Reset to default 2

If your class is called statically you need to use get_called_class() like this:

add_action('wp_enqueue_scripts', array( get_called_class(), 'set_bootstrap' ) );

since $this is not available. This also works if the class is extended.

you can use classname::class for example:

add_shortcodes(callback::class, 'callbackmethod');
发布评论

评论列表(0)

  1. 暂无评论