Cum pot emula comportamentul permalink-urilor pe pagini statice
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') );

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.
- A existat o eroare în codul meu, unde variabila de interogare pentru pagină este
page_id
și am scris doarp
. Îmi cer scuze pentru asta. - 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.

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.

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.

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.

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.

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