Obter o URL de arquivamento personalizado de post_type

26

Parece uma pergunta estúpida. Mas, não consigo descobrir :(.

Preciso exibir o botão em casa que vá para o URL de arquivamento personalizado de post_type (archive- {post_type} .php). Como faço isso?

ariefbayu
fonte
Que tipo de botão, adicionar um a um menu de navegação ou apenas um link genérico? O URL do arquivo é geralmente, a yoursite.com/type-slugmenos que você o defina explicitamente para outra coisa, por exemplo. yoursite.com/some-other-url..
t31os
@ t31os: sim, agora, eu codifiquei assim. Mas, em breve, ele será alterado usando o código do @ Mike.
precisa saber é o seguinte

Respostas:

25

Olá @Silent:

Acontece que existe uma função no WordPress 3.1 que faz exatamente o que você deseja e é nomeada get_post_type_archive_link(); aqui está como você chamaria (assumindo um tipo de postagem personalizado chamado 'product'):

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

Abaixo está minha resposta anterior antes de descobrir que o WordPress realmente tinha uma função integrada para este caso de uso.

Resposta prévia:

A menos que eu tenha esquecido algo no código-fonte principal do WordPress 3.1, acho que você está procurando uma função como a get_archive_link()que você poderia chamar assim (assumindo um tipo de post personalizado chamado 'product'):

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

E aqui está o código fonte que você pode colocar no function.phparquivo do seu tema ou no .phparquivo de um plug-in que você pode escrever:

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 );
  }
}

Na verdade, eu estava trabalhando nessa lógica exata no fim de semana, embora ainda não tenha 100% de certeza de que a ordem da lógica esteja genericamente correta em todos os casos de uso que o WordPress possa ver, embora provavelmente funcione para qualquer site específico.

Isso também é uma ótima coisa a sugerir para ser adicionado ao WordPress via trac, que eu acho que farei ainda esta noite.

MikeSchinkel
fonte
btw, quando você enviar o trac, por favor, vincule-o aqui.
precisa saber é o seguinte
@silent - Sim, claro.
9788 MikeSchinkel #
@ Mike - eu teria escrito algo parecido se você não tivesse ....;) Eu queria saber se é isso que @silent tinha em mente, mas a menção de um botão me fez pensar em outra coisa ..
t31os
@ t31os - Eu estava trabalhando na mesma lógica neste fim de semana para o meu plug-in de roteamento de URL, então tive um avanço. :) Quanto ao botão, você pode adicionar uma resposta para resolver isso?
9788 MikeSchinkel #
Eu realmente não estou certo que há mais nada a tampa, eu acho que suas tampas acima de função que foi perguntado ... :)
t31os
12

ao registrar o tipo de postagem, você pode passar uma string como lesma com o parâmetro "has_archive" e também definir a reescrita como true ou um array, mas não false, e o URL do arquivo CPT será http://www.YOURDOMAIN.com / has_archive_slug por exemplo

se você definir em seu register_post_type, por exemplo:

$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);

seu URL único é: http://www.YOURDOMAIN.com/product/postName e o URL do seu arquivo morto é: http://www.YOURDOMAIN.com/products/

Bainternet
fonte
3
Viva. Eu sempre pensei que has_archiveera um booleano, mas agora sei que pode receber uma string, para que meu tipo de post personalizado recipepossa ter uma lesma plural/recipes/
Astrotim
Não me lembro se / quando eles fizeram a troca ou se isso sempre estava errado, mas em 2017 'rewrite'aceita apenas um valor booleano ou de matriz. Em vez do que 'rewrite' => 'product',você listou, deveria ser 'rewrite' => array( 'slug' => 'product' ),.
Mike