dangayle
  • 0
Мастер

Как сделать 301 частное сообщение вместо 404?

  • 0

Как перенаправить частные страницы на 301, а не на 404? Если сообщение является частным, WordPress фильтрует его в SQL-запросе, поэтому нет переменных $post для работы.

Я хотел бы, чтобы этот код работал, но не работает:

add_action('wp','redirect_stuffs', 0);
function redirect_stuffs(){
global $post;
    if ( $post->post_status == "private" && !is_admin() ):
        wp_redirect("http://dangayle.com/",301);
        exit();
    endif;
}

Я не знаю, где это установлено раньше wp, кроме того факта, что я знаю, что это проблема с ролью пользователя. Если бы я мог настроить не вошедшего в систему пользователя, чтобы иметь эту возможность, это, вероятно, решило бы проблему:

$publicReader -> add_cap('read_private_posts');

Проблема с add_cap заключается в том, что возможности есть только у зарегистрированных пользователей.

Share
  1. Извините, ребята, я нашел свой ответ:

    add_action('wp','redirect_stuffs', 0);
    function redirect_stuffs(){
    global $wpdb; 
        if ($wpdb->last_result[0]->post_status == "private" && !is_admin() ):
            wp_redirect( home_url(), 301 );
            exit();
        endif;
    }
    

    Сообщения/страницы удаляются из карты сайта, но страница по-прежнему отображается на сайте, поэтому она может получить 301 ошибку.

    • 0
  2. Мне кажется, что вы не должны возвращать ни 404, ни 301 — вы должны вернуть либо 401 (Неавторизовано / требуется аутентификация, хотя вы не примете предложенную аутентификацию), либо 403 (Отклонено, иначе я знаю, что вы просите) а у тебя его нет).

    Есть заброшенный плагин Private Page Forbidden, на который, возможно, стоит взглянуть в качестве руководства, хотя на первый взгляд кажется, что он хочет преобразовать 404 в 403, что кажется плохой идеей. К сожалению, несмотря на то, что обсуждались различные варианты (см. https://core.trac.wordpress.org/ticket/10551 и связанные с ними темы), веха для исправлений постепенно переместилась в «Будущий выпуск».

    • 0
  3. Во-первых, я должен был бы согласиться с ответом @fencepost. Однако я не мог не опубликовать решение, и вот мы здесь!

    function __intercept_private_page( $posts, &$wp_query )
    {
        // remove filter now, so that on subsequent post querying we don't get involved!
        remove_filter( 'the_posts', '__intercept_private_page', 5, 2 );
    
        if ( !( $wp_query->is_page && empty($posts) ) )
            return $posts; // bail, not page with no results
    
        // if you want to explicitly check it *is* private, use the code block below:   
        /*
            if ( !empty( $wp_query->query['page_id'] ) )
                $page = get_page( $wp_query->query['page_id'] );
            else
                $page = get_page_by_path( $wp_query->query['pagename'] );
    
            if ( $page && $page->post_status == 'private' ) {
                // redirect
            }
        */
    
        // otherwise assume that if the request was for a page, and no page was found, it was private
        wp_redirect( home_url(), 301 );
        exit;
    }
    is_admin() || add_filter( 'the_posts', '__intercept_private_page', 5, 2 );
    

    Обновление : исправлен код для использования the_posts фильтра вместо posts_results (который срабатывает до того, как WordPress проверит разрешения, и поэтому $posts еще не «опустошен»).

    • 0

Оставить ответ

You must login to add an answer.