Endpoint pentru permalink-uri în tipuri personalizate de postări

14 feb. 2012, 15:42:56
Vizualizări: 16.2K
Voturi: 8

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

0
Toate răspunsurile la întrebare 1
6
27

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.

14 feb. 2012 16:56:29
Comentarii

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. :(

Charl Pretorius Charl Pretorius
15 feb. 2012 10:35:42

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/

Charl Pretorius Charl Pretorius
15 feb. 2012 11:27:41

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.)

chrisguitarguy chrisguitarguy
15 feb. 2012 16:49:30

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.

yitwail yitwail
11 feb. 2013 10:29:29

Asta m-a ajutat foarte mult! Mulțumesc mult frate!

fdrv fdrv
23 iul. 2018 21:48:59

Încă o întrebare, cum pot adăuga un endpoint pentru un custom post type și să-l adaug și în sitemap, astfel încât Google să știe că am și o pagină suplimentară pentru acel post.

fdrv fdrv
23 iul. 2018 21:51:57
Arată celelalte 1 comentarii