Obtener la URL del archivo post_type personalizado

26

Parece una pregunta estúpida. Pero, no puedo entenderlo :(.

Necesito mostrar el botón en casa que va a la URL del archivo personalizado post_type (archive- {post_type} .php). ¿Cómo puedo hacer eso?

ariefbayu
fuente
¿Qué tipo de botón, agregar uno a un menú de navegación, o simplemente un enlace genérico? La URL del archivo es generalmente a yoursite.com/type-slugmenos que la establezca explícitamente en otra cosa, por ejemplo. yoursite.com/some-other-url..
t31os
@ t31os: sí, en este momento, lo codifiqué así. Pero, pronto lo cambiará usando el código de @ Mike.
ariefbayu

Respuestas:

25

Hola @Silent:

Resulta que hay una función en WordPress 3.1 que hace exactamente lo que quieres y se llama get_post_type_archive_link(); así es como lo llamarías (suponiendo un tipo de publicación personalizado llamado 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>

A continuación se muestra mi respuesta anterior antes de descubrir que WordPress tenía una función incorporada para este caso de uso.

Respuesta previa:

A menos que haya pasado por alto algo en el código fuente principal de WordPress 3.1, creo que está buscando una función como la get_archive_link()que podría llamar de esta manera (suponiendo un tipo de publicación personalizado llamado 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

Y aquí está el código fuente que puede colocar en el function.phparchivo de su tema o en un .phparchivo para un complemento que podría estar escribiendo:

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, estuve trabajando en esta lógica exacta durante el fin de semana, aunque todavía no estoy 100% seguro de que el orden de la lógica sea genéricamente correcto en todos los casos de uso que WordPress pueda ver, aunque probablemente funcionará para cualquier sitio específico.

Esto también es una gran cosa para sugerir que se agregue a WordPress a través de trac, lo que creo que haré más tarde esta noche.

MikeSchinkel
fuente
por cierto, cuando envíe el seguimiento, ¿puede, por favor, vincularlo aquí.
ariefbayu
@silent - Sí, por supuesto.
MikeSchinkel
@Mike - 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: estaba trabajando en la misma lógica este fin de semana para mi complemento de enrutamiento de URL, así que tenía una ventaja inicial. :) En cuanto al botón, ¿podría agregar una respuesta para abordar eso?
MikeSchinkel
No estoy realmente seguro de que quede algo por cubrir, creo que su función anterior cubre lo que se le pidió ... :)
t31os
12

cuando registre el tipo de publicación, puede pasar una cadena como babosa con el parámetro "has_archive" y asegurarse de que también establece reescribir en verdadero o en una matriz, pero no en falso, y luego su URL de archivo CPT sería http://www.YOURDOMAIN.com / has_archive_slug por ejemplo

si configura en su 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 su url única es: http://www.YOURDOMAIN.com/product/postName y su url de archivo es: http://www.YOURDOMAIN.com/products/

Bainternet
fuente
3
¡Hurra! Siempre pensé que has_archiveera un booleano, pero ahora sé que se le puede dar una cadena, por lo que mi tipo de publicación personalizada singular recipepuede tener una babosa plural/recipes/
Astrotim
No recuerdo si / cuando hicieron el cambio o si esto siempre fue un error, pero en 2017 'rewrite'solo acepta un valor booleano o de matriz. En lugar de lo 'rewrite' => 'product',que ha enumerado, debería serlo 'rewrite' => array( 'slug' => 'product' ),.
Mike