Cum pot emula comportamentul permalink-urilor pe pagini statice

4 sept. 2013, 20:05:57
Vizualizări: 144
Voturi: 0

Lucrez la un site WordPress care afișează rezultate de la un API de Evenimente pe o anumită pagină.

Pagina se află la /whats-on.

Doresc să ofer link-uri pe pagină care să fie formate ca mysite.com/whats-on/numele-evenimentului și care să ducă către o altă pagină ce afișează detaliile evenimentului. Dacă adaug simplu link-urile, WordPress va încerca să găsească un post cu numele 'numele-evenimentului' și va afișa o eroare 404.

Există vreo metodă de a ocoli acest comportament? Cum aș putea adăuga rewrite rules dintr-un plugin?

COD ACTUALIZAT:

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"; // numele variabilei așa cum apare în URL
        return $vars;
    }

    public function properties_add_rewrite_rules() {
        //Înlocuiește your_page_id cu ID-ul paginii 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
Toate răspunsurile la întrebare 1
8

Trebuie să adăugați reguli de rescriere și query_vars pentru a se potrivi nevoilor dumneavoastră.

De exemplu. În functions.php sau fișierul de plugin:

// Înregistrează variabile noi pentru a fi folosite în regulile de rescriere
add_filter('query_vars', 'properties_add_query_vars');
function properties_add_query_vars( $vars) {
    $vars[] = "my_action"; // numele variabilei așa cum apare în URL
    return $vars;
}

// Adaugă noua regulă de rescriere la cele existente
add_action('init','properties_add_rewrite_rules');
function properties_add_rewrite_rules() {
    //Înlocuiește your_page_id cu ID-ul paginii whats-on
    add_rewrite_rule( 'whats-on/(.+)/?$' , 'index.php?page_id=your_page_id&my_action='.$matches[1] , 'top' );
}

Apoi în template-ul pentru pagina whats-on (crează un fișier de template page-whats-on.php, vezi aici):

global $wp_query;
if(isset($wp_query->query_vars('my_action')) && $wp_query->query_vars('my_action') == 'some_action'){
    //Fă ce dorești
}

Nu uita să resetezi regulile de rescriere înainte de a testa noile reguli. Poți face asta mergând la setări->legături permanente și apăsând pe butonul Salvează.

EDITARE

În întrebarea ta actualizată ai câteva probleme în cod.

  1. A existat o eroare în codul meu, unde variabila de interogare pentru pagină este page_id și am scris doar p. Îmi cer scuze pentru asta.
  2. Regulile de rescriere și variabilele personalizate de interogare ar trebui adăugate pe acțiunea init, doar flush_rewrite_rules(); ar trebui să ruleze doar pe acțiunea de activare din motive de performanță (am pus și eu o întrebare legată).

Am testat acest cod și funcționează:

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"; // numele variabilei așa cum apare în URL
        return $vars;
    }

    public function add_rewrite_rules() {
        //Înlocuiește your_page_id cu ID-ul paginii 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') );

Acum trebuie să verifici când variabila de interogare event este prezentă. În cazul tău, cred că, așa cum am spus mai înainte, cel mai bun mod de a face această verificare este în template-ul paginii. Poți crea un template specific pentru pagina ta cu ID-ul 8. Creează doar un fișier page-8.php și pune-l în folderul temei tale (poți să îl pui și într-un folder de plugin dar asta necesită muncă în plus). În page-8.php poți face ceva de genul:

<?php
  get_header();

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

  get_footer();
 ?>

Acum dacă mergi la yoursite.com/whats-on/event/ vei obține "Test" afișat.

4 sept. 2013 21:00:52
Comentarii

Mulțumesc. Codul de mai sus este destinat să fie introdus în functions.php al temei? Cum aș putea face asta într-un plugin? De asemenea, nu sunt sigur de ce aș avea nevoie de wp_query? Nu interoghez baza de date.

codecowboy codecowboy
4 sept. 2013 22:33:35

Prima bucată de cod se introduce în functions.php sau într-un fișier de plugin. A doua bucată de cod trebuie să fie introdusă preferabil într-un fișier de template specific pentru pagina ta /whats-on. Am folosit $wp_query pentru a verifica dacă variabila personalizată de interogare este setată și pentru a obține valoarea ei, nu pentru a interoga baza de date. După verificare, poți interoga direct baza de date sau orice altceva dorești să faci. Te rog să notezi că aceste recomandări sunt pentru că ai cerut rescrierea specifică pentru pagina /whats-on.

cybmeta cybmeta
4 sept. 2013 22:42:02

Am actualizat întrebarea cu niște cod. Tot primesc eroarea 404 când accesez mysite.com/whats-on/numele-evenimentului. Poți să identifici ce am greșit? Am stat treaz multe ore :-/. Am resetat regulile de rescriere.

codecowboy codecowboy
4 sept. 2013 23:51:38

Vezi, răspunsul meu actualizat.

cybmeta cybmeta
5 sept. 2013 02:01:27

Mulțumesc din nou. Am ajuns puțin mai departe. Totuși, acele resetări de rewrite nu par să funcționeze și trebuie să salvez manual în setările de permalinkuri.

codecowboy codecowboy
5 sept. 2013 09:54:45

Da, tocmai am observat asta, dar odată ce setările de permalinkuri au fost resetate manual, funcționează, nu-i așa?

cybmeta cybmeta
5 sept. 2013 11:23:48

da, mergând la legături permanente->salvare funcționează.

codecowboy codecowboy
5 sept. 2013 11:27:04

Deci este rezolvat, cred că ar trebui să accepți răspunsul meu și să îl marchezi ca corect. Nu știu de ce flush_rewrite_rules(); nu este declanșat la activare, eu doar am urmat documentația. Voi urmări întrebarea pe care ai deschis-o despre asta.

cybmeta cybmeta
5 sept. 2013 11:42:49
Arată celelalte 3 comentarii