Obtener la URL del archivo de un post_type personalizado

9 mar 2011, 00:49:05
Vistas: 42.9K
Votos: 30

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?

2
Comentarios

¿Qué tipo de botón, añadir uno a un menú de navegación o simplemente un enlace genérico? La URL del archivo generalmente es tusitio.com/slug-del-tipo a menos que lo configures explícitamente como otra cosa, ej. tusitio.com/alguna-otra-url..

t31os t31os
9 mar 2011 01:30:25

@t31os: sí, por ahora lo he codificado así. Pero pronto lo cambiaré usando el código de @Mike.

ariefbayu ariefbayu
9 mar 2011 01:51:25
Todas las respuestas a la pregunta 2
7
30

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.

9 mar 2011 01:42:39
Comentarios

por cierto, cuando envíes el trac, ¿puedes por favor enlazarlo aquí?

ariefbayu ariefbayu
9 mar 2011 01:52:30

@silent - Sí, por supuesto.

MikeSchinkel MikeSchinkel
9 mar 2011 01:59:27

@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 t31os
9 mar 2011 02:00:54

@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?

MikeSchinkel MikeSchinkel
9 mar 2011 02:08:22

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

t31os t31os
9 mar 2011 02:13:49

no te preocupes por el botón. Es simplemente una etiqueta 'a' ;)

ariefbayu ariefbayu
9 mar 2011 03:34:42

@silent - Resulta que WordPress ya tenía la función necesaria: get_post_type_archive_link(); he actualizado mi respuesta.

MikeSchinkel MikeSchinkel
9 mar 2011 06:30:01
Mostrar los 2 comentarios restantes
2
12

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/

9 mar 2011 01:44:12
Comentarios

¡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/

Astrotim Astrotim
17 dic 2014 02:30:26

No recuerdo si/cuándo hicieron el cambio o si siempre estuvo incorrecto, pero en 2017 'rewrite' solo acepta un valor booleano o un array. En lugar de 'rewrite' => 'product', que tienes listado, debería ser 'rewrite' => array( 'slug' => 'product' ),.

Mike Mike
15 nov 2017 03:24:27