数组如何(__ CLASS__,在wordpress中工作?

时间:2010-09-17 01:23:46

标签: php wordpress-plugin

我正在尝试修改wordpress插件以获取自定义类别。因此,当调用random_post_link时,我可以使用random_post_link('Random Link',3)添加自定义类别。 3是类别名称。

  1. 下面的插件如何创建一个类Random_Post_Link的新对象?我认为您通过执行以下操作创建了新对象:

    $ a = new random_post_link;

  2. 但我在插件中没有看到。我认为它通过使用hook来在init函数中创建新对象:

    add_action('init',array( CLASS ,'jump'));

    如果是这种情况,我怎样才能在跳转功能中添加参数?

    我想我知道add_action是如何工作的,第二个参数应该是函数名,怎么做 “数组( CLASS ,'jump')”工作?

    以下是该插件的完整代码:

    function random_post_link($text = 'Random Post',$the_cat = 36) {
        printf('<a href="%s">%s</a>', get_random_post_url(), $text);
        $the_category = $the_cat;
    }
    
    function get_random_post_url() {
        return trailingslashit(get_bloginfo('url')) . '?' . Random_Post_Link::query_var;
    }
    
    
    class Random_Post_Link {
        const query_var = 'random';
        const name = 'wp_random_posts';
        public $the_category;
    
        function init() {
            add_action('init', array(__CLASS__, 'jump'));
    
            // Fire just after post selection
            add_action('wp', array(__CLASS__, 'manage_cookie'));
        }
    
        // Jump to a random post
        function jump() {
            if ( ! isset($_GET[self::query_var]) )
                return;
    
            $args = apply_filters('random_post_args', array(
                'post__not_in' => self::read_cookie(),
            ));
    
            $args = array_merge($args, array(
                'orderby' => 'rand',
                'cat' => $the_category,
                'showposts' => 1,
            ));
    
            $posts = get_posts($args);
    
            if ( empty($posts) ) {
                self::update_cookie(array());
                unset($args['post__not_in']);
    
                $posts = get_posts($args);
            }
    
            if ( empty($posts) )
                wp_redirect(get_bloginfo('url'));
    
            $id = $posts[0]->ID;
    
            wp_redirect(get_permalink($id));
            die;
        }
    
        // Collect post ids that the user has already seen
        function manage_cookie() {
            if ( ! is_single() )
                return;
    
            $ids = self::read_cookie();
            $id = $GLOBALS['posts'][0]->ID;
    
            if ( count($ids) > 200 )
                $ids = array($id);
            elseif ( ! in_array($id, $ids) )
                $ids[] = $id;
    
            self::update_cookie($ids);
        }
    
        private function read_cookie() {
            return explode(' ', @$_COOKIE[self::name]);
        }
    
        private function update_cookie($ids) {
            setcookie(self::name, trim(implode(' ', $ids)), 0, '/');
        }
    }
    
    Random_Post_Link::init();
    

1 个答案:

答案 0 :(得分:2)

一些WordPress作者使用PHP中的Class结构来基本上减少全局变量。这个班级意味着“单身人士”。各种各样的,因此它通常不被实例化(代码在底部调用Random_Post_Link::init();)。类函数被视为类成员,而不是实例成员,例如,在其他语言中类似于Math.max()。

__CLASS__ php关键字只是当前类的标记,因此在传递时,可调用对象变为Random_Post_Link::method()array( 'Random_Post_Link', 'method' )

如果您需要取消挂钩,请尝试remove_action( 'init', array( 'Random_Post_Link, 'jump' ) );

(另请注意,使用该方式的方法应声明为static function jump() {...}

P.S。进一步澄清:

http://php.net/manual/en/language.types.callable.php

array('class', 'function')语法是PHP的东西,而WordPress操作期望callable可以是任何PHP可调用的东西。