Estoy tratando de configurar una estructura de tipo de publicación personalizada de varios niveles con enlaces permanentes parecidos authors/books/chapters
, con autores, libros y capítulos configurados como su propio tipo de publicación personalizada. Por ejemplo, una URL típica en este sitio podría verse asíexample.com/authors/stephen-king/the-shining/chapter-3/
Cada capítulo solo puede pertenecer a un libro, y cada libro solo puede pertenecer a un autor. He considerado utilizar taxonomías en lugar de CPT para autores y libros, pero necesito asociar metadatos con cada elemento y prefiero la interfaz de publicación para esto.
Llegué a la mayor parte del camino simplemente configurando cada publicación personalizada como elemento secundario de una entrada en el nivel superior de CPT. Por ejemplo, creo el "Capítulo 3" y asigno "The Shining" como padre utilizando un meta-cuadro personalizado. "The Shining" a su vez tiene a "Stephen King" como padre. No he tenido ningún problema para crear estas relaciones.
Estoy usando etiquetas de reescritura en las fichas de CPT y los enlaces permanentes quieren funcionar, pero no son del todo correctos. Utilizando un analizador de reescritura, puedo ver que las reglas de reescritura se generan realmente, pero no parecen estar en el orden correcto, por lo que otras reglas se procesan primero.
Así es como he registrado mis CPT:
function cpt_init() {
$labels = array(
'name' => 'Authors'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('authors',$args);
$labels = array(
'name' => 'Books'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('books',$args);
$labels = array(
'name' => 'Chapters'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%/%books%',
'with_front' => FALSE,
),
'with_front' => FALSE,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('chapters',$args);
}
add_action( 'init', 'cpt_init' );
Entonces, ¿hay alguna manera de cambiar la prioridad de mis reglas de reescritura para que los autores, los libros y los capítulos coincidan primero?
También sé que voy a tener que agregar un post_type_link
filtro, pero eso parece secundario para obtener los enlaces permanentes en primer lugar. Si alguien sabe dónde puedo encontrar una descripción completa de cómo funciona ese filtro, se lo agradecería.
Respuestas:
Si desea mantener "autores" como la babosa de base en los enlaces permanentes, es decir example.com/authors/stephen-king/ para el CPT de "autores", example.com/authors/stephen-king/the-shining/ para el 'libros' CPT y example.com/authors/stephen-king/the-shining/chapter-3/ para los 'capítulos' CPT, WordPress pensará que casi todo es una publicación de 'autores' o un hijo jerárquico de 'autores' 'publicar y, dado que ese no es el caso, WordPress finalmente se vuelve muy confundido.
Dicho esto, hay una solución alternativa que es bastante básica, pero siempre que su estructura de enlace permanente siempre siga el mismo orden, es decir, la palabra 'autores' siempre es seguida por una babosa de autor, que siempre es seguida por una babosa de libro que siempre se sigue por una babosa de capítulo, entonces deberías estar listo.
En esta solución, no es necesario definir el slug de reescritura en la definición de tipo de publicación personalizada para 'capítulos' y 'libros', sino establecer el slug de reescritura de 'autores' como simplemente 'autores', colocar el siguiente código en sus funciones.php archivar y "vaciar" sus reglas de reescritura.
Obtenga más información sobre el complemento CPT-onomies
fuente
No tengo experiencia personal con tal escenario, pero Randy Hoyt hizo una presentación en WordCamp San Fran el pasado fin de semana sobre "Tipos de publicaciones subordinadas" que suena como de lo que estás hablando.
Aquí está su página para la charla que incluye sus diapositivas de presentación y enlaces a un complemento que creó para trabajar con tipos de publicaciones subordinadas: http://randyhoyt.com/wordpress/subordinate-post-types/
fuente
Las reglas se agregarán a extra_rules_top de WP_Rewrite en el orden en que se agregan las permastructs adicionales. Por lo tanto, cambiar el orden en que registra los tipos de publicación cambiará el orden de las reglas de reescritura que se generan, haciendo que la reescritura del capítulo coincida primero. Sin embargo, dado que está utilizando query_var de los otros post_types, wp_query puede terminar coincidiendo con uno de esos como el nombre de la publicación consultada antes de coincidir con el capítulo que desee.
Crearía nuevas etiquetas de reescritura para representar los marcadores de posición para el autor principal y el libro principal, es decir:
Al hacer esto, tendrá que filtrar 'query_vars' para hacer público 'parent_book'. Luego, deberá agregar un filtro a pre_get_posts que convertirá el nombre establecido como parent_book query_var en post_id y lo establecerá como 'post_parent'.
fuente