Пользовательские правила перезаписи для страницы архива и отдельной записи

Я создаю сайт Wordpress с несколькими пользовательскими типами сообщений. Каждый тип сообщения - это другой журнал. У меня также есть обычная метаполя для журнала и выпуск журнала.

Я хотел бы иметь URL-адреса (used archive.php):

http://my_site/magazine/name/
http://my_site/magazine_name/year/
http://my_site/magazine_name/year/issue/

Я сделал это по коду:

function magazine_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})');
    add_rewrite_tag('%issue%', '([0-9])');
}
add_action('init', 'magazine_rewrite_tag', 10, 0);

и

function magazine_rewrite_rules() {
    add_rewrite_rule('^([a-z]+)/([0-9]{4})/([0-9])?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');
    add_rewrite_rule('^([a-z]+)/([0-9]{4})?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}
add_action('init', 'magazine_rewrite_rules');

У меня также есть пользовательские запросы в файле archive.php. И он отлично работает.

Но теперь мои URL-адреса для отдельных статей не работают. По умолчанию это:

http://my_site/magazine/post-title

, но он показывает все статьи из журнала, такие как url ​​(и использовал шаблон archive.php):

http://my_site/magazine/

Как правильно добавить правила перезаписи для отдельных настраиваемых сообщений? Возможно, я хотел бы иметь URL-адреса для отдельной записи (только для выбранных типов пользовательских сообщений) в этом формате:

http://my_site/magazine/year/issue/post-title
7 голосов | спросил Łukasz Florczak 14 J0000006Europe/Moscow 2016, 09:59:46

1 ответ


3

Я нашел решение! Плагин Analyzer Monkeyman Rewrite был очень полезен: https://wordpress.org/plugins/monkeyman-rewrite -analyzer /

Итак, теперь у меня есть такие рабочие URL ...

single.php:

/magazine-name/issue-year/issue/article-name

archive.php:

/magazine-name/issue-year/issue
/magazine-name/issue-year
/magazine-name

На странице пользовательского почтового редактора в wp-admin я использую плагин Advanced Custom Fields для выпуска и выпуска. Вы также можете определить мета-поля самостоятельно.

Далее я добавил теги rewrite для выпуска выпуска и выпуска:

function custom_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})' );
    add_rewrite_tag('%issue%', '([0-9]+)' );
}

add_action('init', 'custom_rewrite_tag');

Затем я добавил правила перезаписи для любой комбинации URL:

function custom_rewrite_rule() {
    // URL: /magazine/year/issue/title
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])/(.?.+?)?(:/([0-9]+))?/?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]&name=$matches[4]', 'top');

    // URL: /magazine/year/issue
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');

    // URL: /magazine/year
    add_rewrite_rule('^([^/]+)/([0-9]{4})?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}

add_action('init', 'custom_rewrite_rule');

В конце я заменяю стандартные URL-адреса для себя, с выпуском и выпуском

function custom_permalink($url, $post) {
    if ($post->post_type == 'magazine-name-1' || $post->post_type == 'magazine-name-2' || $post->post_type == 'magazine-name-2' ) {
        global $post;

        $post_type = $post->post_type;
        $issue_year = get_field('issue_year', $post->ID); // ACF; for meta: get_post_meta($post->ID, '$issue', true);
        $issue = get_field('issue', $post->ID); // ACF

        $url = str_replace( $post_type . '/', $post_type . '/' . $issue_year . '/' . $issue . '/' , $url);
    }
    return $url;
}
add_filter('post_type_link', 'custom_permalink', 10, 2);
ответил Łukasz Florczak 19 J0000006Europe/Moscow 2016, 18:48:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132