Soporte » WordPress Avanzado » rewrite rules para custom post types

  • Hola,

    tengo un problema con los permalinks de un website de viajes con varios custom post types y taxonomies.

    El destino de los viajes es una taxonomia: destino
    cada destino esta asociado a distintos cpt:
    – plan (planes de viaje)
    – product( el producto de woocommerce que se llama experiencias)
    – itinerary (los itinerarios)
    -etc…
    La definición de todos ellos esta aquí:
    https://gist.github.com/oterox/208101a019e2f592f20d39a5d7b31483

    Ademas el site tiene WPML para el multilenguaje.

    Lo que necesito es que el destino aparezca en la url siempre al principio, menos en la home, es decir, para el destino «granada» algo así:
    home -> archivo de la taxonomía destino -> /es/granada/
    resto paginas:
    /es/granada/planes (archivo plan)
    /es/granada/planes/ruta-gastronomica (single plan)
    /es/granada/experiencias (archivo product woocommerce)
    /es/granada/experiencias/viaje-en-globo (single product woocommerce)
    /es/granada/itinerarios/ (archivo itinerary)
    /es/granada/itinerarios/granada-en-un-dia (single itinerary)
    etc

    Teniendo en cuenta que hay varios idiomas, que pueden ser «es»,»fr»,»en»,»it»,etc

    Estoy probando con add_rewrite_rule pero no consigo nada 🙁

    //granada/planes (archivo)
    add_rewrite_rule(
        '^([^/]+)/planes/?$', 
        'index.php?post_type=plan&tax_destination=$matches[1]',
        'top'
    );

    Alguna idea de como hacerlo?
    Muchas gracias!

Viendo 5 respuestas - 1 de 5 (de 5 total)
  • De momento he conseguido que me funcione para el single con esto:

    add_filter('post_type_link', 'ox_post_type_link', 1, 3);
    function ox_post_type_link( $link, $post = 0 ){
        if ( $post->post_type == 'plan' ){
        	
        	$terms = wp_get_object_terms( $post->ID, 'tax_destination' );
            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
                $taxonomy_slug = $terms[0]->slug;
            return home_url( $taxonomy_slug .'/' . $post->post_name );
    
        } elseif ( $post->post_type == 'area' ){
    
        	$terms = wp_get_object_terms( $post->ID, 'tax_destination' );
            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
                $taxonomy_slug = $terms[0]->slug;
            return home_url( $taxonomy_slug .'/zonas/' . $post->post_name );
    
        } elseif ( $post->post_type == 'itinerary' ){
    
        	$terms = wp_get_object_terms( $post->ID, 'tax_destination' );
            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
                $taxonomy_slug = $terms[0]->slug;
            return home_url( $taxonomy_slug .'/itinerarios/' . $post->post_name );
    
        } else {
            return $link;
        }
    }

    y esto:

    add_action( 'init', 'ox_rewrite_add_rewrites' );
    function ox_rewrite_add_rewrites()
    {
    
        //(NO FUNCIONA) Home destino /granada
        add_rewrite_rule(
            '^([^/]+)/?$', //un solo segmento
            'index.php?post_type=destination',
            'top'
        );
    
        //(NO FUNCIONA) Archivo para planes /granada/planes
        add_rewrite_rule(
            '([^/]+)/planes/?$', //un segmento + el literal "planes"
            'index.php?post_type=plan&tax_destination=$matches[1]',
            'top'
        );
    
        //(SI FUNCIONA) Detalle plan /granada/que-hacer-en-granada
        add_rewrite_rule(
            '^([^/]+)/([^/]+)/?$', //un segmento y despues otro segmento
            'index.php?plan=$matches[2]',
            'top'
        );    
    
        //(SI FUNCIONA) Detalle zona /granada/zonas/albaicin
        add_rewrite_rule(
            '^([^/]+)/zonas/([^/]+)/?$', //un segmento y despues otro segmento
            'index.php?area=$matches[2]',
            'top'
        );    
    
        //(SI FUNCIONA) Detalle itinerario /granada/itinerarios/granada-en-un-dia
        add_rewrite_rule(
            '^([^/]+)/itinerarios/([^/]+)/?$', //un segmento y despues otro segmento
            'index.php?itinerary=$matches[2]',
            'top'
        );    
    
        flush_rewrite_rules();
    }

    Pero sigo sin conseguir que funcione para los archivos de los cpt y la home

    Muchas gracias Pablo, ya conocía ese artículo desde hace muchos años 😉
    Pero en mi caso tengo que hacer bastante más.

    Sobre todo porque el primer segmento de la url es el destino y es una taxonomia, no tiene siempre el mismo valor. Además en cada caso debe sacar solo registros cpts que tengan esa taxonomia.
    ej: /es/granada/planes (/idioma/taxonomia/customPostType)
    «es» es el idioma que pueden ser varios.
    «granada» es una taxonomia asociada al cpt planes
    «planes» es el custom post type y solo tengo que sacar los planes que estén asignados al term granada.

    Este sería un ejemplo para el archivo del cpt planes.

    Y luego generar todas las urls correctamente en archivos, single, productos, filtros, etc.

    Ahora mismo tengo ya gran parte hecha y lo estoy moviendo a un plugin básico. Luego pongo el link al gist.

    Un saludo.

    @oterox yo también ando enfrascado en un tema de reescritura de permalinks y sinceramente, es odioso. Quizá te pueda ayudar de alguna forma engancharte a request, algo así:

    add_filter('request', 'my_function_alter_request')
    
    function my_function_alter_request($request){
        $dummy_query = new WP_Query();  // the query isn't run if we don't pass any query vars
        $dummy_query->parse_query( $request );
    
        // this is the actual manipulation; do whatever you need here
        if ( $dummy_query->is_home() )
            $request['category_name'] = 'news';
    
        return $request;
    }

    Está documentado en https://codex.wordpress.org/Plugin_API/Filter_Reference/request

    • Esta respuesta fue modificada hace 11 meses, 2 semanas por  David Navia.

    Muchas gracias David,

    lo miraré, aunque creo que no me va a hacer falta.
    Al final tengo lo importante en la url, que es la taxonomia y el correspondiente post_type.

    Y si si y si, los permalinks son un infiernoooo!

Viendo 5 respuestas - 1 de 5 (de 5 total)
  • El debate ‘rewrite rules para custom post types’ está cerrado a nuevas respuestas.