EDIT REVISIT NO 2
Ich habe die Transient-API noch nie berührt , bis ich heute die Antwort von @MikeSchinkel in diesem Beitrag sah . Dies hat mich dazu inspiriert, diesen Beitrag noch einmal zu besuchen. Nach einigen Tests habe ich Folgendes gefunden:
Die Ausführungszeit verringerte sich von ~ 0,07 Sekunden auf ~ 0,002 Sekunden
Die Datenbankabfragezeit hat sich um etwa die Hälfte verkürzt
Mit dem Transienten werden nur 2-dB-Abfragen ausgeführt
Funktionsweise des Codes ( Ich werde nur Änderungen gegenüber dem ursprünglichen Code von REVISIT besprechen ):
SCHRITT 1
Wir müssen den Wert von $q
in einem Transienten speichern. Dies ist der Wert, der die Kategorieliste mit Post-Titeln enthält.
SCHRITT 2
Wir müssen zuerst prüfen, ob ein Transient existiert, und wenn keiner existiert, erstellen Sie den Transienten. Wenn der Transient vorhanden ist, rufen Sie seine Informationen ab
SCHRITT 3
Diese Informationen werden nun durch eine foreach
Schleife geleitet, um die Liste mit Kategorienamen und Beitragstiteln zu drucken.
SCHRITT 4
Derzeit wird der Transient alle zwölf Stunden aktualisiert. Dies kann so eingestellt werden, dass es Ihren Anforderungen entspricht. Der Transient muss jedoch jedes Mal gelöscht und neu erstellt werden, wenn sich der Status eines Posts ändert. Dies kann vom Entwurf bis zur Veröffentlichung sein, ein neuer Beitrag wird veröffentlicht oder ein Beitrag, der in den Papierkorb verschoben wird. Dazu müssen Sie verwenden, delete_transient
welche verknüpft werden und transition_post_status
welche bei jeder Änderung des Status eines Posts ausgelöst werden
Hier ist der vollständige Code:
In Ihrer functions.php
add_action( 'transition_post_status', 'publish_new_post', 10, 3 );
function publish_new_post() {
delete_transient( 'category_list' );
}
In Ihrer Vorlage, in der Sie Ihre Liste anzeigen müssen
<?php
if ( false === ( $q = get_transient( 'category_list' ) ) ) {
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
set_transient( 'category_list', $q, 12 * HOUR_IN_SECONDS );
}
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
?>
ÜBERARBEITEN
Ich habe kürzlich eine sehr leichte Lösung gefunden, die viel schneller ist als die anderen möglichen Lösungen. Auf meiner Testseite erhalte ich laut Query Monitor eine Gesamtgenerierungszeit von nur ~ 0,07 Sekunden und nur 6-dB-Abfragen, während die anderen Methoden mir eine Generierungszeit von ~ 0,35 Sekunden und 50 zusätzliche Datenbankabfragen geben.
Hier ist eine Aufschlüsselung meiner Methode
SCHRITT 1
Sie müssen zuerst eine benutzerdefinierte Abfrage mit erstellen WP_Query
, um alle veröffentlichten Beiträge abzurufen
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
}
/* Restore original Post Data */
wp_reset_postdata();
Schritt 2
Rufen Sie get_the_category
mit eine Liste aller Kategorien ab, zu denen ein Beitrag gehört.
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
SCHRITT 3
Weisen Sie dem Beitragstitel und den Kategorien des Beitrags Variablen zu
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
und
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
SCHRITT 4
Kombinieren Sie diese beiden Variablen zu einem mehrdimensionalen Array
$q[$b][] = $a;
Um zu sehen, was im Array passiert, führen Sie einfach a aus var_dump
?><pre><?php var_dump($q); ?></pre><?php
SCHRITT 5
foreach
Erstellen Sie mithilfe von Schleifen Ihre Beitragsliste sortiert nach Kategorien
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
JETZT ALLE ZUSAMMEN!
Hier ist der vollständige Code
<?php
$args = array(
'posts_per_page' => -1
);
$query = new WP_Query($args);
$q = array();
while ( $query->have_posts() ) {
$query->the_post();
$a = '<a href="'. get_permalink() .'">' . get_the_title() .'</a>';
$categories = get_the_category();
foreach ( $categories as $key=>$category ) {
$b = '<a href="' . get_category_link( $category ) . '">' . $category->name . '</a>';
}
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
foreach ($q as $key=>$values) {
echo $key;
echo '<ul>';
foreach ($values as $value){
echo '<li>' . $value . '</li>';
}
echo '</ul>';
}
?>