• Задача:
    Отображать полную структуру ссылок в адресной строке браузера для CPT.

    Дано:
    Плагин, который регистрирует POST_TYPE, TAXONOMY_CAT и TAXONOMY_TAG.
    POST_TYPE и TAXONOMY_CAT имеют одинаковый SLUG => services.
    Далее идут Пермалинки и правила перезаписи для TAXONOMY_CAT.

    Ожидания: Получать полную структуру URL всех вложенных термор на страницах записей.

    Результат:
    Имею 3 вложенных категории услуг. При переходе на страницу категории третьего уровня вложенности, получаю НУЖНЫЙ URL: http://wordpress.test/services/1/2/3/

    Проблема:
    Имею 3 поста, где:

    • пост1 относится к 1 категории;
    • пост2 относится к 1 и 2 категории;
    • пост3 относится к 1 и 2 и 3 категории;

    Если перейти на страницу пост3 или пост2, то получаю не полный URL: http://wordpress.test/services/1/post3/

    Проблема в том, что сам урл не полный, и к тому же отображает родителя.

    Я не программист, этот плагин давно писал и тоже долго мучался с этими пермалинками.
    К примеру если: заметить в 157 и 158 строке $terms[0] на $terms[1] или $terms[2], то структура отображается, только для заданного уровня вложенности.

    Подскажите, куда дальше копать. Или поделитесь решением. Я уже перепробовал другие подсказки, и там либо структура не полная, либо ещё какая-то херня. Того что нужно нет. Помогите.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • пост1 относится к 1 категории;
    пост2 относится к 1 и 2 категории;
    пост3 относится к 1 и 2 и 3 категории;

    В админке все эти категории отмечены или отмечена только последняя дочерняя категория?

    Проблема в том, что сам урл не полный, и к тому же отображает родителя.

    Наверное потому, что get_the_terms не выводит категории записи в соответствии с их структурой.

    Если у записи указано три категории, то вот так $terms[0]->term_id, можно получить как первую родительскую категорию, так и последнюю дочернюю.

    для get_term_parents_list нужно указать последнюю дочернюю категорию.

    • Ответ изменён 1 год, 10 месяцев назад пользователем qwert555.

    В админке все эти категории отмечены или отмечена только последняя дочерняя категория?

    Все три категории отмечены в админке для 3 поста. Две категории для второго поста и одна для первого поста. Сделал несколько скриншотов для наглядности.




    Если у записи указано три категории, то вот так $terms[0]->term_id, можно получить как первую родительскую категорию, так и последнюю дочернюю.

    У меня так и записано в строке 184.

    Вот полный фрагмент:

    add_filter( 'post_type_link', 'permalink_services_cat', 1, 2 );
    function permalink_services_cat( $permalink, $post ) {
    
    	if ( strpos( $permalink, 'services' ) === false) return $permalink;
    	$terms = get_the_terms( $post, 'cpt_services_cat' );
    
    	if ( !is_wp_error( $terms ) && !empty( $terms ) && is_object( $terms[0] )) {
    		$taxonomy_slug = get_term_parents_list( $terms[0]->term_id, 'cpt_services_cat', array(
    			'separator' => '/', 'format' => 'slug', 'link' => false, 'inclusive' => true
    		));
    		$taxonomy_slug = trim( $taxonomy_slug, '/' );
    	}
    
    	else {
    		$taxonomy_slug = 'sandbox';
    	}
    
    	return str_replace( 'services', 'services/' . $taxonomy_slug, $permalink );
    }

    Подскажите, что там не так.

    • Ответ изменён 1 год, 10 месяцев назад пользователем Anatolii Dimov.
    • Ответ изменён 1 год, 10 месяцев назад пользователем Anatolii Dimov.
    • Ответ изменён 1 год, 10 месяцев назад пользователем Anatolii Dimov.

    Примерно так, но это не точно

    function cpt_services_cat_slug($post_id) {
    
        $terms = get_the_terms($post_id, 'cpt_services_cat');
    
        if (!$terms) {
            return;
        }
    
        $parent = 0;
        $new_terms = [];
        for ($i = 0;$i < sizeof($terms);++$i) {
            foreach ($terms as $term) {
                if ($term->parent == $parent) {
                    $parent = $term->term_id;
                    $new_terms[$term->term_id] = $term->slug;
                }
            }
        }
    	
        return implode('/', $new_terms);
    }
    
    add_filter('post_type_link', 'permalink_services_cat', 1, 2);
    function permalink_services_cat($permalink, $post) {
    
        if ($post->post_type != 'services') {
            return $permalink;
        }
    
        $taxonomy_slug = cpt_services_cat_slug($post->ID);
    
        if ($taxonomy_slug) {
            return str_replace('services', 'services/' . $taxonomy_slug, $permalink);
        }
    
        return $permalink;
    
    }

    Если префикс services одинаковый у категорий и записей, то нужно еще проверять, что по этому урл показывать, а потом изменять запрос или оставлять как есть.

    Примерно так, но это не точно

    Огромное вам спасибо, вы очень помогли.
    Копипастом не сработало. Не много видоизменил и всё работает как надо.
    Теперь все УРЛЫ отображают полную структуру в соответствии с вложенными таксономиями.

    Полный код на GitHub.

    Решено.

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «Идеальное ЧПУ и полная структура?» закрыта для новых ответов.