Come emulare il comportamento dei permalink su pagine statiche

4 set 2013, 20:05:57
Visualizzazioni: 144
Voti: 0

Sto lavorando a un sito WordPress che mostra risultati da un'API Eventi su una pagina specifica.

La pagina si trova su /whats-on.

Voglio fornire link nella pagina formattati come mysite.com/whats-on/nome-dell-evento che puntino a un'altra pagina con i dettagli dell'evento. Se aggiungo semplicemente i link, WordPress cercherà un post con il nome 'nome-dell-evento' e mostrerà un errore 404.

Esiste un modo per bypassare questo comportamento? Come potrei aggiungere rewrite rules da un plugin?

CODICE AGGIORNATO:

class SpektrixPlugin {

    public function activate() {
        global $wp_rewrite;
        flush_rewrite_rules();
        add_action('init',array($this, 'properties_add_rewrite_rules'));
        add_filter('query_vars', array($this, 'properties_add_query_vars'));
    }

    public function properties_add_query_vars( $vars) {
        $vars[] = "event"; // nome della variabile come appare nell'URL
        return $vars;
    }

    public function properties_add_rewrite_rules() {
        //Sostituisci your_page_id con l'ID della pagina whats-on
        add_rewrite_rule( 'whats-on/(.+)/?$' , 'index.php?p=8&event='.$matches[1] , 'top' );
    }

    public function spektrix_list_events() {
        $api = new SpektrixApiClient();
        return $api->getAllEvents();
    }
}

$SpektrixEvents = new SpektrixPlugin();

register_activation_hook( __file__, array($SpektrixEvents, 'activate') );
0
Tutte le risposte alla domanda 1
8

Devi aggiungere regole di riscrittura e i query_vars per adattarli alle tue esigenze.

Ad esempio. Nel tuo functions.php o file del plugin:

// Registra nuove variabili da utilizzare nelle regole di riscrittura
add_filter('query_vars', 'properties_add_query_vars');
function properties_add_query_vars( $vars) {
    $vars[] = "my_action"; // nome della variabile come appare nell'URL
    return $vars;
}

// Aggiungi la nuova regola di riscrittura a quelle esistenti
add_action('init','properties_add_rewrite_rules');
function properties_add_rewrite_rules() {
    //Sostituisci your_page_id con l'ID della pagina whats-on
    add_rewrite_rule( 'whats-on/(.+)/?$' , 'index.php?page_id=your_page_id&my_action='.$matches[1] , 'top' );
}

E poi nel template per la pagina whats-on (crea un file template page-whats-on.php, vedi qui):

global $wp_query;
if(isset($wp_query->query_vars('my_action')) && $wp_query->query_vars('my_action') == 'some_action'){
    //Fai ciò che vuoi
}

Non dimenticare di svuotare le regole di riscrittura prima di provare le nuove regole. Puoi farlo andando in impostazioni->permalink e cliccando sul pulsante Salva.

MODIFICA

Nella tua domanda aggiornata ci sono alcuni problemi nel codice.

  1. C'era un errore nel mio codice, dove la query var per la pagina è page_id e ho scritto solo p. Scusami per questo.
  2. Le regole di riscrittura e le query var personalizzate dovrebbero essere aggiunte sull'hook init, solo il flush_rewrite_rules(); dovrebbe essere eseguito solo sull'hook di attivazione per motivi di performance (ho fatto una domanda correlata io stesso).

Ho testato questo codice e funziona:

class SpektrixPlugin {

    public function __construct(){
        add_filter('query_vars', array($this, 'add_query_vars'));
        add_action('init', array($this, 'add_rewrite_rules'));
    }

    public function activate() {
        flush_rewrite_rules();
    }

    public function deactivate() {
        flush_rewrite_rules();
    }

    public function add_query_vars($vars) {
        $vars[] = "event"; // nome della variabile come appare nell'URL
        return $vars;
    }

    public function add_rewrite_rules() {
        //Sostituisci your_page_id con l'ID della pagina whats-on
        add_rewrite_rule( 'whats-on/(.+)/?$' , 'index.php?page_id=8&event=$matches[1]' , 'top' );
    }

    public function spektrix_list_events() {
       //$api = new SpektrixApiClient();
       //return $api->getAllEvents();
       return 'Test';
    }
}

$SpektrixEvents = new SpektrixPlugin();

register_activation_hook( __file__, array($SpektrixEvents, 'activate') );
register_deactivation_hook( __file__, array($SpektrixEvents, 'deactivate') );

Ora devi verificare quando è presente la query var event. Nel tuo caso, penso che, come ho detto prima, il modo migliore per fare questo controllo sia nel template della pagina. Puoi creare un template specifico per la tua pagina con ID 8. Basta creare un file page-8.php e metterlo nella cartella del tuo tema (puoi anche metterlo in una cartella di un plugin ma questo richiede lavoro extra). In page-8.php puoi fare qualcosa del genere:

<?php
  get_header();

  global $wp_query;
  if($wp_query->get('event') == 'event'){
       echo $SpektrixEvents->spektrix_list_events();
  }

  get_footer();
 ?>

Ora se vai su yoursite.com/whats-on/event/ vedrai stampato "Test".

4 set 2013 21:00:52
Commenti

Grazie. Il codice sopra va inserito nel functions.php del tema? Come potrei farlo in un plugin? Inoltre non sono sicuro del perché avrei bisogno di wp_query? Non sto effettuando query al database.

codecowboy codecowboy
4 set 2013 22:33:35

Il primo pezzo di codice va nel functions.php o in un file di plugin. Il secondo pezzo di codice deve andare preferibilmente in un file template specifico per la tua pagina /whats-on. Ho usato $wp_query per verificare se la variabile della query personalizzata è impostata e ottenere il suo valore, non per interrogare il database. Dopo il controllo puoi interrogare direttamente il database o fare qualsiasi altra cosa tu voglia. Nota che queste raccomandazioni sono perché hai chiesto di riscrivere per la pagina specifica /whats-on.

cybmeta cybmeta
4 set 2013 22:42:02

Ho aggiornato la domanda con del codice. Ottengo ancora un 404 quando vado su mysite.com/whats-on/nome-dell-evento. Riesci a vedere qualcosa che ho sbagliato? Sono stato sveglio per molte ore :-/. Ho resettato le regole di rewrite

codecowboy codecowboy
4 set 2013 23:51:38

Vedi, la mia risposta aggiornata.

cybmeta cybmeta
5 set 2013 02:01:27

Grazie ancora. Sono andato un po' più avanti. Tuttavia, quei flush delle rewrite non sembrano funzionare e devo salvare manualmente nelle impostazioni dei permalink.

codecowboy codecowboy
5 set 2013 09:54:45

Sì, l'ho appena notato, ma una volta che le impostazioni dei permalink sono state aggiornate manualmente, funziona, giusto?

cybmeta cybmeta
5 set 2013 11:23:48

sì, andando su permalink->salva funziona.

codecowboy codecowboy
5 set 2013 11:27:04

Quindi è fatto, penso che dovresti accettare la mia risposta e contrassegnarla come corretta. Non so perché il flush_rewrite_rules(); non venga attivato all'attivazione, io seguo semplicemente la documentazione. Seguirò la domanda che hai aperto a riguardo.

cybmeta cybmeta
5 set 2013 11:42:49
Mostra i restanti 3 commenti