Поддержка Проблемы и решения как убрать slug для произвольного типа записей из URL

  • Здравствуйте. Столкнулась с такой проблемой, необходимо для записей кастомного типа убрать slug post_type из url.
    сейчас url такой: http://my-website/services/lechenie/lechenie-kariesa/
    должно быть: http://my-website/lechenie/lechenie-kariesa/

    Пробовала в functions.php вставлять этот код:

    function custom_remove_cpt_slug( $post_link, $post, $leavename ) {
    
        if ( 'services' != $post->post_type || 'publish' != $post->post_status ) {
            return $post_link;
        }
    
        $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
    
        return $post_link;
    }
    add_filter( 'post_type_link', 'custom_remove_cpt_slug', 10, 3 );
    function custom_parse_request_tricksy( $query ) {
    
        // Only noop the main query
        if ( ! $query->is_main_query() )
            return;
    
        // Only noop our very specific rewrite rule match
        if ( 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
            return;
        }
    
        // 'name' will be set if post permalinks are just post_name, otherwise the page rule will match
        if ( ! empty( $query->query['name'] ) ) {
            $query->set( 'post_type', array( 'post', 'services', 'page' ) );
        }
    }
    add_action( 'pre_get_posts', 'custom_parse_request_tricksy' );

    url конечно меняет, но все записи этого типа 404 ошибку показывают. Может кто-то сталкивался с такой задачкой, помогите разобраться пожалуйста.

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Проблему удалось решить. Выкладываю решение на всякий случай, вдруг кому пригодится.

    function true_post_type_rewrite() {
    	global $wp_rewrite;
    	// в данном случае мой тип записей был - Услуги (services)
    	// этот код позволит перезаписать урлы
    	// параметры add_rewrite_tag('%название_тега%', '%маска_символов%', '%url_параметр%')
    	$wp_rewrite->add_rewrite_tag("%services%", '([^/]+)', "services=");
    	$wp_rewrite->add_permastruct('services', '%services%' );
    }
    add_action( 'init', 'true_post_type_rewrite');
    
    function true_rewrite_conflicts( $request ) {
    	if(!is_admin())
    		$request['post_type'] = array('services', 'post', 'page', 'blog', 'doctors'); // перечисляем типы записей с подобной структурой пермалинков
    	return $request;
    }
    add_filter( 'request',  'true_rewrite_conflicts' );

    Пересохраняем пермалинки в админке wp

    ta_tochka, я хочу от вас детей! Спасибище огромное! Помогло! А то я тут с этим ковыряюсь уже вторые сутки.

    Рада, что пригодилось решение. Помню, сама билась над этой задачкой несколько дней

    ta_tochka,единственное, что хотел спросить, что значит пересохранить пермалинки и как быть если slug-ов несколько, то есть множество кастомныз типов записей(как правильней структурировать код на вашей основе)

    нужно зайти в админку и выбрать пункт меню Настройки -> Постоянные ссылки и просто нажать сохранить. Так нужно делать всегда, если какие-то изменения вносите связанные с пермалинками.
    У меня там в примере тоже несколько разных кастомных типов записей, массивом передаются

    ta_tochka, спасибо. А я думал чего у меня 404 показывает почему, а тут оказывается вон в чем делюга. А вы работаете только на своем проекте? Модно узнать ваши контактные данные на всякий случай

Просмотр 6 ответов — с 1 по 6 (всего 6)
  • Тема «как убрать slug для произвольного типа записей из URL» закрыта для новых ответов.