URL de tipo de publicación personalizada con ID de publicación que permite archivar y paginar

2

Estoy teniendo dificultades para intentar que mis URL de tipos de publicación personalizadas funcionen correctamente. Cada solución que encuentro ha invalidado otra parte que necesita funcionar. Lo que estoy tratando de lograr es domain.com/post_type/post_id/post_name .

Lo que tengo que funciona para todo excepto los archivos es:

register_post_type('post-type',
    array(
    'rewrite' => array(
    'slug' => 'post-type/%post_id%',
    'with_front' => false,
    'pages' => true,
    'ep_mask' => 1 
    )
))

Entonces tengo:

add_filter('post_type_link', 'custom_post_type_link', 1, 3);
function custom_post_type_link($post_link, $post = 0, $leavename = false) {

    if ($post->post_type == 'post-type')) {
        return str_replace('%post_id%', $post->ID, $post_link);
    } else {
        return $post_link;
    }
}

Así que estoy tratando de encontrar una manera de hacer que domain.com/post_type funcione. Actualmente lanza un 404.

Sé que si quito el filtro y /%post_id% de mi reescritura, el archivo funcionará. Desde allí he intentado agregar una regla de reescritura:

add_action( 'init', 'custom_rewrites_init' );
function custom_rewrites_init(){
    add_rewrite_rule(
        'post-type/([0-9]+)?$',
        'index.php?post_type=post-type&p=$matches[1]',
        'top' );
}

Al hacerlo de esta manera, la URL no se redireccionará si alguien escribe domain.com/post_type/post_id y domain.com/post_type/post_id/post_name/2 no funciona.

¿Alguien sabe cuál es la mejor manera de hacer esto?

    
pregunta kel 26.06.2013 - 21:52

3 respuestas

6

Su código / soluciones es bastante bueno. Utiliza slug param de una manera muy inteligente, por lo que WordPress crea automáticamente el permastruct correcto para este CPT.

Lo único que te falta, supongo, es has_archive param. Su valor predeterminado es false y no lo establece en verdadero. Así que WordPress no crea enlaces / páginas de archivo para tu CPT.

  

has_archive (booleano o cadena)

     

(opcional) Habilita archivos de tipo de publicación.

     

Usará $ post_type como una barra de archivo por defecto. Predeterminado: falso Nota:   Generará las reglas de reescritura adecuadas si se habilita la reescritura. Tambien usar   reescribir para cambiar el slug usado.

Si haces esto, WordPress creará reglas de reescritura para las páginas de archivo. Habrá un pequeño problema. Contendrán %post_id% en ellos. Pero es bastante fácil de corregir. Solo tiene que agregar este código después de su llamada register_post_type :

global $wp_rewrite;

$new_rules = array();
foreach ( $wp_rewrite->extra_rules_top as $key => $rule ) {
    echo $key;
    if (strpos($key, 'post-type/%post_id%/') === 0 ) {
        $new_rules[ str_replace('%post_id%/', '', $key) ] = $rule;
        unset( $wp_rewrite->extra_rules_top[$key] );
    }
}
$wp_rewrite->extra_rules_top = $wp_rewrite->extra_rules_top + $new_rules;

Reparará las reglas de las páginas de archivo creadas por WordPress. Es una solución limpia: no deja ningún desorden, y se encarga de todas las reglas para la página de archivo (feeds, etc.)

    
respondido por el Krzysiek Dróżdż 29.06.2013 - 21:51
2

Puedes intentar agregar este fragmento de código:

add_filter( 'rewrite_rules_array', 'custom_rewrite_rules_array' );
function custom_rewrite_rules_array( $rules ) {
        $newrules = array();
        $newrules['^post-type/page/?([0-9]{1,})/?$'] = 'index.php?post_type=post-type&paged=$matches[1]';
        $newrules['^post-type$'] = 'index.php?post_type=post-type';
       return $newrules + $rules;
}

para agregar soporte para domain.com/post-type/ y domain.com/post-type/page/2 .

Solo debes recordar guardar los enlaces permanentes.

    
respondido por el birgire 29.06.2013 - 13:27
0

¿Ha restablecido la configuración de enlace permanente después de guardar el archivo de plantilla? Antes de poder utilizar un nuevo enlace permanente como ese, debe volver a guardar la configuración de ese enlace en Configuración- > Permalinks.

    
respondido por el Chris Wiegman 27.06.2013 - 03:40

Lea otras preguntas en las etiquetas