Как удалить пользовательский тип сообщения из URL WordPress? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть веб-сайт WordPress, использующий пользовательский шаблон с пользовательскими типами постов, такими как лендинг и сервисы.

Каждый тип поста имеет определенный слаг в URL, как этот => (http://example.com/landing/landing-page-name)

Я хочу изменить этот URL-адрес (http://example.com/landing/landing-page-name) на этот URL-адрес (http://example.com/landing-page-name).

) На самом деле мне нужно удалить фразу [посадочную] из URL-адреса. Важно то, что[посадка] - это пользовательский тип записи в моей таблице сообщений.

Я протестировал следующие решения:

==> Я изменил параметр slug на '/' в свойстве rewrite в register_post_type () --> Он разбивает все лендинги, посты и страницы URL (404)

==> Я добавил 'with_front' => false в свойство перезаписи -> ничего не изменилось

==> Я пытался сделать это с помощью RewriteRule в htaccess -> он не работал или выдавал слишком много ошибок перенаправления

Я не смог получить правильный результат.

Кто-нибудь раньше решал эту проблему?

1 Ответ

0 голосов
/ 28 октября 2019

Во-первых, вам нужно отфильтровать постоянную ссылку для вашего пользовательского типа поста, чтобы все опубликованные посты не содержали слаг в своих URL:

function stackoverflow_remove_cpt_slug( $post_link, $post ) {
    if ( 'landing' === $post->post_type && 'publish' === $post->post_status ) {
        $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
    }
    return $post_link;
}
add_filter( 'post_type_link', 'stackoverflow_remove_cpt_slug', 10, 2 );

На этом этапе попытка просмотреть ссылку приведет кприводить к ошибке 404 (страница не найдена). Это потому, что WordPress знает только то, что сообщения и страницы могут иметь URL-адреса, такие как domain.com/post-name/ или domain.com/page-name/. Нам нужно научить этому тому, что сообщения нашего пользовательского типа могут также иметь URL-адреса, такие как domain.com/cpt-post-name/.

function stackoverflow_add_cpt_post_names_to_main_query( $query ) {
    // Return if this is not the main query.
    if ( ! $query->is_main_query() ) {
        return;
    }
    // Return if this query doesn't match our very specific rewrite rule.
    if ( ! isset( $query->query['page'] ) || 2 !== count( $query->query ) ) {
        return;
    }
    // Return if we're not querying based on the post name.
    if ( empty( $query->query['name'] ) ) {
        return;
    }
    // Add CPT to the list of post types WP will include when it queries based on the post name.
    $query->set( 'post_type', array( 'post', 'page', 'landing' ) );
}
add_action( 'pre_get_posts', 'stackoverflow_add_cpt_post_names_to_main_query' );
...