Manejar la URL del nombre de la categoría y reescribirla antes de diferentes tipos de publicaciones

4

Revisé un centenar de temas similares aquí que estaban cerca de lo que necesitaba, pero desafortunadamente no pude ajustar esto para disculparme si es un duplicado.

Tengo varios tipos de publicaciones (como Events , Venues , Places ) y también uso Posts , donde los cuatro tipos de publicaciones están conectados a la taxonomía estándar de WordPress Categories .

He estado tratando de ensamblar un enlace permanente que se parece a esto:

enlace

Donde venues es el nombre de la categoría; 61312 es el post_id y california-venue es el postname.

Todos los tipos de publicación deben representar la misma estructura:

%category%/%post_id%/%postname%/

Esa estructura de enlace permanente parece funcionar bien para las publicaciones en Configuración - > Permalinks, pero no para los otros tipos de publicaciones.

Los que tienen with_front => false devuelven 404, los otros funcionan bien, pero redirigen a post_type/postname .

Tengo una regla de reescritura personalizada que se ve así:

array( 
  'regex'     => '^([^/]+)/([0-9]+)/([^/]+)?',  
  'query'       => 'category_name=$matches[1]&post_id=$matches[2]&pagename=$matches[3]', 
 )

Intenté filtrar el post_type_link y ver si la redirección se detendría, y también probé el siguiente fragmento agregando disable_redirect=1 a mis reglas de consulta:

add_filter('query_vars', 'my_public_query_vars');
function my_public_query_vars($qv)
{
    $qv[] = 'disable_redirect';
    return $qv;
}
add_filter('wp_redirect', 'my_disable_redirect');
function my_disable_redirect($location)
{
    $disable_redirect = get_query_var('disable_redirect');
    if(!empty($disable_redirect)) return false;
    return $location;
}

Eso simplemente causó un WSOD.

¿Cómo puedo evitar la redirección a mis vistas individuales de cada tipo de publicación (la vista de publicación única parece funcionar bien) y mantener la estructura de URL %category%/%post_id%/%postname% ?

    
pregunta Mario Peshev 28.04.2015 - 23:24

1 respuesta

1

Después de un intercambio de ideas y muchas pruebas y errores con T5 Rewrite y HM Rewrite, busqué la solución más sencilla posible.

El permalink en realidad fue interceptado por WordPress, por lo que no necesité la regla de reescritura adicional (aunque no me dolió, aparte del rendimiento). Dejé %category%/%post_id%/%postname% como el enlace permanente personalizado predeterminado, y parece que funciona para todos los tipos de publicaciones hasta ahora.

El slug original también se maneja con gracia (cuando se encuentran enlaces remanentes), pero el nuevo es el predeterminado.

Jugué con template_redirect , request , redirect_canonical , query_vars , wp_redirect y otros ganchos para encontrar el problema y terminé con esto:

add_filter( 'request', 'sm_permalink_request_handler' );
function sm_permalink_request_handler( $request ) {
    if ( ! isset( $request['p'] ) ) {
        return $request;
    }

    // Get the post type, it's required to prevent the redirect
    $post_id = $request['p'];
    $post = get_post( $post_id );
    $request['post_type'] = $post->post_type;

    return $request;
} 


/**
 * Override get_permalink and prevent redirects
 */
function sm_fix_permalinks_for_post_types( $url, $post ) {
        $taxonomies = get_post_taxonomies();
        // See if categories are assigned to our CPT entry
        if ( ! empty( $taxonomies ) && in_array( 'category', $taxonomies ) ) {

            // Fetch all categories
            $categories = wp_get_post_categories( $post->ID, array() );

            if ( ! empty( $categories ) ) {
                // Get the main category in case there are more assigned
                // Somewhat arbitrary since it pops the last one.
                $main_category_id = array_pop( $categories );

                $main_category = get_category( $main_category_id );

                if( ! empty( $main_category ) ) {
                    $category_slug = $main_category->slug;
                    $post_id = $post->ID;
                    $post_name = $post->post_name;

                    $url = home_url( "$category_slug/$post_id/$post_name" );
                }
            }
        }

        return $url;
}

add_filter( 'post_type_link', 'sm_fix_permalinks_for_post_types', 10, 2 );

El primer problema se relacionó con la falta de post_type aprobado con la solicitud. Mi enlace permanente estaba filtrando por nombre de categoría y ID de publicación, pero fue posttype-agnostic que interfirió con WordPress. Al obtener la publicación por su ID y establecer el tipo de publicación, las cosas volvieron a la normalidad.

El segundo problema estaba relacionado con los enlaces permanentes para las nuevas publicaciones, en el administrador y en cualquier lugar alrededor de las plantillas frontend. Otra parte de filtrado hizo el truco allí y funciona en todo el sitio.

    
respondido por el Mario Peshev 02.05.2015 - 00:19

Lea otras preguntas en las etiquetas