2010-02-05 13 views
9

Ok, tengo este código que he estado usando para escupir noticias a una aplicación mía. Funcionó hasta hoy. He recortado toda la lógica en el siguiente código para hacerlo más simple. Pero debería "TRABAJAR" ¿Puede alguien ayudarme a arreglar este código donde funciona, y se hace bien? Sé que está pirateado, pero no pareció tener ningún problema hasta hoy. No he actualizado nada, no sé cuál es el trato.wp_rewrite en un complemento de 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

Básicamente, solo necesito poder tomar la entrada de una URL y generar algunos datos JSON. – Brad

Respuesta

20

me cambió un poco de su código en el proceso, pero esto funcionó para mí:

<?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')); 

he comentado las partes importantes, pero lo que hice fue básicamente para mover los ganchos a use_filter en lugar de add_action. También moví los filtros en el orden en que realmente se usan en Wordpress. Parecía lo que tenía que hacer en ese momento.

Finalmente, asegúrese de que sus enlaces permanentes estén configurados para usar URL bonitas. Tuve un problema donde los míos estaban configurados en forma predeterminada, lo que hace que Wordpress ignore las condiciones de reescritura que de otro modo tendría que analizar. Cambie a algunas URL bonitas y sus condiciones se actualizarán.

Avísame si eso te funciona. Espero que ayude.

Gracias, Joe

+0

¡Gracias por esto, lo estoy probando ahora! Una pregunta, ¿cuál sería una forma adecuada de probar las reglas de $ wp_rewrite para ver si está activa? – Brad

+0

Por lo general, basta con invocar su URL sin reescribir y con ella (/index.php?MyPlugin=foo y/MyPlugin/foo) y usar un poco de prueba y error. Si no, el código de reescritura está en wp-includes/rewrite.php. Sin embargo, no es fácil ni fácil depurar con el código en ese archivo. –

+0

Sé que esto es antiguo, pero me pregunto si este enfoque ahora se puede actualizar con flush_rewrite_rules() ahora? – helgatheviking

Cuestiones relacionadas