Frage

Wenn ich eine Schleife aus einer Kategorie -Abfrage läuft wie:

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<ul>
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<li>.. </li><?php wp_reset_query(); ?>
<?php endwhile; ?>
</ul>

Wie würde ich eine IF -Klausel erstellen, die die Liste in einem bestimmten Abstieg bricht und eine neue startet. Also zum Beispiel am 10. Beitrag zurückgeben a </ul> und starten Sie einen neuen <ul> um 11.

Dies ist falsch, aber mein Ziel zu veranschaulichen:

<?php $count =0;
    while($count <=50){
        if ($count == 9){
            echo "<li><a href='<?php the_permalink(); ?>'>
                      <?php the_title(); ?></a></li></ul>";
            } 
        elseif ($count == 10){
        echo "<ul><li><a href='<?php the_permalink(); ?>'>
                          <?php the_title(); ?></a></li>";
        }
        else {
        echo "<li><a href='<?php the_permalink(); ?>'><?php the_title(); ?></a></li>";
        }

Was ist der richtige Weg, um diese Logik in die Schleife aufzunehmen?

War es hilfreich?

Lösung

Erstellen Sie Spalten für Ihre Abfrage und einfaches Display

In Themen ist wahrscheinlich nützlicher, um etwas zu haben, das gut in Vorlagen -Tags und die Schleife passt. Meine erste Antwort konzentrierte sich nicht so sehr. Außerdem dachte ich, es sei ein bisschen zu kompliziert für eine schnelle Akzeptanz.

Ein einfacher Ansatz, der mir in den Sinn kam, war, sich zu erstrecken "die Schleife" mit Säulen und kam bisher zu dieser Lösung:

EIN Wp_query_columns Das Objekt "erweitert" jede Standard -WP -Abfrage mit Colums, die leicht überarbeitet werden können. Der erste Parameter ist die Abfragevariable und der zweite Parameter ist die Anzahl der Elemente, die pro Spalte angezeigt werden sollen:

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<?php foreach(new WP_Query_Columns($the_query, 10) as $column_count) : ?>
    <ul>
        <?php while ($column_count--) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>
    </ul>
<?php endforeach; ?>

Um es zu verwenden, fügen Sie einfach das hinzu Wp_query_columns Klasse aus diesem GIST zu Ihren Themen function.php.

Erweiterte Verwendung

Wenn Sie die derzeit angezeigte Spaltennummer benötigen (z. B. für einige gleichmäßige/ungerade CSS -Klassen, können Sie diese auch von der Foreach erhalten:

<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>

Und die Gesamtzahl der Spalten ist ebenfalls verfügbar:

<?php 
    $the_columns = new WP_Query_Columns($the_query, 10);
    foreach($the_columns as $column => $column_count) : 
?>
    <h2>Column <?php echo $column; ?>/<?php echo sizeof($the_columns); ?></h2>
    <ul>...

Zweiundzwanzig Beispiel

Ich könnte schnell das Tenundzwanzig -Thema für einen Test hacken und über jede Schleife über jede Schleife hinzufügen. Es ist in Loop.php eingefügt. Der Anfang ist der Code des Themas:

<?php /* If there are no posts to display, such as an empty archive page */ ?>
<?php if ( ! have_posts() ) : ?>
    <div id="post-0" class="post error404 not-found">
        <h1 class="entry-title"><?php _e( 'Not Found', 'twentyten' ); ?></h1>
        <div class="entry-content">
            <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'twentyten' ); ?></p>
            <?php get_search_form(); ?>
        </div><!-- .entry-content -->
    </div><!-- #post-0 -->
<?php endif; ?>

<!-- WP_Query_Columns -->
<?php 
    ### Needs WP_Query_Columns --- see http://wordpress.stackexchange.com/q/9308/178
    $query_copy = clone $wp_query; // save to restore later
    foreach( new WP_Query_Columns($wp_query, 3) as $columns_index => $column_count ) : ?>
    <ul>
        <?php 
        while ( $column_count-- ) : the_post(); ?>
            <li><h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2></li>
        <?php endwhile; ?>
    </ul>       
<?php endforeach; ?>
<?php $wp_query = $query_copy;?>

<?php
    /* Start the Loop.
    ...

Für eine längere Antwort:

(Im Grunde genommen bin ich zu den obigen Dingen gekommen, erklärt aber besser, wie man das Problem mit einfachen mathematischen Operationen tatsächlich lösen kann. Meine neue Lösung ist es, über etwas vorbereitete zu iterieren.)

Es hängt ein wenig an, wie viel Sie tatsächlich benötigen, um das Problem zu lösen.

Wenn beispielsweise die Anzahl der Elemente pro Spalte eins ist, ist dies sehr einfach:

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>    
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<ul>
    <li>.. </li>
<ul>
<?php endwhile;  wp_reset_query(); ?>
</ul>

Selbst mit diesem einfachen Code ist ersichtlich, dass mehrere Entscheidungen getroffen werden müssen:

  • Wie viele Elemente befinden sich in einer Spalte?
  • Wie viele Artikel gibt es insgesamt?
  • Gibt es eine neue Spalte zum Starten?
  • Und gibt es eine Spalte zu enden?

Die letzte Frage ist ziemlich interessant für die HTML -Ausgabe, da Sie wahrscheinlich nicht nur Elemente, sondern auch die Spalte mit HTML -Elementen einschließen möchten.

Zum Glück können wir alle diese in Variablen festlegen und Code erstellen, der immer unsere Anforderungen berechnet.

Und manchmal sogar können wir nicht einmal jede Frage von Anfang an beantworten. Für Exmaple die Anzahl der Gesamtelemente: Gibt es eine, einige, mehrere, eine genaue Anzahl, die mit einer ganzzahligen Anzahl von Spalten insgesamt übereinstimmt?

Sogar Jan Fabrys Antwort könnte in einigen Fällen funktionieren (wie mein Beispiel oben für das Szenario mit einem Elementen pro Spalt), interessieren Sie sich möglicherweise für etwas, das für eine beliebige Anzahl von Elementen funktioniert, die von WP_Query zurückgegeben werden.

Zuerst für die Mathematik:

//
// arithmetical example:
//
# configuration:
$colSize = 20;  // number of items in a column
$itemsTotal = 50; // number of items (total)

# calculation:
$count = 0; // a zero-based counter variable
$isStartOfNewColum = 0 === ($count % $colSize); // modulo operation
$isEndOfColumn = ($count && $isStartOfNewColum) || $count === $itemsTotal; // encapsulation

Dieser Code wird nicht ausgeführt. Lassen Sie uns das in ein einfaches Textbeispiel aufnehmen

//
// simple-text example:
//
$column = 0; // init a column counter
for($count=0; $count<= $itemsTotal; $count++) {
    $isStartOfNewColum = 0 === ($count % $colSize); // modulo
    $isEndOfColumn = ($count && $isStartOfNewColum);
    $isStartOfNewColum && $column++; // update column counter

    if ($isEndOfColumn) {
        printf("/End of Column: %d\n", $column-1);
    }

    if ($isStartOfNewColum) {
        printf("<start of Column: %d\n", $column);
    }

    printf(" * item %d\n", $count);
}
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
    printf("/End of Column: %d\n", $column);
}

printf("Done. Total Number of Columns: %d.\n", $column);

Dies läuft tatsächlich und gibt bereits Ausgabe aus:

<start of Column: 1
 * item 0
 * item 1
 * item 2
 * item 3
...
 * item 17
 * item 18
 * item 19
/End of Column: 1
<start of Column: 2
 * item 20
 * item 21
 * item 22
...
 * item 37
 * item 38
 * item 39
/End of Column: 2
<start of Column: 3
 * item 40
 * item 41
 * item 42
...
 * item 48
 * item 49
 * item 50
/End of Column: 3
Done. Total Number of Columns: 3.

Dies simuliert schon ziemlich gut wie es könnte Sieh wie in einer WordPress -Vorlage aus:

//
// wordpress example:
//
$count = 0; // init item counter
$column = 0; // init column counter
$colSize = 10; // column size of ten this time
$the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');
$itemsTotal = $the_query->post_count;
?>
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<?php
    # columns display variables 
    $isStartOfNewColum = 0 === ($count % $colSize); // modulo
    $isEndOfColumn = ($count && $isStartOfNewColum);
    $isStartOfNewColum && $column++; // update column counter

    if ($isEndOfColumn) {
        print('</ul>');
    }

    if ($isStartOfNewColum) {
        printf('<ul class="col-%d">', $column);
    }
?>
    <li> ... make your day ...
    </li>
<?php endwhile; ?>
<?php
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
    print('</ul>');
}
// You don't have to do this in every loop, just once at the end should be enough
wp_reset_query();
?>

(Ich habe das letzte Beispiel in einer WP -Umgebung nicht ausgeführt, aber es sollte zumindest syntaktisch korrekt sein.)

Andere Tipps

Dies ist eher eine allgemeine Programmierungsfrage, aber hier ist die Grundidee:

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<ul>
<?php
$post_counter = 0;
while ($the_query->have_posts()) :
    $the_query->the_post();
    $post_counter++;
?>
    <li>.. </li>
<?php
    if ( 0 == $post_counter % 10 ) {
        echo '</ul><ul>';
    }
endwhile;
?>
</ul>
<?php
// You don't have to do this in every loop, just once at the end should be enough
wp_reset_query();
?>

Es ist nicht erforderlich, ein separates VAR für das Zählen zu erstellen, da die Abfrage -VAR es bereits zählt: $wp_query->current_post. Außerdem müssen Sie den endgültigen Eintrag in der Liste berücksichtigen, damit Sie nicht leer sind <ul></ul> in Ihrem Markup.

<?php 
$the_query = new WP_Query('showposts=21&orderby=title&order=asc'); 
echo "<ul>";
while ($the_query->have_posts()) :
    $the_query->the_post();
    echo "<li>{$the_query->current_post}</li>";

    // Note that the post is already counted in the $the_query->current_post variable when in the loop. Add one to translate array counting to real counts.
    // Jan's example didn't account for the final entry in the list. Don't want empty <ul>'s hanging around
    if ((($the_query->current_post+1) % 10 == 0) && ($the_query->current_post+1 !== count($the_query->posts))):
        echo "</ul><ul>";
    endif;
endwhile;
echo "</ul>";
?>

Ergänzen Sie die get_columns_array() Funktion zu Ihrer Funktion.php. Sie können dann leicht über Ihre Spalten iterieren:

In Ihrem Thema sind Sie dann über die Spalten zu schleifen:

<?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?>
<?php foreach(get_columns_array($post_count) as $column_count) : ?>
    <ul>
        <?php while ($column_count--) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>
    </ul>
<?php endforeach; wp_reset_postdata(); ?>

Ich habe die Standardgröße einer Spalte auf 10 gesetzt. Sie können den zweiten Parameter verwenden, um die Größe einer Spalte selbst einzustellen. Mag wie 7: get_columns_array($post_count, 7);.

Hier ist ein weiterer Ansatz, den Sie verfolgen können:

$article = 0;

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
        <?php $article = $article + 1; ?>
        <?php if ($article % 3 == 1) echo '<div class="row-fluid">';  ?>
            <div class="span4">
            <h2><a href="<?php esc_url( the_permalink() ); ?>" title="Permalink to <?php the_title(); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
            </div><!--/span-->
        <?php if ($article % 3 == 0) echo '</div><!--/row-->';  ?>
    <?php endwhile;?>
<?php else: ?>
<h2>...</h2>
<?php endif; ?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit wordpress.stackexchange
scroll top