webentwicklung-frage-antwort-db.com.de

In der Schleife: Beiträge haben Thumbnail und andere Variablen

Ich möchte Posts anzeigen, die bestimmte Anforderungen erfüllen. In erster Linie geht es darum, den Besuchern die meistgesehenen Beiträge zu zeigen. Ich habe das implementiert mit etwas Hilfe . Also habe ich das mit dem folgenden PHP funktioniert. Ich habe das für mich zum Laufen gebracht, das ist schön. Jetzt möchte ich eine Einschränkung hinzufügen, nämlich: Nur Beiträge mit Miniaturansichten sollten für die Schleife in Frage kommen, aber Sie können einen Beitrag nicht einfach überspringen, wenn er keine Miniaturansicht hat und nur weniger Beiträge in der tatsächlichen Ausgabe bereitstellen: Ich brauche insgesamt vier Beiträge! Im Idealfall möchte ich der WP_Query ein Argument übergeben, das "has thumbnail" lautet. Ich brauche aber auch den bereits vorhandenen meta_key. Wie kann ich diesen Metaschlüssel behalten und einen anderen verwenden? Ich habe hier gefunden, dass Sie 'key' => '_thumbnail_id' hinzufügen können, bin mir jedoch nicht sicher, wie ich dieser Abfrage mehrere Schlüssel hinzufügen kann.

Denken Sie daran, dass ich orderby verwenden muss, die die Posts in der Reihenfolge der meisten Aufrufe anordnet.

Der Vollständigkeit halber werde ich den gesamten Ausschnitt veröffentlichen, wobei die Antwort von Pieter Goosen im Auge behalten wird. Ich dachte, die "30 Tage" würden keinen Unterschied machen, aber jetzt merke ich, dass es möglich ist. post_date_selection ist eine Funktion in functions.php, die die Beiträge auf die letzten 30 Tage beschränkt. Ich habe es von hier bekommen.

<?php if (is_home()) : ?>
  <section class="featured-posts clear">
    <?php // restrict loop to 30 last days, see functions.php
      add_filter('posts_where', 'post_date_selection');
      global $query_string;
      query_posts($query_string);
    ?>
    <?php 
      $args = array(
        'order'             => 'DESC',
        'posts_per_page'    => 4,
        'meta_key'          => 'post_views_count',
        'orderby'           => 'meta_value_num',
        'meta_query'        => array(
          'relation'      => 'AND',
          array(
            'key' => 'post_views_count',
            'compare' => 'EXISTS'
          ),
          array(
            'key' => '_thumbnail_id',
            'compare' => 'EXISTS'
          ),
        ),
      );
      $popularPosts = new WP_Query($args);
      $counter = 1;
    ?>
    <?php while ($popularPosts->have_posts() ) : $popularPosts->the_post(); ?>
      <article class="box-<?php echo $counter++; ?>">
        <a href=" <?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?><span><?php the_title(); ?></span></a>
      </article>
    <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>
  </section>
<?php endif; // is_home ?>
<?php remove_filter('posts_where', 'post_date_selection'); // remove restriction from loop ?>

Wichtigste Funktionen in functions.php:

/*
 * Getting and setting post count
 */
// Set post count
function set_post_views($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
}
// To keep the count accurate, lets get rid of prefetching
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

// Update post count
function track_post_views ($post_id) {
    if ( !is_single() ) return;
    if ( empty ( $post_id) ) {
        global $post;
        $post_id = $post->ID;    
    }
    set_post_views($post_id);
}
add_action( 'wp_head', 'track_post_views');

// Only 30 last days, needs in content
function post_date_selection ($when = '') {
    $when .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
    return $when;
}
3
Bram Vanroy

Sie können die benutzerdefinierten Feldparameter in WP_Query verwenden. Sie müssen sie nur noch ein wenig erweitern

Sie können nach post_views_count sortieren und meta_query verwenden, um alle Beiträge mit der höchsten Anzahl an Beitragsansichten und einem Beitragsminiaturbild abzurufen

Sie können wahrscheinlich so etwas versuchen

$args = array(
    'order'             => 'DESC',
    'posts_per_page'    => 20,
    'meta_key'          => 'post_views_count',
    'orderby'           => 'meta_value_num',
    'meta_query'        => array(
        'relation'      => 'AND',
        array(
            'key' => 'post_views_count',
            'compare' => 'EXISTS'
        ),
        array(
            'key' => '_thumbnail_id',
            'compare' => 'EXISTS'
        ),
    ),
);
$popularPosts = new WP_Query( $args );

Für eine genauere Zählung der Post-Views schauen Sie sich diesen Post an, den ich zu diesem Thema gemacht habe. Es ist sehr genau und zählt keine Doppelansichten

EDIT

Nur als Randnotiz, Sie müssen Ihre benutzerdefinierte Abfrage zurücksetzen, und in diesem Fall beliebige und alle benutzerdefinierte Abfragen, da sie beeinflusst werden und andere Abfragen beeinflussen. Fügen Sie kurz nach <?php endwhile; ?><?php wp_reset_postdata(); ?> hinzu.

EDIT 2

Ich habe Ihren Code getestet und er bricht meinen Seitenleisteninhalt. Ich habe Ihren Code in den folgenden Code geändert. Es funktioniert wie erwartet, nur die Posts der letzten 30 werden abgerufen, da die Thumbnails der Posts nach der höchsten Anzahl der Posts sortiert sind. Ich teste dies auch auf localhost. Eine andere Sache, die Sie beachten müssen, müssen Sie Wordpress 3.9+ haben, damit dies funktioniert

Sie müssen keinen Wert angeben, wenn Sie die Vergleiche 'EXISTS' oder 'NOT EXISTS' in WordPress 3.9 oder höher verwenden.

<?php if (is_home()) : ?>
    <section class="featured-posts clear">
        <?php
        function filter_where($where = '') {
        //posts in the last 30 days
            $where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
            return $where;
        }

        add_filter('posts_where', 'filter_where');

        $args = array(
            'order'             => 'DESC',
            'posts_per_page'    => 20,
            'meta_key'          => 'post_views_count',
            'orderby'           => 'meta_value_num',
            'meta_query'        => array(
                'relation'      => 'AND',
                array(
                    'key' => 'post_views_count',
                    'compare' => 'EXISTS'
                ),
                array(
                    'key' => '_thumbnail_id',
                    'compare' => 'EXISTS'
                ),
            ),
        );
        $popularPosts = new WP_Query( $args );

        remove_filter('posts_where', 'filter_where');

        $counter = 1; ?>

        <?php while ($popularPosts->have_posts() ) : $popularPosts->the_post(); ?>
        <article class="box-<?php echo $counter++; ?>">
            <a href=" <?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_post_thumbnail(); ?>
                <span><?php the_title(); ?></span>
            </a>
        </article>
        <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>

    </section>
<?php endif; // is_home ?>

EDIT 3

Sie können auch den in Diese Antwort von @ialocin beschriebenen Ansatz verwenden, um einen Filter mithilfe von pre_get_posts anzuwenden und zu entfernen. Dieser Code kann sehr einfach zur Verwendung in Ihrer benutzerdefinierten Abfrage angepasst werden. Ich persönlich denke, dass dies eine bessere Methode ist, um Ihren benutzerdefinierten Filter für Ihre benutzerdefinierte Abfrage anzuwenden und zu entfernen

3
Pieter Goosen