Endpoint pentru permalink-uri în tipuri personalizate de postări
Am un tip de postare personalizat numit "destinații" și am setat masca EP pentru acest tip de postare la valoarea implicită EP_PERMALINK. Am adăugat câteva endpoint-uri după cum urmează:
add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
$vars[] = "tours";
$vars[] = "activities";
return $vars;
}
add_action('init', 'add_endpoints');
function add_endpoints(){
global $wp_rewrite;
add_rewrite_endpoint('tours', EP_PERMALINK);
add_rewrite_endpoint('activities', EP_PERMALINK);
$wp_rewrite->flush_rules();
}
Când testez acest lucru pe o postare normală, acesta redirecționează către template-ul de care am nevoie (am un redirect pentru template în single template hook)
ex. siteulmeu.com/test-category/test/activities/
Dar pentru tipul de postare (care este ierarhic) doar elimină endpoint-ul din URL și rămâne pe template-ul single-destination.php
ex. siteulmeu.com/destination/africa-de-sud/parcul-național-kruger/activities/
devine
siteulmeu.com/destination/africa-de-sud/parcul-național-kruger/
Orice ajutor sau îndrumare ar fi foarte apreciată. Mă chinui cu asta de ore întregi fără niciun rezultat :(
Mulțumesc

Câteva lucruri importante. În primul rând, numele funcțiilor trebuie să fie prefixate cu ceva unic. WordPress este un ecosistem mare și cineva a folosit deja toate numele generice de funcții la care te-ai putea gândi.
În al doilea rând, add_rewrite_endpoint
se ocupă de adăugarea variabilelor de interogare pentru tine. Deci nu ai nevoie de asta:
add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
$vars[] = "tours";
$vars[] = "activities";
return $vars;
}
Resetarea regulilor de rescriere la fiecare încărcare nu este o idee bună. Acest lucru trebuie făcut o singură dată după ce ai adăugat regulile tale. De exemplu, la activarea plugin-ului. Deci funcția ta add_endpoints
ar putea fi scurtată astfel (cu un nume mai bun conform punctului unu de mai sus).
<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint('tours', EP_PERMALINK);
add_rewrite_endpoint('activities', EP_PERMALINK);
}
Ceea ce funcționează bine pentru articole. Dacă vrei să funcționeze pentru pagini sau pentru orice alt tip de postare ierarhică, va trebui să folosești masca de endpoint EP_PAGES
.
<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint('tours', EP_PAGES);
add_rewrite_endpoint('activities', EP_PAGES);
}
Dar asta tot nu va funcționa așa cum te aștepți. Endpoint-urile setează variabila lor de interogare egală cu orice vine după ele. Deci dacă URL-ul tău este...
yoursite.com/some-country/some-city/activities/asdf
variabila de interogare 'activities' va fi 'asdf'. Dacă nu urmează nimic după activities
, variabila ta de interogare va fi goală (dar setată), deci va fi întotdeauna evaluată ca fals atunci când încerci să o prinzi...
<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
if( get_query_var( 'tours' ) )
{
// fă ceva!
exit();
}
}
Poți ocoli acest lucru prin filtrarea request
și schimbarea valorii variabilelor tours și activities în true dacă sunt setate.
<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
if( isset( $vars['tours'] ) ) $vars['tours'] = true;
if( isset( $vars['activities'] ) ) $vars['activities'] = true;
return $vars;
}
Ar trebui să arunci o privire la acest ghid pentru Rewrite API pe care l-am scris. Părțile relevante pentru întrebarea ta sunt rezumate mai sus, totuși.

Mulțumesc pentru răspunsul minunat! Am făcut modificările conform postării și ghidului tău. Dar se pare că WordPress redirecționează/elimină endpoint-ul și orice variabile după încărcarea URL-ului. Nu sunt sigur dacă este o redirecționare canonică sau altceva. Dar elimină doar endpoint-urile înregistrate. Dacă adaug ceva arbitrar la sfârșitul URL-ului, primesc o eroare 404. Dar "tours" sau "activities" sunt eliminate sau redirecționate către URL-ul destinației individuale. :(

Se pare că am găsit problema. Are legătură cu setările de permalink. Aveam o setare personalizată - /%category%/%postname%/. Dar dacă o setez doar la /%postname%/, funcționează, nu sunt încă sigur de ce, dar voi investiga. Mulțumesc \0/

Ar trebui să încerci să revii la /%category%/%postname%/ acum și s-ar putea să funcționeze din nou. Bănuiesc că motivul pentru care WP elimina elementele tale era pentru că trebuia să resetezi regulile de rescriere. (Poate.)

Aveam și eu o setare personalizată pentru permalink-uri. Am mers la Setări Permalink-uri și am dat clic pe Salvează modificări fără a schimba nimic, iar apoi endpoint-ul a funcționat.
