Wie funktioniert array(__CLASS__, in WordPress?

Lesezeit: 3 Minuten

Ich versuche, ein WordPress-Plugin zu modifizieren, um benutzerdefinierte Kategorien zu übernehmen. Wenn also random_post_link aufgerufen wird, kann ich die benutzerdefinierte Kategorie hinzufügen, indem ich random_post_link(‘Random Link’,3) verwende. 3 ist der Kategoriename.

  1. Wie erstellt das folgende Plugin ein neues Objekt der Klasse Random_Post_Link? Ich dachte, Sie haben neue Objekte erstellt, indem Sie Folgendes tun:

    $a = neuer random_post_link;

Aber das sehe ich im Plugin nicht. Ich denke, es erstellt das neue Objekt in der Init-Funktion mit einem Hook:

add_action(‘init’, array(KLASSE‘springen’));

Wenn dies der Fall ist, wie kann ich der Sprungfunktion einen Parameter hinzufügen?

Ich glaube, ich weiß, wie add_action funktioniert, der zweite Parameter sollte der Funktionsname sein, wie funktioniert “array(KLASSE‘springen’)” funktionieren?

Hier ist der vollständige Code für das Plugin:

function random_post_link($text="Random Post",$the_cat = 36) {
    printf('<a href="https://stackoverflow.com/questions/3732083/%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, "https://stackoverflow.com/");
    }
}

Random_Post_Link::init();

  • Ich wäre sehr überrascht, wenn das Durcheinander von WP irgendwelche Klassen enthält. Wenn du schreibst CLASS meinst du CLASS oder meinst du __CLASS__. Es ist angesichts Ihres Fragentitels irreführend

    – Jake N

    17. September 2010 um 8:24 Uhr

  • dies ist eine direkte Kopie aus der Plugin-Quelle, also ja, KLASSE (mit Unterstrich)

    – Puh

    24. September 2010 um 0:19 Uhr


  • Unterstriche neigen dazu, den Text hier fett zu schreiben. Wenn Sie also versuchen, eine von ihnen umgebene Klasse zu schreiben, versuchen Sie, ein “Backtick”-Anführungszeichen zu verwenden, das es als Code markiert: ` __CLASS__ `

    – WraithKenny

    30. November 2015 um 19:12 Uhr


Benutzeravatar von WraithKenny
WraithKenny

Einige WordPress-Autoren verwenden die Klassenstruktur in PHP, um globale Variablen im Grunde zu reduzieren. Die Klasse ist als eine Art “Singleton” gedacht und wird daher normalerweise nicht instanziiert (dieser Code ruft auf Random_Post_Link::init(); stattdessen unten). Die Klassenfunktionen werden als Klassenmitglieder behandelt, nicht als Instanzmitglieder, ähnlich wie zum Beispiel Math.max() in anderen Sprachen.

Das __CLASS__ php-Schlüsselwort ist einfach ein Token für die aktuelle Klasse, wenn es also übergeben wird, wird das aufrufbare Random_Post_Link::method() oder array( 'Random_Post_Link', 'method' )

Wenn Sie aushaken müssen, versuchen Sie es remove_action( 'init', array( 'Random_Post_Link, 'jump' ) );

(Beachten Sie auch, dass auf diese Weise verwendete Methoden deklariert werden sollten static function jump() {...})

PS Zur weiteren Verdeutlichung:

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

Das array('class', 'function') Syntax ist eine PHP-Sache, während WordPress-Aktionen eine erwarten callable Dies könnte eines der aufrufbaren PHP-Dinge sein.

1427410cookie-checkWie funktioniert array(__CLASS__, in WordPress?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy