it-roy-ru.com

Удаление Slug из Custom Post Type приводит к 404

Я работаю над плагином, который создает списки. После создания списка, я хотел удалить слаг из URL

Тип сообщения:

$rewrite = [
        'slug'       => 'single-link',
        'with_front' => false,
        'pages'      => false,
        'feeds'      => false,
    ];
    $args    = [
        'label'               => esc_html__( 'Single Link', 'single-link' ),
        'labels'              => $labels,
        'supports'            => [ 'title' ],
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'menu_position'       => 15,
        'menu_icon'           => 'dashicons-admin-links',
        'show_in_admin_bar'   => false,
        'show_in_nav_menus'   => true,
        'can_export'          => true,
        'has_archive'         => false,
        'exclude_from_search' => true,
        'publicly_queryable'  => true,
        'rewrite'             => $rewrite,
        'capability_type'     => 'page',
        'show_in_rest'        => true,
    ];

    $args = apply_filters( 'single-link/post_type/args', $args );
    register_post_type( 'single-link', $args );

Удалить слаг из URL:

function remove_cpt_slug( $post_link, $post, $leavename ) {

if ( 'single-link' != $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', 'remove_cpt_slug', 10, 3 );


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' ) );
}
}
add_action( 'pre_get_posts', 'change_slug_struct' );

(этот код от здесь )

Теперь, после нажатия кнопки "публикация", slug/single-link/удаляется, но мы всегда получаем 404 при посещении страницы. Изменение/повторное сохранение постоянных ссылок не помогло. Что я делаю неправильно?

2
Paranoia

Регистрация пользовательского типа сообщения и модификация постоянной ссылки в порядке. Проблема заключается в правилах переписывания WordPress, которые, скорее всего, будут соответствовать "очищенному" URL-адресу ваших простых ссылок на страницы, и он установит запрос pagename var, а не name, как предполагает ваша функция change_slug_struct().

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

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' );
1
Vlad Olaru

Вы должны изменить структуру perma. По умолчанию пост вашего пользовательского типа будет найден только тогда, когда URL начинается с префикса slug. При изменении префикса у вас будут проблемы, аналогичные тем, которые возникают при удалении, посмотрите на этот пост .

Чтобы добиться удаления префикса slug типа post, вам нужно подключиться к single-link_rewrite_rules , пройти через эти правила и также удалить префикс там.

Примечание: изменения в структуре perma могут вызвать конфликты URL.

2
Fleuv