Combinarea structurilor de rescriere pentru tipuri de postări personalizate și taxonomii?

25 iun. 2011, 18:03:17
Vizualizări: 26.2K
Voturi: 32

În principiu vreau să creez un glosar folosind tipuri de postări personalizate și am probleme cu configurarea rescrierii URL-urilor în modul dorit. Vreau să obțin următoarea structură:

URL-ul principal al glosarului: http://example.com/glossary/

Termenii din glosar care încep cu litera A: http://example.com/glossary/a/

URL-ul pentru un termen individual din glosar: http://example.com/glossary/a/atomic/

Am reușit de fapt să obțin acest lucru folosind codul de mai jos, dar sunt sigur că este o modalitate foarte stângace de a face acest lucru și știu că undeva nu funcționează corect deoarece sunt apelate șabloanele greșite la vizualizarea paginilor. Cu excepția http://example.com/glossary/, unde archive-sumo-glossary-term.php este apelat conform așteptărilor, celelalte două activează doar index.php în tema mea.

Iată codul (în functions.php din temă):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Termeni Glosar', 'nume general tip postare'),
                'singular_name' => _x('Termen Glosar', 'nume singular tip postare')
                # Și așa mai departe ...
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Litere', 'nume general taxonomie'),
                'singular_name' => _x('Literă', 'nume singular taxonomie')
                # Și așa mai departe
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
0
Toate răspunsurile la întrebare 2
8
35

Puteți întotdeauna să suprascrieți șablonul care va fi apelat cu filtrul template_include sau un filtru similar, dar acest lucru ar putea ascunde probleme mai profunde cu arhivele personalizate.

După cum am înțeles, doriți să utilizați următoarea structură:

  • /glossary/ ar trebui să fie o pagină de arhivă pentru toate articolele de tip sumo-glossary-term
  • /glossary/[litera]/ ar trebui să fie o pagină de arhivă pentru articolele cu termenul de taxonomie [litera] în taxonomia sumo-glossary-letter
  • /glossary/[litera]/[nume-termen]/ ar trebui să fie un articol individual de tip sumo-glossary-term

Aceasta înseamnă că prima va încărca șablonul archive-sumo-glossary-term.php, a doua va încărca taxonomy-sumo-glossary-letter.php, iar a treia va încărca single-sumo-glossary-term.php.

Am realizat acest lucru în WordPress 3.2 prin setarea explicită a slug-ului de rescriere pentru taxonomie și atât a slug-ului de rescriere cât și a slug-ului de arhivă pentru tipul de postare, fără alte reguli de rescriere. De asemenea, am înregistrat mai întâi taxonomia și apoi tipul de postare, pentru a mă asigura că prioritățile sunt corecte (în caz contrar, un URL precum /glossary/f/page/2 ar merge la termenul de glosar page în loc de pagina 2 a literei de glosar f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Litere', 'nume general taxonomie'),
                'singular_name' => _x('Literă', 'nume singular taxonomie')
                # Și așa mai departe
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Termeni Glosar', 'nume general tip postare'),
                'singular_name' => _x('Termen Glosar', 'nume singular tip postare')
                # Și așa mai departe …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}
9 iul. 2011 15:43:12
Comentarii

Voi încerca asta mâine și voi vedea dacă funcționează, apoi revin cu feedback. Mulțumesc!

maryisdead maryisdead
9 iul. 2011 19:37:47

Ok, nu chiar mâine... A funcționat, aproape perfect! Mulțumesc!

Ceea ce nu funcționează este /glossary/. Îmi dă eroare 404 (archive-sumo-glossary-term.php este configurat). Aveți idei? Trebuie să menționez că sunt blocat pe WP 3.0.1 și poate fi o problemă de versiune. Va trebui să testez din nou când voi putea face upgrade.

Oricum, în mare parte funcționează și pentru moment nu am nevoie neapărat de /glossary/, ci doar de redirecționare către litera A. Mulțumesc din nou!

maryisdead maryisdead
16 iul. 2011 17:40:44

hei @maryisdead, am avut exact aceeași problemă și am ajuns la exact aceeași soluție, dar am rămas cu exact aceeași dilemă - cum faci ca /glossary să folosească template-ul archive-glossery.php? Tocmai am găsit răspunsul - folosește 'has_archive' => 'glossary', în loc de has_archive => true

Abia acum am observat că Jan are asta în răspunsul său, dar tu nu ai implementat partea asta în codul tău original - ai actualizat-o? La mine a început să funcționeze imediat ce am făcut modificarea

Jeff Jeff
9 feb. 2012 02:01:11

Hei Jeff! Da, am actualizat acea parte. Am verificat din nou, încă nu funcționează. Instalarea WordPress în cauză nu este încă la zi (versiunea 3.0.1), deci probabil că aceasta este în continuare cauza problemei.

maryisdead maryisdead
11 feb. 2012 15:50:20

Aceeași problemă aici, folosesc WP 3.2.1. Încă nu există o soluție?

Richard B Richard B
5 mar. 2012 17:42:32

Cod încă relevant - încă îl folosesc ca soluție principală pentru a obține această structură.

O întrebare: dacă există un articol creat care nu are niciun termen de taxonomie atribuit (astfel încât URL-ul ar arăta ca customposttypeslug/postslug) - primesc o eroare 404. Există vreo metodă (probabil prin reguli de permalink) pentru a face ca acest lucru să funcționeze și în acest caz?

Gerben van Dijk Gerben van Dijk
27 mai 2014 12:12:52

FUNCȚIONEAZĂ PERFECT! Ordinea înregistrării taxonomiei și CPT a fost cheia în cazul meu.

FullStack Alex FullStack Alex
19 sept. 2019 06:50:51

Încă funcționează excelent. Creez postări programatic, iar filtrul post_type_link este declanșat atunci când folosesc wp_insert_post(). Dar am reușit să rezolv această problemă definind guid atunci când am folosit wp_insert_post().

Daan van den Bergh Daan van den Bergh
2 mar. 2025 16:07:32
Arată celelalte 3 comentarii
1

Nu am folosit personal acest lucru, dar poate doriți să vă uitați la "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

de asemenea, nu uitați să salvați permalink-urile după ce le-ați modificat.

29 iun. 2011 21:57:41
Comentarii

Eu folosesc de fapt add_rewrite_rule, doar derulează codul meu până la final. :-) Funcționează bine până acum, singura problemă este că se încarcă template-urile greșite cu această metodă.

maryisdead maryisdead
30 iun. 2011 07:25:18