wake-up-neo.net

Holen Sie sich alle Kategorien und Beiträge in diesen Kategorien

Ich suche nach einer Lösung, mit der ich Folgendes drucken kann:

Cat 1        Cat 2        Cat 3
 Post 1       Post 1       Post 1
 Post 2       Post 2       Post 2
 Post 3                    Post 3
                           Post 4

EDIT

Ich suche nach etwas, das nur one Datenbankabfrage erfordert! Wenn Sie also eine foreach in Ihrem Code haben, gefolgt von einem new WP_Query, dann ist das nicht das, wonach ich suche (ich plane, dies auf die Homepage meiner Website zu setzen).

7
Ben

EDIT REVISIT NO 2

Ich habe die Transient API noch nie angerührt, bis ich heute in diesem Beitrag @MikeSchinkel antworten sah. Dies hat mich dazu inspiriert, diesen Beitrag noch einmal zu überdenken. Nach einigen Tests habe ich Folgendes gefunden:

  • Die Ausführungszeit verringerte sich von ~ 0,07 Sekunden auf ~ 0,002 Sekunden

  • Die Zeit für die Datenbankabfrage hat sich etwa halbiert

  • Mit dem Transienten werden nur 2-dB-Abfragen ausgeführt

Wie der Code funktioniert (Ich werde nur die Änderungen des ursprünglichen Codes vonREVISITbesprechen):

SCHRITT 1

Wir müssen den Wert von $q in einem Transienten speichern. Dies ist der Wert, der die Kategorieliste mit den Beitragstiteln enthält.

SCHRITT 2

Wir müssen zuerst prüfen, ob ein Transient existiert, und wenn keiner existiert, erstellen Sie den Transient. 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 auszudrucken.

SCHRITT 4

Derzeit wird der Transient alle zwölf Stunden aktualisiert. Dies kann so eingestellt werden, dass es Ihren Bedürfnissen entspricht. Der Übergang 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 verworfen wird. Dazu müssen Sie delete_transient verwenden, das mit transition_post_status verknüpft wird und bei jeder Statusänderung eines Posts ausgelöst wird

Hier ist der vollständige Code:

In deiner 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>';
    }


?>

BESUCHE

Ich habe kürzlich eine sehr leichte Lösung gefunden, die viel schneller ist als die anderen möglichen Lösungen. Auf meiner Testsite erhalte ich eine Gesamtgenerierungszeit von nur ~ 0,07 Sekunden und nur 6-dB-Abfragen gemäß Query Monitor , während die anderen Methoden eine Generierungszeit von ~ 0,35 Sekunden und 50 zusätzliche DB-Abfragen ergeben.

Hier ist eine Aufschlüsselung meiner Methode

SCHRITT 1

Sie müssen zuerst eine benutzerdefinierte Abfrage mit WP_Query erstellen, 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 mit get_the_category 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 einen var_dump aus.

?><pre><?php var_dump($q); ?></pre><?php

SCHRITT 5

Erstellen Sie mithilfe von foreach-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>';
}

ALLES ZUSAMMEN JETZT!

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

?>
14
Pieter Goosen

Ich wollte nur meine Lösung hinzufügen, die sich aus dieser Frage ergibt. Dadurch wird die Abfrage für die Kategorien zwischengespeichert, und die Beiträge, einschließlich des Beitragsinhalts, werden in jeder Kategorie zwischengespeichert. Wenn der Cache zum ersten Mal gefüllt wird, gibt es normale Datenbankabfragen. Sobald die zwischengespeicherten Kategorien und Beiträge gefüllt sind, werden sie jedoch bereitgestellt, sodass keine Datenbankabfragen mehr erforderlich sind.

// Transients API all categories and all posts
$query_categories = get_transient('cached_categories');
if ( false === $query_categories){
    $args_cat = array(
        // order by category name ascending
        'orderby' => 'name',
        'order' => 'ASC',
        // get only top level categories
        'parent' => 0
    );
    // Instead of caching a WP Query I cache 'get_categories()'.
    $query_categories = get_categories($args_cat);
    // var_dump($query_categories);
    set_transient('cached_categories', $query_categories, DAY_IN_SECONDS );
}

// Full posts query
// if there are categories filled with posts
if (!empty ($query_categories) && !is_wp_error( $query_categories )) {

    foreach ($query_categories as $category) {

        // var_dump($category);
        $query_category_posts = get_transient('cached_posts_' . $category->slug );
        if ( false === $query_category_posts ){

            // Query all posts by slug inside each category
            $args_category_posts = array(
                'post_type' => 'post',
                // The category slug and category name we get from the foreach over all categories
                'category_name' => $category->slug
            );

            // Here I cache the WP_Query, though this runs for all categories.
            // Because of that the '$category->slug' is used to serve a string and not an object.
            $query_category_posts = new WP_Query($args_category_posts);         
            set_transient( 'cached_posts_' . $category->slug , $query_category_posts, DAY_IN_SECONDS );
        }

        if ($query_category_posts->have_posts()) {
            while ($query_category_posts->have_posts()) {
                $query_category_posts->the_post(); ?>
                <article class="<?php echo $category->slug ?>-article">
                    <h2 class="<?php echo $category->slug ?>-article-title">
                        <a href="<?php echo get_permalink() ?>"><?php echo get_the_title() ?></a>
                    </h2>
                    <p class="<?php echo $category->slug ?>-post-info">
                        <?php the_time('d. m. Y') ?>
                    </p>
                    <div <?php post_class() ?> >
                        <?php the_content(); ?>
                    </div>
                </article> <?php
            }
        } // end loop
    } // end foreach
wp_reset_postdata() ;
} // end if there are categories filled with posts
1
lowtechsun

versuchen Sie jetzt diesen Code

$cat_ids=array();
foreach (get_categories() as $cat)
{
    array_Push($cat_ids, $cat->cat_ID);
}
$the_query = new WP_Query(array('post_type'=>'post', array('category__and' => $cat_ids) ) );
if( $the_query->have_posts() ): 
    while ( $the_query->have_posts() ) : $the_query->the_post(); 
        echo the_title();
    endwhile;
endif; 
wp_reset_query();
0
nikhil gadhiya