Özel yazı tipi ve taksonomiyi karıştırıp yeniden yapılanma yapıları?


30

Temel olarak, özel yazı türlerini kullanarak bir sözlük elde etmek istiyorum ve bazı sorunların olmasını istediğim gibi yeniden yazmam gerekiyor. Öyle istiyorum:

Ana sözlük URL’si: http://example.com/glossary/

A harfi ile başlayan sözlük terimleri : http://example.com/glossary/a/

Tek bir terimin adının URL'si: http://example.com/glossary/a/atomic/

Aslında aşağıdaki kodu kullanarak bunu başardım, ancak bunu yapmanın çok garip bir yol olduğuna eminim ve sayfaları görüntülerken yanlış şablonların çağrılmasının yanlış bir yerde olduğunu biliyorum. Archive-sumo-glossary-term.php'nin beklendiği gibi çağrıldığı http://example.com/glossary/ hariç , diğer ikisi sadece temamda index.php'yi etkinleştirir.

İşte gider ( functions.phptemada):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            '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('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            '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');

Yanıtlar:


30

template_includeİlgili filtre ile çağrılacak şablonu her zaman geçersiz kılabilirsiniz , ancak bu, özel arşivlerle ilgili daha derin sorunları gizleyebilir.

Anladığım kadarıyla, aşağıdaki yapıyı kullanmak istersiniz:

  • /glossary/tüm sumo-glossary-termyayınlar için bir arşiv sayfası olmalı
  • /glossary/[letter]/taksonomisi terimle mesajların için bir arşiv sayfası olmalıdır [letter]yılında sumo-glossary-lettertaksonomisinde
  • /glossary/[letter]/[term-name]/bireysel bir sumo-glossary-termyazı olmalı

Bu, birincinin şablonu archive-sumo-glossary-term.phpyükleyeceği taxonomy-sumo-glossary-letter.php, ikincinin yükleneceğini ve üçüncünün yükleneceği anlamına gelir single-sumo-glossary-term.php.

Bunu, WordPress 3.2'de, taksonomik yeniden yazma sümüklüp ve yazı tipi için hem yeniden yazma sümük hem de arşivleme sümüklü böcek ayarını ayarlayarak ve diğer yeniden yazma kurallarını açıkça ayarlayarak başardım. Ayrıca, önceliklerin doğru olduğundan emin olmak için ilk önce taksonomiyi ve ondan sonraki yazı tipini kaydettim (aksi halde bir URL , sözlük mektubunun 2. sayfası yerine /glossary/f/page/2sözlük terimine gider ).pagef

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

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            '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;
}

Bunu yarın deneyeceğim ve işe yarayıp yaramadığını görüp buraya döneceğim. Teşekkürler!
maryisdead

Tamam, tam olarak yarına değil ... İşe yaradı, neredeyse kusursuz! Teşekkür ederim! Çalışmayan şey /glossary/. Bana bir 404 verir ( archive-sumo-glossary-term.phpayarlandı). Herhangi bir fikir? WP 3.0.1'e takıldığımı söylemek zorundayım ve bu belki de bir sürüm sorunu. Yükseltme yapabildiğimde tekrar test etmeliyim. Her neyse, çoğunlukla çalışıyor ve şimdilik ihtiyacım yok /glossary/ve sadece A harfine yönlendiriyorum.
maryisdead

hey @maryisdead, Ben de aynı sorunu yaşadım ve aynı çözümü buldum, ama tamamen aynı sorununuz kaldı - arşiv-glossery.php şablonuna nasıl gidersiniz? Cevabı buldum - kullanın 'has_archive' => 'glossary', yerine has_archive => true Jan'ın cevabında böyle olduğunu fark ettim, fakat orijinal kodunuzda bu şekilde yok - bu bölümü güncellediniz mi? Bu değişikliği
Jeff

Selam Jeff! Evet, o bölümü güncelledi. Sadece tekrar kontrol ettim, hala çalışmıyor. Söz konusu WordPress kurulumu hala güncel değil (3.0.1), bu yüzden hala problemin kaynağı budur.
maryisdead

Burada da WP 3.2.1 kullanarak aynı sorun var. Hala çözüm yok mu?
Richard B

0

Bunu şahsen kullanmadım, ama bakmak isteyebileceğiniz şey "add_rewrite_rule"

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

Ayrıca, değiştirdikten sonra kalıcı bağlantıları kurtarmayı da unutmayın.


Aslında kullanıyorum add_rewrite_rule, kodumu aşağıya kaydır. :-) Şimdiye kadar iyi çalışıyor, sadece bu şekilde yapılıyor yanlış şablonlar çağrılır.
maryisdead
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.