Удалить базовый слаг из иерархического пользовательского типа записи - PullRequest
0 голосов
/ 19 сентября 2018

Cheers,

по причинам SEO, я пытаюсь удалить базовый фрагмент моего настраиваемого типа поста иерархического сервиса (пример имени: "custom-service").Этот метод называется SEO силосование.Я пробовал разные методы, чтобы получить следующий URL-адрес.

Как это не должно выглядеть:

https://foo.bar/custom-service/seo-agency/

https://foo.bar/custom-service/seo-agency/seo-workshop/

https://foo.bar/custom-service/foobar-agency/

https://foo.bar/custom-service/foobar-agency/foobar-workshop/

Как это должно выглядеть:

https://foo.bar/seo-agency/

https://foo.bar/seo-agency/seo-workshop/

https://foo.bar/foobar-agency/

https://foo.bar/foobar-agency/foobar-workshop/

Я использовал следующееучебные пособия для реализации этих структур:

Есть некоторые люди с такой же проблемой:

Сначала я реализовал решение первого урока от Мэтью Бойнса.Все работает, кроме моей нумерации страниц.Если я использую эти решения, моя нумерация страниц перестает работать.Может быть, следующий код из функции add_rewrites() нарушает нумерацию страниц:

add_permastruct( 'custom-service', "%custom-service%", array(
    'ep_mask' => EP_PERMALINK
));

Вы не можете вызвать страницы моего блога.Следующие URL перестают работать:

https://foo.bar/blog/page/2
https://foo.bar/cpt/page/2

Во второй попытке я удалил код Мэтью Бойнса.Блог без нумерации страниц в своем архиве бесполезен.Затем я реализовал решение от "kellenmace.com".Чтобы код работал для иерархических типов постов, вам нужно изменить функцию фильтра обучающих программ для post_type_link:

function remove_custom_service_slug( $post_link, $post ) {
    if ( 'custom-service' === $post->post_type && 'publish' === $post->post_status ) {
        if( $post->post_parent ) {
            $parent = get_post($post->post_parent);
            $post_link = str_replace( '/' . $post->post_type . '/' . $parent->post_name . '/', '/', $post_link );
        } else {
            $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'remove_custom_service_slug', 10, 2 );

Но есть одна большая проблема.Он удаляет базовый слаг и родительский слаг:

https://foo.bar/seo-agency/

https://foo.bar/seo-workshop/

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


Если у вас есть какие-либо вопросы, или если вам нужна дополнительная информация или код, пожалуйста, не делайтеНе стесняйтесь обращаться ко мне.

Спасибо за чтение моего вопроса!

1 Ответ

0 голосов
/ 19 сентября 2018

Измените функцию на эту, чтобы учесть все случаи:

Попробуйте этот код,

function change_slug_struct( $query ) {

    if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
        return;
    }

    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'single-link', 'page' ) );
    } elseif ( ! empty( $query->query['pagename'] ) && false === strpos( $query->query['pagename'], '/' ) ) {
        $query->set( 'post_type', array( 'post', 'single-link', 'page' ) );

        // We also need to set the name query var since redirect_guess_404_permalink() relies on it.
        $query->set( 'name', $query->query['pagename'] );
    }
}
add_action( 'pre_get_posts', 'change_slug_struct' );
...