2010-09-17 6 views
2

J'essaie de moduler un plugin wordpress pour prendre des catégories personnalisées.Alors que le random_post_link est appelé, je peux ajouter la catégorie personnalisée en utilisant random_post_link ('Random Link', 3 .) 3 étant le nom de la catégorieComment array (__ CLASS__, travailler dans wordpress?

  1. Comment le plug-in ci-dessous créer un nouvel objet de la classe Random_Post_Link Je pensais que vous avez créé de nouveaux objets en faisant quelque chose comme:.?

    $ a = new random_post_link;

Mais je ne vois pas ça dans le plugin. Je pense qu'il crée le nouvel objet dans la fonction init en utilisant un crochet:

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

Si c'est le cas, comment puis-je ajouter un paramètre pour sauter la fonction?

Je crois que je sais comment fonctionne add_action, le second paramètre doit être le nom de la fonction, comment ne « array (CLASSE, « sauter ») » fonctionne?

Voici le code complet pour le plug-in:

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

Je serais très surpris si le désordre de WP a des classes dedans. Quand vous écrivez «CLASS», voulez-vous dire «CLASS» ou voulez-vous dire «__CLASS__»? Il est trompeur compte tenu du titre de votre question –

+0

il s'agit d'une copie directe de la source du plugin, donc oui, __CLASS__ (avec soulignement) – pood

+1

les caractères de soulignement ont tendance à gras le texte ici, donc si vous essayez d'écrire classe entourée par eux, essayez d'utiliser une citation "backtick", qui le marquera comme code: '' __CLASS__' ' – WraithKenny

Répondre

2

Certains auteurs utilisent WordPress la structure de classe en PHP pour réduire essentiellement vars globales. La classe est conçue comme un singleton et n'est donc généralement pas instanciée (ce code appelle Random_Post_Link::init(); en bas). Les fonctions de classe sont traitées comme des membres de classe, pas comme des membres d'instance, un peu comme Math.max() dans d'autres langues, par exemple.

Le mot-clé __CLASS__ php est tout simplement un jeton pour la classe actuelle, donc lorsqu'il est passé, le appelable devient Random_Post_Link::method() ou array('Random_Post_Link', 'method')

Si vous devez décrochez, essayez remove_action('init', array('Random_Post_Link, 'jump'));

(Notez également que les méthodes utilisées cette façon devrait être déclarée static function jump() {...})

PS Pour être plus précis:

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

La syntaxe array('class', 'function') est une chose PHP, tandis que les actions WordPress attendent un callable qui pourrait être l'une des choses PHP appelable.