Змішуючи власні типи повідомлень та тип таксономії переписують структури?


30

В основному я хочу досягти словника, використовуючи спеціальні типи публікацій, і у мене виникли деякі проблеми з налаштуванням переписувань так, як я хочу. Я хочу так:

Основна URL-адреса глосарію: http://example.com/glossary/

Терміни словника, що починаються з літери А : http://example.com/glossary/a/

URL-адреса одного терміна глосарію: http://example.com/glossary/a/atomic/

Я насправді досяг цього за допомогою наведеного нижче коду, але я впевнений, що це дуже незручно це зробити, і я знаю, що він десь несправно працює, оскільки під час перегляду сторінок викликаються неправильні шаблони. За винятком http://example.com/glossary/ , де архів-сумо-глосарій-термін.php викликається так, як очікувалося, інші два просто активують index.php у моїй темі.

Ось ( functions.phpу темі):

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');

Відповіді:


30

Ви завжди можете замінити шаблон, який буде викликаний за template_includeдопомогою відповідного фільтра, але це може приховати більш глибокі проблеми з користувацькими архівами.

Як я розумію, ви хочете використовувати таку структуру:

  • /glossary/має бути сторінкою архіву для всіх sumo-glossary-termпублікацій
  • /glossary/[letter]/повинна бути архівною сторінкою для постів із терміном таксономії [letter]в sumo-glossary-letterсистематиці
  • /glossary/[letter]/[term-name]/повинна бути індивідуальною sumo-glossary-termпосадою

Це означає, що перший завантажить шаблон archive-sumo-glossary-term.php, другий завантажить taxonomy-sumo-glossary-letter.php, а третій завантажитьsingle-sumo-glossary-term.php .

Я домігся цього в WordPress 3.2, чітко встановивши таксономію перезаписуючої слиги, і переписуючий слуг, і архівний слуг для типу публікації, і ніяких інших правил перезапису. Також я зареєстрував таксономію спочатку та тип посади після неї, щоб переконатися, що пріоритети були правильними (інакше URL-адреса на зразок /glossary/f/page/2переходить до терміна-словника pageзамість сторінки 2 словника словника f).

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;
}

Я спробую це завтра і побачу, чи не вдасться це, і повернусь сюди. Спасибі!
maryisdead

Гаразд, не зовсім завтра… Це спрацювало, майже ідеально! Дякую! Те, що не працює, - це те, що не працює /glossary/. Дає мені 404 ( archive-sumo-glossary-term.phpвстановлюється). Будь-які ідеї? Слід сказати, що я затримався на WP 3.0.1, і це, можливо, проблема з версією. Треба перевірити його ще раз, коли мені вдасться оновити. У будь-якому випадку, здебільшого це працює, і я зараз не обов'язково потребую, /glossary/а просто перенаправляю на лист А. Дякую ще раз!
maryisdead

Ей @maryisdead, у мене була та сама проблема, і я придумав таке саме рішення, але залишився з точно такою ж проблемою - як у вас / глосарій перейти до шаблону архів-glossery.php? Я щойно знайшов відповідь - використовуй 'has_archive' => 'glossary', замість цього has_archive => true я щойно помітив, що Ян має це так у своїй відповіді, але ти не маєш цього у своєму початковому коді - ти оновив цю частину? Це почало працювати для мене, як тільки я змінив цю зміну
Джефф

Гей Джеф! Так, оновлено цю частину. Просто перевірено ще раз, все ще не працює. Проблема встановлення WordPress досі не актуальна (3.0.1), тому, можливо, це все ще є коренем проблеми.
maryisdead

Тут же проблема, використовуючи WP 3.2.1. Все ще немає рішення?
Річард Б

0

Я особисто не використовував це, але те, що ви можете подивитися, це "add_rewrite_rule"

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

також не забудьте зберегти постійні посилання, як тільки ви їх змінили.


Я фактично використовую add_rewrite_rule, просто прокручуйте код донизу. :-) Наразі це працює нормально, лише невірно шаблони називаються таким способом.
maryisdead
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.