it-swarm.com.de

Sehr ineffiziente WordPress-Loops!

Ich arbeite gerade an einer Seite für ein Orchester. Die verschiedenen Mitglieder müssen je nach Instrument aufgelistet werden. Die Mitglieder haben einen benutzerdefinierten Beitragstyp für Biografien und ich erfasse den Instrumentenwert über ein benutzerdefiniertes Feld.

Die einzige Möglichkeit, herauszufinden, wie die relevanten Personen in den entsprechenden Abschnitten angezeigt werden, besteht darin, immer wieder den benutzerdefinierten Beitragstyp durchzugehen und die Personen, die ein bestimmtes Instrument spielen, durch Vergleichen des Meta-Werts anzuzeigen.

Code sieht so aus:

<?php $args = array( 'post_type' => 'biographies', 'posts_per_page' => -1 ); ?>

    <ul class="no-bull hijax">
        <?php $biog = new WP_Query($args);
            if( $biog->have_posts() ) : while( $biog->have_posts() ) : $biog->the_post();
                $player = get_post_meta($post->ID, 'player', true);
                if ($player == 'yes') :
                    $instrument = get_post_meta($post->ID, 'instrument', true);
                    if ($instrument == 'violin') :
                    ?>
                        <li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo($instrument); ?></li>
                    <?php
                    endif;
                endif;
            endwhile; endif;
        wp_reset_query();
        $biog = new WP_Query($args);
            if( $biog->have_posts() ) : while( $biog->have_posts() ) : $biog->the_post();
                $player = get_post_meta($post->ID, 'player', true);
                if ($player == 'yes') :
                    $instrument = get_post_meta($post->ID, 'instrument', true);
                    if ($instrument == 'viola') :
                    ?>
                        <li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo($instrument); ?></li>
                    <?php
                    endif;
                endif;
            endwhile; endif;
        wp_reset_query(); 
        $biog = new WP_Query($args);
            if( $biog->have_posts() ) : while( $biog->have_posts() ) : $biog->the_post();
                $player = get_post_meta($post->ID, 'player', true);
                if ($player == 'yes') :
                    $instrument = get_post_meta($post->ID, 'instrument', true);
                    if ($instrument == 'cello') :
                    ?>
                        <li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo($instrument); ?></li>
                    <?php
                    endif;
                endif;
            endwhile; endif;
        wp_reset_query();

etc. etc. ad nauseum. (Derzeit befinden sich 12 Loops auf der Seite !!)

Dies ist eindeutig völlig ineffizient, aber ganz einfach, ich kann keinen besseren Code schreiben, als dies und brauche Hilfe!

1
Richard Sweeney

Du könntest es mit einer Schleife machen, du brauchst nur eine gültige Sortierreihenfolge, oder? Spieler mit einem Instrument, gefolgt vom nächsten und so weiter.

UPDATE: Nach dem Kommentar des Fragestellers können Sie immer noch eine Abfrage verwenden und mit rewind_posts() die Schleife so oft wie möglich durchlaufen Sie brauchen, dh. Mach so etwas, um eine benutzerdefinierte Sortierung zu erhalten.

<?php
// Add the instruments into the array below, in the order you want them in.
$instruments = array( 'violin', 'viola', 'cello' );

$args = array( 
    'post_type' => 'biographies', 
    'posts_per_page' => -1,
    'nopaging' => true,
    'surpress_filters' => true,
    'meta_query' => array(
        array(
            'key' => 'player',
            'value' => 'yes',
            'compare' => '=',
            'type' => 'CHAR'
        ),
        array(
            'key' => 'instruments',
            'value' => $instruments,
            'compare' => 'IN',
            'type' => 'CHAR'
        )
    ),
); 

$bios = new WP_Query( $args);
?>

<?php if( $bios->have_posts() ) : ?>

    <ul class="no-bull hijax">

    <?php
    foreach( $instruments as $instrument ) :

        while( $bios->have_posts() ) : $bios->the_post();

            $player_instrument = get_post_meta( get_the_ID(), 'instrument', true );

            if( $instrument != $player_instrument )
                continue;
        ?>

        <li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo $player_instrument; ?></li>

        <?php 

        endwhile; 
        rewind_posts();

    endforeach;
    wp_reset_query();
    ?>

    </ul>

<?php endif; ?>

Mal sehen, ob das den gewünschten Effekt hat .. :)

2
t31os

Ich würde auch die Verwendung benutzerdefinierter Taxonomien empfehlen. Ein Schnittpunkt zwischen den Taxonomien "Instrument" und "Player" würde dies kurz machen. Aber wenn das nicht praktikabel ist, könnte das vielleicht funktionieren:

$args = array(
  'post_type' => 'biographies',
  'posts_per_page' => -1,
  'meta_key' => 'instrument',
  'orderby' => 'meta_value'
);

query_posts($args);

while(have_posts()) : the_post();
  $inst = get_post_meta($post_id, 'instrument', true);
  $player = get_post_meta($post_id, 'player', true);
  if ('yes' == $player) {
  ?>
    <li><a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> : <?php echo $inst; ?></li>
  <?php
  }

endwhile;
4
Dougal Campbell

Ähm ... Sie müssen nicht immer wieder eine Schleife schreiben. Arbeiten Sie nur an dem Teil, der geändert wird. Die Schleife durchläuft trotzdem alle Datensätze. Btw: Ich würde keine benutzerdefinierten Felder dafür erstellen. Eine "Instrumenten" -Taxonomie mit "Violine", "Viola" usw. als Begriff wäre viel einfacher und bietet Ihnen viel mehr Möglichkeiten (nämlich Vorlagen-Tags) , z.B. Erstellen von Untersteuern wie "Blasinstrumente", "Schlaginstrumente" usw. Sie sollten auch die Anweisung "if" innerhalb des Elements "<li>" verschieben, da sie sich ebenfalls nicht ändert. Das einzige, was ist der if $instrument == '' und der echo $instrument; (die ohne den umgebenden () geschrieben werden können).

   if ($instrument == 'violin') : // only $instrument changes, right?
   ?>
     <li>
        <a id="artist_id_<?php the_ID(); ?>" class="nb" href="<?php the_permalink(); ?>">
           <?php the_title(); ?>
        </a> : <?php echo($instrument); ?>
     </li>
   <?php
   elseif ($instrument == 'violin') :
      // do stuff...
   endif;

Bearbeiten: Sie können eine benutzerdefinierte Taxonomie mit dem Namen "instruments" verwenden und dann Ihre Abfrage in der gewünschten Reihenfolge filtern:

// @link: http://codex.wordpress.org/Function_Reference/taxonomy_exists  
if ( taxonomy_exists('instruments') ) :
  // @link: http://codex.wordpress.org/Function_Reference/has_term
  if ( has_term( 'instruments', 'viola', get_post_ID() ) ): 
    # DO STUFF HERE, eg. echo term
  endif;
endif;

Stellen Sie einfach eine Schleife her und hinterfragen Sie innerhalb der while-Schleife den Begriff und das Echo/Display-Zeug. Anstatt den if ( has_term( zu verwenden, können Sie auch einen Schalter verwenden, um die Lesbarkeit zu verbessern.

Durch die Verwendung dieser Lösung werden weitere DB-Aufrufe mit get_post_meta() vermieden. Dabei wird für jedes Instrument der DB und nicht das Post-Objekt aufgerufen.

0
kaiser