it-swarm.com.de

Abrufen der benutzerdefinierten Archiv-URL von post_type

Es scheint eine dumme Frage zu sein. Aber ich kann es nicht herausfinden :(.

Ich muss zu Hause eine Schaltfläche anzeigen, die zur benutzerdefinierten Archiv-URL von post_type (archive- {post_type} .php) wechselt. Wie mache ich das?

25
ariefbayu

Hi @Silent:

Es stellte sich heraus, dass es in WordPress 3.1 eine Funktion gibt, die genau das tut, was Sie wollen, und sie heißt get_post_type_archive_link(); So würden Sie es nennen (vorausgesetzt ein benutzerdefinierter Beitragstyp mit dem Namen 'product'):

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

Unten ist meine vorherige Antwort, bevor ich herausfand, dass WordPress tatsächlich eine Funktion für diesen Anwendungsfall eingebaut hat.

Vorherige Antwort:

Es sei denn, ich habe etwas im Kernquellcode für WordPress 3.1 übersehen. Ich glaube, Sie suchen nach einer Funktion wie get_archive_link(), die Sie folgendermaßen aufrufen könnten: (unter der Annahme eines benutzerdefinierten Beitragstyps mit dem Namen 'product'):

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

Und hier ist der Quellcode, den Sie in die function.php-Datei Ihres Themas oder in eine .php-Datei für ein Plugin, das Sie möglicherweise schreiben, einfügen können:

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

Ich habe tatsächlich über das Wochenende an dieser genauen Logik gearbeitet, obwohl ich noch nicht 100% sicher bin, ob die Reihenfolge der Logik für alle Anwendungsfälle, die WordPress möglicherweise sieht, allgemein korrekt ist, obwohl sie wahrscheinlich für eine bestimmte Site funktionieren wird.

Dies ist auch ein großartiger Vorschlag, um WordPress übertrachinzugefügt zu werden, von dem ich denke, dass ich es später am Abend tun werde.

25
MikeSchinkel

wenn Sie den Post-Typ registrieren, können Sie eine Zeichenfolge als Slug mit dem Parameter "has_archive" übergeben und sicherstellen, dass Sie auch "rewrite" auf "true" oder "array", jedoch nicht auf "false" setzen. Dann lautet Ihre CPT-Archiv-URL http: //www.YOURDOMAIN .com/has_archive_slug zum Beispiel

wenn Sie beispielsweise register_post_type eingeben:

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

dann lautet Ihre einzelne URL: http://www.YOURDOMAIN.com/product/postName und Ihre Archiv-URL lautet: http://www.YOURDOMAIN.com/products/

12
Bainternet