¿Cómo funciona array(__CLASS__, en wordpress?

3 minutos de lectura

Estoy tratando de modificar un complemento de wordpress para tomar categorías personalizadas. Entonces, cuando se llama a random_post_link, puedo agregar la categoría personalizada usando random_post_link(‘Random Link’,3). 3 siendo el nombre de la categoría.

  1. ¿Cómo crea el complemento a continuación un nuevo objeto de clase Random_Post_Link? Pensé que creaste nuevos objetos haciendo algo como:

    $a = nuevo enlace_post_aleatorio;

Pero no veo eso en el plugin. Creo que crea el nuevo objeto en la función de inicio usando un gancho:

add_action(‘init’, array(CLASE‘salto’));

Si ese es el caso, ¿cómo puedo agregar un parámetro a la función de salto?

Creo que sé cómo funciona add_action, el segundo parámetro debería ser el nombre de la función, ¿cómo funciona ” array(CLASE‘saltar’)” funciona?

Aquí está el código completo para el 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();

  • Me sorprendería mucho si el lío de WP tiene alguna clase. Cuando escribes CLASS Quieres decir CLASS o quieres decir __CLASS__. Es engañoso dado el título de su pregunta.

    – Jake N.

    17 de septiembre de 2010 a las 8:24

  • esta es una copia directa de la fuente del complemento, así que sí, CLASE (con guión bajo)

    – pud

    24 de septiembre de 2010 a las 0:19


  • Los guiones bajos tienden a poner el texto en negrita aquí, por lo que si está tratando de escribir una clase rodeada por ellos, intente usar una comilla de “comilla grave”, que lo marcará como código: ` __CLASS__ `

    – WraithKenny

    30 de noviembre de 2015 a las 19:12


Avatar de usuario de WraithKenny
EspectroKenny

Algunos autores de WordPress usan la estructura Class en PHP para reducir básicamente las variables globales. La clase está pensada como una especie de ‘singleton’, por lo que generalmente no se instancia (ese código llama Random_Post_Link::init(); en la parte inferior en su lugar). Las funciones de clase se tratan como miembros de clase, no como miembros de instancia, algo así como Math.max() en otros lenguajes, por ejemplo.

los __CLASS__ La palabra clave php es simplemente un token para la clase actual, por lo que cuando se pasa, el invocable se convierte en Random_Post_Link::method() o array( 'Random_Post_Link', 'method' )

Si necesita desengancharse, intente remove_action( 'init', array( 'Random_Post_Link, 'jump' ) );

(También tenga en cuenta que los métodos utilizados de esa manera deben declararse static function jump() {...})

PD Para aclarar más:

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

los array('class', 'function') la sintaxis es una cosa de PHP, mientras que las acciones de WordPress esperan un callable que podría ser cualquiera de las cosas llamables de PHP.

¿Ha sido útil esta solución?