Obtener la URL del archivo de un post_type personalizado
Parece una pregunta tonta. Pero, ¡no puedo resolverlo! :(.
Necesito mostrar un botón en la página de inicio que vaya a la URL del archivo del post_type personalizado (archive-{post_type}.php). ¿Cómo puedo hacer esto?

Hola @Silent:
Resulta que hay una función en WordPress 3.1 que hace exactamente lo que necesitas y se llama get_post_type_archive_link()
; así es como la llamarías (asumiendo un tipo de entrada personalizado llamado 'product'
):
<a href="<?php echo get_post_type_archive_link('product'); ?>">Productos</a>
A continuación está mi respuesta anterior antes de descubrir que WordPress ya tenía una función incorporada para este caso de uso.
Respuesta anterior:
A menos que haya pasado por alto algo en el código fuente de WordPress 3.1, creo que buscas una función como get_archive_link()
que podrías llamar así (asumiendo un tipo de entrada personalizado llamado 'product'
):
<a href="<?php echo get_archive_link('product'); ?>">Productos</a>
Y aquí está el código fuente que puedes colocar en el archivo function.php
de tu tema o en un archivo .php
para un plugin que estés desarrollando:
if (!function_exists('get_archive_link')) {
function get_archive_link( $post_type ) {
global $wp_post_types;
$archive_link = false;
if (isset($wp_post_types[$post_type])) {
$wp_post_type = $wp_post_types[$post_type];
if ($wp_post_type->publicly_queryable)
if ($wp_post_type->has_archive && $wp_post_type->has_archive!==true)
$slug = $wp_post_type->has_archive;
else if (isset($wp_post_type->rewrite['slug']))
$slug = $wp_post_type->rewrite['slug'];
else
$slug = $post_type;
$archive_link = get_option( 'siteurl' ) . "/{$slug}/";
}
return apply_filters( 'archive_link', $archive_link, $post_type );
}
}
De hecho, estaba trabajando en esta misma lógica durante el fin de semana, aunque aún no estoy 100% seguro de que el orden de la lógica sea genéricamente correcto para todos los casos de uso que WordPress podría encontrar, aunque probablemente funcionará para cualquier sitio específico.
Esto también es algo genial para sugerir que se agregue a WordPress a través de trac, lo cual creo que haré más tarde esta noche.

@Mike - Yo hubiera escrito algo similar si no lo hubieras hecho... ;) Me preguntaba si esto es lo que @silent tenía en mente, pero la mención de un botón me hizo pensar en otra cosa...

@t31os - Estaba trabajando en la misma lógica este fin de semana para mi plugin de enrutamiento de URLs, así que ya tenía ventaja. :) En cuanto al botón, ¿podrías añadir una respuesta para abordar eso?

No estoy realmente seguro de que quede algo por cubrir, creo que tu función anterior responde a lo que se preguntó... :)

Cuando registras un tipo de publicación (post type), puedes pasar una cadena como slug con el parámetro "has_archive" y asegurarte de que también establezcas rewrite como true o un array, pero no false.
Entonces, la URL del archivo de tu CPT sería http://www.TUDOMINIO.com/slug_de_has_archive, por ejemplo.
Si configuras en tu register_post_type, por ejemplo:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => 'product',
'capability_type' => 'post',
'has_archive' => 'products',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','author','thumbnail','excerpt','comments')
);
register_post_type('product',$args);
entonces tu URL individual sería: http://www.TUDOMINIO.com/product/nombre-del-post y tu URL de archivo sería: http://www.TUDOMINIO.com/products/

¡Hurra! Siempre pensé que has_archive
era un booleano, pero ahora sé que puede recibir una cadena, así que mi tipo de entrada personalizado singular recipe
puede tener un slug en plural /recipes/
