Obține URL-ul arhivei pentru post_type personalizat

9 mar. 2011, 00:49:05
Vizualizări: 42.9K
Voturi: 30

Pare o întrebare stupidă. Dar, nu-mi dau seama cum să o rezolv :(.

Am nevoie să afișez un buton pe pagina principală care să ducă către URL-ul arhivei unui post_type personalizat (archive-{post_type}.php). Cum pot face asta?

// Exemplu de utilizare:
$archive_url = get_post_type_archive_link('nume_post_type');
echo '<a href="' . $archive_url . '">Vezi toate postările</a>';
2
Comentarii

Ce fel de buton, adaugi unul într-un meniu de navigare, sau doar un link generic? URL-ul arhivei este în general siteultau.com/slug-tip dacă nu l-ai setat explicit la altceva, de ex. siteultau.com/alt-url..

t31os t31os
9 mar. 2011 01:30:25

@t31os: da, acum, l-am hardcodat așa. Dar, îl voi schimba în curând folosind codul lui @Mike.

ariefbayu ariefbayu
9 mar. 2011 01:51:25
Toate răspunsurile la întrebare 2
7
30

Salut @Silent:

Se pare că există o funcție în WordPress 3.1 care face exact ce dorești și se numește get_post_type_archive_link(); iată cum ai putea să o apelezi (presupunând un tip de postare personalizat numit 'product'):

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

Mai jos este răspunsul meu anterior, înainte să descopăr că WordPress avea deja o funcție integrată pentru acest caz de utilizare.

Răspuns anterior:

Dacă nu am omis ceva în codul sursă al WordPress 3.1, cred că cauți o funcție precum get_archive_link() pe care ai putea să o apelezi astfel (presupunând un tip de postare personalizat numit 'product'):

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

Și iată codul sursă pe care îl poți introduce în fișierul function.php al temei tale sau într-un fișier .php pentru un plugin pe care îl scrii:

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 fapt, lucram la această logică exactă în weekend, deși nu sunt încă 100% sigur că ordinea logicii este corectă generic pentru toate cazurile de utilizare pe care WordPress le-ar putea întâlni, dar probabil va funcționa pentru orice site specific.

Aceasta este și o sugestie excelentă pentru a fi adăugată în WordPress prin intermediul trac, lucru pe care cred că îl voi face mai târziu în seara aceasta.

9 mar. 2011 01:42:39
Comentarii

btw, când trimiteți trac-ul, puteți vă rog să-l legați aici.

ariefbayu ariefbayu
9 mar. 2011 01:52:30

@silent - Da, desigur.

MikeSchinkel MikeSchinkel
9 mar. 2011 01:59:27

@Mike - Aș fi scris ceva similar dacă nu ai fi făcut-o tu.... ;) Mă întrebam dacă la asta se gândea @silent, dar mențiunea despre un buton m-a făcut să mă gândesc la altceva..

t31os t31os
9 mar. 2011 02:00:54

@t31os - Lucram la aceeași logică în weekend pentru plugin-ul meu de rutare URL, așa că am avut un avans. :) În ceea ce privește butonul, ai putea adăuga un răspuns pentru a aborda asta?

MikeSchinkel MikeSchinkel
9 mar. 2011 02:08:22

Nu sunt chiar sigur că mai este ceva de acoperit, cred că funcția ta de mai sus acoperă ceea ce s-a cerut... :)

t31os t31os
9 mar. 2011 02:13:49

nu te mai gândi la buton. E doar un simplu tag 'a' ;)

ariefbayu ariefbayu
9 mar. 2011 03:34:42

@silent - Se pare că WordPress avea deja funcția necesară: get_post_type_archive_link(); am actualizat răspunsul meu.

MikeSchinkel MikeSchinkel
9 mar. 2011 06:30:01
Arată celelalte 2 comentarii
2
12

când înregistrezi un tip de postare, poți pasa un șir de caractere ca slug cu parametrul "has_archive" și asigură-te că setezi și rewrite fie la true fie la un array, dar nu false și atunci URL-ul arhivei CPT-ului tău va fi http://www.YOURDOMAIN.com/has_archive_slug de exemplu

dacă setezi în register_post_type de exemplu:

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

atunci URL-ul single va fi: http://www.YOURDOMAIN.com/product/numePostare iar URL-ul arhivei va fi: http://www.YOURDOMAIN.com/products/

9 mar. 2011 01:44:12
Comentarii

Ura. Mereu am crezut că has_archive este un boolean, dar acum știu că poate primi un șir de caractere, așa că tipul meu personal de postare singular recipe poate avea un slug plural /recipes/

Astrotim Astrotim
17 dec. 2014 02:30:26

Nu îmi amintesc dacă/când au făcut schimbarea sau dacă aceasta a fost întotdeauna o eroare, dar în 2017 'rewrite' acceptă doar o valoare booleană sau array. În loc de 'rewrite' => 'product', pe care l-ai listat, ar trebui să fie 'rewrite' => array( 'slug' => 'product' ),.

Mike Mike
15 nov. 2017 03:24:27