Как работает массив (__ CLASS__, работает в WordPress? - PullRequest
2 голосов
/ 17 сентября 2010

Я пытаюсь изменить плагин для WordPress, чтобы получать пользовательские категории.Поэтому, когда вызывается random_post_link, я могу добавить пользовательскую категорию, используя random_post_link ('Random Link', 3).3 является именем категории.

  1. Как плагин ниже создает новый объект класса Random_Post_Link?Я думал, что вы создали новые объекты, делая что-то вроде:

    $ a = new random_post_link;

Но я не вижу этого в плагине.Я думаю, что он создает новый объект в функции 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 Ответ

2 голосов
/ 17 апреля 2014

Некоторые авторы WordPress используют структуру классов в PHP, чтобы в основном уменьшить глобальные переменные. Класс подразумевается как своего рода «синглтон», и поэтому он обычно не создается (этот код вместо этого вызывает 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 вещей.

...