Como redirecionar perfeitamente entre diferentes arquivos e slugs singulares?

4

Eu tenho um CPT com slug function (singular) e arquivo slug functions (plural).

Estrutura do Permalink para:

  • singular é /function/[postname]/
  • o arquivo é /functions/[page-x/] .

(pode cutucar ao vivo em QueryPosts )

Isso funciona e parece ótimo, mas registrei alguns casos em que as pessoas manipulam o URL diretamente, como:

  • /functions/[postname] (nome de digitação após a página de arquivo)
  • /function/ (nome da função de apagamento)

Embora isso não seja complicado para corrigir com algum código explicitamente, haveria mais tipos de posts e parece que dados e lógica são suficientes para solução genérica (realmente eu meio que esperava que WP lidasse com isso, ele faz bastante para corrigir problemas de link).

No entanto, eu tenho traços profundos WP reescrever e poderia usar alguns ponteiros. :)

Para resumir:

  

Como capturar e redirecionar os URLs que estão corretos, além de usar erroneamente usando slug de arquivo em vez de singular e vice-versa?

A configuração do arquivo está registrada da seguinte forma:

'has_archive' => 'functions',
'rewrite'     => array(
    'feeds'      => false,
    'with_front' => false,
),
    
por Rarst 26.06.2012 / 13:56

2 respostas

4
  1. Ligue para '404_template' . ( Exemplo )
  2. Busque todos os tipos de postagem personalizados públicos , em que has_archive não é FALSE .
  3. Encontre a string has_archive do tipo de postagem e veja se ela faz parte do URL da solicitação atual.
  4. Teste get_page_by_title() com a última parte das solicitações.
  5. wp_redirect() para o permalink da postagem encontrada.
  6. exit; .
por fuxia 26.06.2012 / 14:26
1

Ok, eu provavelmente estava pensando demais nisso. De acordo com o algoritmo sugerido, codifiquei meu manipulador até o momento:

/**
 * Redirect manually edited URLs to proper pages.
 *
 * @param $template
 *
 * @return mixed
 */
static function if_404_template( $template ) {

    $post_types     = get_post_types( array( 'has_archive' => true, ), 'objects' );
    $url_path       = @parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
    $url_path_parts = array_filter( explode( '/', $url_path ) );

    if ( ! empty( $url_path_parts ) ) {
        $last_url_path_part = end( $url_path_parts );

        foreach ( $post_types as $name => $post_type_object ) {
            if ( $name == $last_url_path_part ) {
                wp_safe_redirect( get_post_type_archive_link( $name ), 301 );
                die;
            }

            if ( count( $url_path_parts ) > 1 && in_array( $post_type_object->has_archive, $url_path_parts ) ) {
                $post = get_page_by_title( $last_url_path_part, OBJECT, $name );

                if ( ! empty( $post ) ) {
                    wp_safe_redirect( get_permalink( $post ), 301 );
                    die;
                }
            }
        }
    }

    trigger_error( 'Uncaught 404 at ' . esc_html( $_SERVER['REQUEST_URI'] ) );

    return $template;
}
    
por Rarst 26.06.2012 / 15:20