Ich habe einen benutzerdefinierten Beitragstyp namens books
. Dieser benutzerdefinierte Beitragstyp hat eine Taxonomie namens book_category
. Ab sofort und in absehbarer Zeit gibt es 5 Kategorien, unter denen jedes Buch gefiltert werden kann.
Jetzt hat jede dieser Kategorien ihre eigene Seite, auf der die Bücher basierend auf der jeweiligen Kategorie abgefragt werden (neben anderen Zusatzinformationen zu jeder Kategorie).
In meinem Code unten habe ich versucht, Beiträge basierend auf is_page()
abzufragen. Während dies funktioniert ... sagt mir etwas, dass es eine effizientere/richtigere Art gibt, damit umzugehen.
<?php
if (is_page('horror')) {
$theTermBasedOnPage = 'horror';
} elseif (is_page('comedy')) {
$theTermBasedOnPage = 'comedy';
} elseif (is_page('romantic')) {
$theTermBasedOnPage = 'romantic';
} elseif (is_page('nonfiction')) {
$theTermBasedOnPage = 'nonfiction';
} elseif (is_page('drama')) {
$theTermBasedOnPage = 'drama';
}
$args = array(
'posts_per_page' => -1,
'post_type' => 'books',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'book_category',
'terms' => $theTermBasedOnPage,
),
),
);
?>
Was ist der beste Weg, um Beiträge (Custom Post Type> Taxonomy) basierend auf Seite abzufragen?
Um dies effizienter zu gestalten, platzieren Sie statt der Argumentation über den aktuellen Seitenbuckel einfach den aktuellen Buckel als den Begriffswert der tax_query. So etwas wie:
global $post;
$args = array(
'posts_per_page' => -1,
'post_type' => 'books',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'book_category',
'field' => 'slug',
'terms' => $post->post_name, // which'd be `horror` or `comedy`, etc
),
),
);
Beachten Sie, dass es sehr wahrscheinlich ist, dass menschliches Versagen die Dinge auf diese Weise erledigt: Zum Beispiel kann eine Seite mit nonfiction
, aber ein book_category-Ausdruck mit non-fiction
die Logik brechen und Probleme verursachen.
Ich kenne den Kontext nicht, an dem Sie arbeiten, aber wenn das Ziel nur "jede dieser Kategorien hat ihre eigene Seite" ist, müssen Sie diese benutzerdefinierte Abfrage nicht mit erstellen -manual-page-relation für jeden begriff. WordPress-Taxonomien und -Begriffe haben ihre eigenen URLs, wenn Sie registriert die Taxonomie als public
und publicly_queryable
haben. (Vermutung hier, aber) Sie können wahrscheinlich your-site.com/book_category/horror/
besuchen und die Liste der Horrorbücher sehen. Sie können dann die Vorlagendateien für alle Begriffe oder einzeln anpassen, indem Sie die WordPress-Vorlagenhierarchie als Referenz verwenden.
Sie müssen keine benutzerdefinierte Abfrage mit $args
erstellen, um die benutzerdefinierten Taxonomieseiten abzurufen. Sie können einfach der von WordPress bereitgestellten URL-Struktur folgen.
Sagen wir zum Beispiel:
Dann haben Sie einen benutzerdefinierten Beitragstyp Book
erstellt.
Erstellt benutzerdefinierte Taxonomie Book Category
und verknüpft mit Book
.
Erstellen Sie dann eine neue Book
mit dem Titel My Horror Story
unter Horror
als Book Category
.
Außerdem wurde eine weitere neue Book
mit dem Titel My Comedy Story
unter Comedy
als Book Category
erstellt.
Mit allen anderen Standardeinstellungen generiert WordPress automatisch die folgenden URLs für Sie:
// Book Links
https://example.com/book/my-comedy-story/
https://example.com/book/my-horror-story/
// Book Category Links
https://example.com/book-category/comedy/
https://example.com/book-category/horror/
Verwenden Sie diese URLs für Ihre gewünschten benutzerdefinierten Taxonomieseiten.
Sie können auch die Designvorlagendateien bearbeiten, um das gewünschte Design zu erstellen. Schauen Sie sich WordPress Template Hierarchy an, um zu erfahren, wie das geht.
Beispielsweise können Sie eine Vorlagendatei mit dem Namen taxonomy-book-category.php
erstellen, um benutzerdefinierte Taxonomieseiten für Book Category
zu entwerfen.
Verwenden Sie in dieser Vorlagendatei WordPress Template Tags und The Loop für erforderliche Abfragen.
Eine sehr einfache Vorlagendatei kann beispielsweise folgendermaßen aussehen:
<?php
if ( have_posts() ) : while ( have_posts() ) : the_post();
the_content();
endwhile;
else :
_e( 'Sorry, no book matched your criteria.', 'textdomain' );
endif;
?>
Versuche dies:
<?php
// Get post's all terms.
$terms = wp_get_post_terms( get_the_ID(), 'book_category' );
// Get first term ID
$currentPostTermID = $terms[ 0 ]->term_id;
$args = array(
'posts_per_page' => -1,
'post_type' => 'books',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'book_category',
'terms' => $currentPostTermID,
),
),
);
?>