2010-02-05 8 views
9

Ok, ho questo codice che ho usato per sputare notizie a una mia applicazione. Funzionava fino ad oggi. Ho tagliato tutta la logica nel seguente codice per renderlo più semplice. Ma dovrebbe "LAVORARE" Qualcuno può aiutarmi a correggere questo codice su dove funziona, ed è fatto bene? So che è hackerato insieme, ma non sembra aver avuto problemi fino ad oggi. Non ho aggiornato nulla, non so quale sia l'affare.wp_rewrite in un plugin WordPress



Plugin Name: MyPlugin Example 
Version:  1.0.1 


If (! class_exists("MyPlugin")) 
{ 
    class MyPlugin 
    { 
     var $db_version = "1.0"; //not used yet 

     function init() 
     { 
    //Nothing as of now. 
     } 
     function activate() 
     { 
      global $wp_rewrite; 
      $this->flush_rewrite_rules(); 
     } 

     function pushoutput($id) 
     { 
      $output->out =' The output worked!'; 
      $this->output($output); 

     } 
     function output($output) 
     { 
      ob_start(); 
      ob_end_clean(); 
      header('Cache-Control: no-cache, must-revalidate'); 
      header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
      header('Content-type: application/json'); 

      echo json_encode($output); 
      //Must encode this... 
     } 

     function flush_rewrite_rules() 
     { 
      global $wp_rewrite; 
      $wp_rewrite->flush_rules(); 
     } 

     function createRewriteRules($rewrite) 
     { 
      global $wp_rewrite; 
      $new_rules = array('MyPlugin/(.+)' => 'index.php?MyPlugin=' . $wp_rewrite->preg_index(1)); 
      if (! is_array($wp_rewrite->rules)) 
      { 
       $wp_rewrite->rules = array(); 
      } 
      $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; 
      return $wp_rewrite; 
     } 


     function add_query_vars($qvars) 
     { 
      $qvars[] = 'MyPlugin'; 
      return $qvars; 
     } 
     function template_redirect_intercept() 
     { 
      global $wp_query; 
      if ($wp_query->get('MyPlugin')) 
      { 
       $id = $wp_query->query_vars['MyPlugin']; 
       $this->pushoutput($id); 


       exit; 
      } 
     } 
    } 
} 
If (class_exists("MyPlugin")) 
{ 
    $MyPluginCode = new MyPlugin(); 
} 
If (isset($MyPluginCode)) 
{ 
    register_activation_hook(__file__, array($MyPluginCode, 'activate')); 
    add_action('admin-init', array(&$MyPluginCode, 'flush_rewrite_rules')); 
    //add_action('init', array(&$MyPluginCode, 'init')); 
    add_action('generate_rewrite_rules', array(&$MyPluginCode, 'createRewriteRules')); 

    add_action('template_redirect', array(&$MyPluginCode, 'template_redirect_intercept')); 
    // add_filter('query_vars', array(&$MyPluginCode, 'add_query_vars')); 
} 

+0

Fondamentalmente ho solo bisogno di essere in grado di prendere l'input da un URL e di generare alcuni dati JSON. – Brad

risposta

20

ho cambiato un po 'del codice nel processo, ma questo ha lavorato per me:

<?php 

/** 
* Plugin Name: MyPlugin Example 
* Version:  1.0.1 
**/ 
class MyPlugin { 

    function activate() { 
     global $wp_rewrite; 
     $this->flush_rewrite_rules(); 
    } 

    // Took out the $wp_rewrite->rules replacement so the rewrite rules filter could handle this. 
    function create_rewrite_rules($rules) { 
     global $wp_rewrite; 
     $newRule = array('MyPlugin/(.+)' => 'index.php?MyPlugin='.$wp_rewrite->preg_index(1)); 
     $newRules = $newRule + $rules; 
     return $newRules; 
    } 

    function add_query_vars($qvars) { 
     $qvars[] = 'MyPlugin'; 
     return $qvars; 
    } 

    function flush_rewrite_rules() { 
     global $wp_rewrite; 
     $wp_rewrite->flush_rules(); 
    } 

    function template_redirect_intercept() { 
     global $wp_query; 
     if ($wp_query->get('MyPlugin')) { 
      $this->pushoutput($wp_query->get('MyPlugin')); 
      exit; 
     } 
    } 

    function pushoutput($message) { 
     $this->output($message); 
    } 

    function output($output) { 
     header('Cache-Control: no-cache, must-revalidate'); 
     header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 

     // Commented to display in browser. 
     // header('Content-type: application/json'); 

     echo json_encode($output); 
    } 
} 

$MyPluginCode = new MyPlugin(); 
register_activation_hook(__file__, array($MyPluginCode, 'activate')); 

// Using a filter instead of an action to create the rewrite rules. 
// Write rules -> Add query vars -> Recalculate rewrite rules 
add_filter('rewrite_rules_array', array($MyPluginCode, 'create_rewrite_rules')); 
add_filter('query_vars',array($MyPluginCode, 'add_query_vars')); 

// Recalculates rewrite rules during admin init to save resourcees. 
// Could probably run it once as long as it isn't going to change or check the 
// $wp_rewrite rules to see if it's active. 
add_filter('admin_init', array($MyPluginCode, 'flush_rewrite_rules')); 
add_action('template_redirect', array($MyPluginCode, 'template_redirect_intercept')); 

Ho commentato le parti importanti, ma quello che ho fatto è stato sostanzialmente quella di spostare i ganci a use_filter anziché a add_action. Ho anche spostato i filtri nell'ordine in cui sono effettivamente utilizzati in Wordpress. Sembrava la cosa da fare in quel momento.

Infine, assicurati che i tuoi permalink siano impostati per utilizzare piuttosto URL. Ho avuto un problema in cui il mio era impostato su default, il che rende Wordpress ignorare le condizioni di riscrittura che altrimenti avrebbe bisogno di analizzare. Passa ad alcuni bei URL e le tue condizioni si aggiorneranno.

Fammi sapere se questo funziona per voi. Spero possa aiutare.

Grazie, Joe

+0

Grazie per questo, lo sto testando ora! Una domanda, quale sarebbe il modo corretto di testare le regole $ wp_rewrite per vedere se è attivo? – Brad

+0

Di solito è sufficiente richiamare l'URL senza riscrivere e con esso (/index.php?MyPlugin=foo e/MyPlugin/foo) e utilizzare un po 'di tentativi ed errori. In caso contrario, il codice di riscrittura è in wp-includes/rewrite.php. Tuttavia, non è bello né facile eseguire il debug con il codice in quel file. –

+0

so che questo è vecchio, ma mi chiedo se questo approccio possa ora essere aggiornato con flush_rewrite_rules() ora? – helgatheviking