无法从短码处理程序函数修改类属性

时间:2017-07-07 作者:Sven Chmielewski

我试图将来自shortcode属性的数据存储在class属性中,以便稍后在其他函数中使用它。但不知何故,我总是以房产的初始价值来结束。下面是一个简化的示例来展示我的问题:

class ScopeTestClass {
    public $my_var = null;

    function __construct() {
        // The calls to add_action() go here
        // I\'ve omitted them for this example to avoid cluttering up the code
        add_shortcode( \'my_shortcode\', array($this, \'my_shortcode_handler\'));
    }

    function register_scripts() {
        wp_register_script(\'some_script\', plugin_dir_url(__FILE__) .
            \'/js/some_script.js\', array(\'jquery\'), \'1.0\', true);

    public function my_shortcode_handler() {
        $this->my_var = \'yeeha!\';
        wp_enqueue_script(\'some_script\');
        wp_localize_script( \'some_script\', \'somescript\', array(
            \'ajax_url\' => admin_url( \'admin-ajax.php\' )));

    }

    public function ajax_handler() { 
        // This function handles the ajax call from some_script.js.
        // When evaluating $this->my_var here, it is null. 
    }
}

$test_obj = new ScopeTestClass();
my_var 正确设置为“yeeha!”在shortcode函数中ajax_handler() 它显示为null的函数。这是一个范围问题吗?我认为这可能是因为shortcode和ajax处理函数都是从对象上下文外部调用的,因此$this 不指向test_obj, 但我读过的其他问题和文章似乎没有这个问题。所以我的问题是什么?

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

如果您是从脚本发布到AJAX处理程序,则这是一个完全不同的请求,脚本无法知道my_var 值,那么如何将其传递回AJAX。

但这就是为什么要使用本地化脚本,不是吗?为什么不直接在该数组中传递值呢?

wp_localize_script( \'some_script\', \'somescript\', array(
        \'ajax_url\' => admin_url( \'admin-ajax.php\' ), 
        \'my_var\' => $this->my_var 
    )
);

结束

相关推荐

create shortcodes for posts

$query = new WP_Query(array( \'post_type\' => \'my_posttype\', \'post_status\' => \'publish\', \'posts_per_page\' => -1, \'orderby\' => \'title\', \'order\' => \'ASC\' )); while ($query->have_posts()) {&#