Поддержка Проблемы и решения Кастомный тип постов. ЧПУ

  • 3.4-alpha-20291 TwentyTen
    При выборе ЧПУ _http://example.com/%postname%, УРЛ получается таким _http://example.com/custom_post_type/%postname%, стоит задача избавится от custom_post_type в УРЛе. Случайно обнаружил такую возможность:

    function wikicms_create_cpt() {
        register_post_type( 'topic'
    	.
            .
    	'rewrite' => array(
    	    'slug' => '/', //Ключевое место
    	    'with_front' => false
    	    ),
    	.
    }
    add_action( 'init', 'wikicms_create_cpt', 0 );

    Все работает как полагается, но страницы начинают отдавать 404. Если закомментировать add_action( 'init', 'wikicms_create_cpt', 0 ); + обращение к сайту, и следом раскомментировать, без обновления структуры ЧПУ, то все работает как хочется.
    Вопрос в следующем, имеется ли иной способ убрать из УРЛ custom_post_type и не похожа ли такая ситуация на баг?

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Если закомментировать add_action( 'init', 'wikicms_create_cpt', 0 ); + обращение к сайту, и следом раскомментировать, без обновления структуры ЧПУ, то все работает как хочется.

    У меня заработало только после обновления ЧПУ, как и ожидал. Надеюсь, к действию init не привязан вызов flush_rewrite_rules()?

    имеется ли иной способ убрать из УРЛ custom_post_type

    Да, немного более громоздкий:

    function wikicms_create_cpt() {
    	register_post_type( 'topic', array(
    		.
    		.
    		'rewrite' => array(
    		    'slug' => '/%topic%/', // Ключевое место
    		    'with_front' => false
    		),
    		.
    	) );
    }
    add_action( 'init', 'wikicms_create_cpt' );
    ...
    function remove_trailing_slug_from_topic_permalinks($post_link, $post) {
    	if ( 'topic' != $post->post_type )
    		return $post_link;
    
    	return preg_replace( '#/[^/]+/$#', '', $post_link );
    }
    add_filter( 'post_type_link', 'remove_trailing_slug_from_topic_permalinks', 10, 2 );

    Зато похожим методом можно добавить в ссылки дату, как для обычных записей:

    function wikicms_create_cpt() {
    	register_post_type( 'topic', array(
    		.
    		.
    		'rewrite' => array(
    		    'slug' => '/%year%/%monthnum%/%day%/%topic%/', // Ключевое место
    		    'with_front' => false
    		),
    		.
    	) );
    }
    add_action( 'init', 'wikicms_create_cpt' );
    ...
    function add_date_to_topic_permalinks($post_link, $post) {
    	if ( 'topic' != $post->post_type )
    		return $post_link;
    
    	$post_link = preg_replace( '#/[^/]+/$#', '', $post_link );
    
    	$post_date = strtotime( $post->post_date );
    	$post_link = str_replace( '%year%', date( 'Y', $post_date ), $post_link );
    	$post_link = str_replace( '%monthnum%', date( 'm', $post_date ), $post_link );
    	$post_link = str_replace( '%day%', date( 'd', $post_date ), $post_link );
    
    	return $post_link;
    }
    add_filter( 'post_type_link', 'add_date_to_topic_permalinks', 10, 2 );

    не похожа ли такая ситуация на баг?

    Пока нет 🙂

    УРА! Сергей, от моего скромного лица выражаю Вам огромную благодарность! :))
    Помучился я правда с 404, пока не вспомнил, что шаблона нет для CPT ‘topic’, а фильтр для WP_Query работал только на is_home()
    —-

    к действию init не привязан вызов flush_rewrite_rules()

    Нет, ЧПУ обновлял в админпанели.

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «Кастомный тип постов. ЧПУ» закрыта для новых ответов.