Probleme cu Regulile de Rescriere când regula include slug-ul paginii de start
Am o pagină Exemplu (ID=443, slug=example) care este configurată, prin Dashboard->Settings->Reading
, ca pagina de start a site-ului meu WP. De asemenea, am următoarea regulă de rescriere configurată:
[(example)/(view-section)] => index.php?pagename=$matches[1]&foo=1&bar=2
Am un shortcode în pagina Exemplu care ar trebui să genereze conținut bazat pe prezența și valoarea variabilelor de interogare foo
și bar
. Problema este că variabilele de interogare nu sunt setate corect când accesez URL-ul /example/view-section
(și altele asemănătoare, vezi mai jos).
Folosesc un plugin de testare pentru a depana această problemă. Codul complet este mai jos:
<?php
function test_shortcode() {
global $wp_rewrite;
echo '<pre>' . 'foo: ' . get_query_var('foo') . '</pre>';
echo '<pre>' . 'bar: ' . get_query_var('bar') . '</pre>';
echo '<pre>' . print_r($wp_rewrite->rules, true) . '</pre>';
}
add_shortcode('foobar', 'test_shortcode');
function test_rules() {
$rules = get_option('rewrite_rules');
if (!isset($rules['(example)/(view-section)'])) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
add_action('wp_loaded', 'test_rules');
function test_rewrite_rules($wprules) {
$rules = array('(example)/(view-section)' => 'index.php?pagename=$matches[1]&foo=1&bar=2');
return $rules + $wprules;
}
add_action('rewrite_rules_array', 'test_rewrite_rules');
function test_query_vars($query_vars) {
array_push($query_vars, 'foo');
array_push($query_vars, 'bar');
return $query_vars;
}
add_filter('query_vars', 'test_query_vars');
Există trei scenarii care au dat rezultate diferite:
- Accesarea /example/view-section redirecționează către / și variabilele de interogare sunt goale.
- Accesarea /index.php?pagename=example&foo=1&bar=2 funcționează așa cum am nevoie. Afișând conținutul generat de shortcode și valorile celor două variabile de interogare din URL.
- Dacă folosesc
page_id
în loc depagename
saupage
: /index.php?page_id=443&foo=1&bar=2, variabila de interogarepage_id
este eliminată și se afișează din nou pagina de start implicită.
Aș dori să știu de ce WP se comportă așa cum este descris mai sus și, dacă este posibil, cum să fac ca primul caz să funcționeze ca al doilea.
Rețineți că dacă pagina Exemplu nu este configurată ca pagina de start, cazurile 1 și 3 funcționează ca în cazul 2.
Apreciez ajutorul vostru și sunt dispus să ofer mai multe detalii dacă este necesar.
EDIT
Întrebarea inițială includea link-uri către o instanță WP funcțională cu un exemplu al problemei. Totuși, nu pot păstra acea instanță activă permanent, așa că am eliminat link-urile și am încercat să explic situația doar cu cuvinte.

Problema nu are legătură cu regulile de rescriere (deși aș sugera să folosiți add_rewrite_rule()
în loc să modificați direct array-ul de rescriere. Același lucru este valabil și pentru flush_rewrite_rules()
. De asemenea, deși așa cum aveți acum, regulile sunt reîmprospătate doar o singură dată - ar fi mai bine să faceți acest lucru la activarea plugin-ului, în loc să o faceți în interiorul unei condiționale care este verificată la fiecare încărcare de pagină.
... deci 'problema' este de fapt canonicalizarea. În esență, diverse URL-uri pot indica același conținut (inclusiv URL-uri cu doar slash-uri suplimentare). Ideea este că:
- Acest lucru nu este bun din perspectiva SEO - dacă motoarele de căutare nu realizează că toate aceste URL-uri reprezintă aceeași resursă, acestea ar putea ajunge să concureze între ele
- Nu este bun din perspectiva utilizatorului. Dacă merg la www.example.com?year=2012, ar fi mai bine să fie redirecționați către www.example.com/2012 - mai frumos și mai ușor de reținut.
Deci, când WordPress primește un URL 'rupt' sau 'duplicat', cum ar fi www.example.com?year=2012, acesta redirecționează către URL-ul corect (sau 'canonic'). (www.example.com/2012) în acest caz.
Unul dintre verificările pe care le face este dacă suntem pe 'pagina de start', iar dacă suntem - verifică dacă folosim URL-ul canonic pentru pagina noastră de start: http://108.166.64.229/ în cazul vostru. Dacă nu, sunteți redirecționat aici. Veți observa că http://108.166.64.229/example redirecționează și el acolo.
Puteți dezactiva acest lucru. Canonicalizarea rulează pe hook-ul template_redirect
. Deci puteți pur și simplu să o eliminați:
remove_filter('template_redirect', 'redirect_canonical');
Sau puteți să o 'anulați' (în cazul specific al paginii de start), folosind un hook care este utilizat în interiorul callback-ului redirect_canonical
:
add_filter('redirect_canonical', 'wpse51530_redirect_canonical', 10, 2);
function wpse51530_redirect_canonical($redirect_url, $requested_url){
if( is_front_page() )
return $requested_url;
else
return $redirect_url;
}
Puteți vedea cum face WordPress canonicalizarea aici.
