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?
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?
Antworten:
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 (unter der Annahme eines benutzerdefinierten Beitragstyps 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.
Es sei denn, ich habe etwas im Kernquellcode für WordPress 3.1 übersehen. Ich glaube, Sie suchen nach einer Funktion, get_archive_link()
die Sie wie folgt 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 über das Wochenende tatsächlich 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, WordPress über trac hinzuzufügen, von dem ich glaube, dass ich es später am Abend tun werde.
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: http://www.YOURDOMAIN.com/products/
has_archive
sei ein Boolescher Wert, aber jetzt weiß ich, dass er mit einer Zeichenfolge versehen werden kann, sodass mein einzelner benutzerdefinierter Post-Typ recipe
einen Plural-Slug haben kann/recipes/
'rewrite'
akzeptiert sie nur einen Booleschen Wert oder einen Array-Wert. 'rewrite' => 'product',
Anstelle der von Ihnen aufgelisteten sollte es stattdessen sein 'rewrite' => array( 'slug' => 'product' ),
.
yoursite.com/type-slug
sofern Sie sie nicht explizit auf etwas anderes festlegen, z.yoursite.com/some-other-url
..