it-swarm.com.de

Suchergebnisse nach Beitragstyp trennen

Ursprüngliche Frage: Separating Custom Post Search Results

Ich habe versucht, diesen Code auf meiner Website zu implementieren, aber ich habe ein Problem damit. Was ich geändert habe, ist, dass ich wie folgt einen weiteren Schalter für den dritten Beitragstyp hinzugefügt habe:

<?php if (have_posts()) : ?>
    <?php
    $last_type = "";
    $typecount = 0;
    while (have_posts()) :
        the_post();
        if ($last_type != $post->post_type) {
            $typecount = $typecount + 1;
            if ($typecount > 1) {
                echo '</div><!-- close container -->'; //close type container
            }
            // save the post type.
            $last_type = $post->post_type;
            //open type container
            switch ($post->post_type) {
                case 'post':
                    echo "<div class=\"postsearch container\"><h2>Blog Results</h2>";
                    break;
                case 'partner':
                    echo "<div class=\"partnersearch container\"><h2>Partner Search Results</h2>";
                    break;
                case 'fiches_pratiques':
                    echo "<div class=\"lessonsearch container\"><h2>lesson Search Results</h2>";
                    break;
            }
        }
        ?>

        <?php if ('post' == get_post_type()) : ?>
            <li class="post"><?php the_title(); ?></li>
        <?php endif; ?>

        <?php if ('partner' == get_post_type()) : ?>
            <li class="partner"><?php the_title(); ?></li>
        <?php endif; ?>

        <?php if ('lesson' == get_post_type()) : ?>
            <li class="lesson"><?php the_title(); ?></li>
        <?php endif; ?>


    <?php endwhile; ?>

<?php else : ?>
    <div class="open-a-div">
        <p>No results found.</p>    

    <?php endif; ?>       

Dieser Code führt zu folgenden Ergebnissen:

Ergebnisse der Unterrichtssuche

Lektion 1 Lektion 4 Lektion 3

Blog-Ergebnisse

Sub testen

Ergebnisse der Partnersuche

Vierter Partner

Blog-Ergebnisse

Lorem ipsum Wave 2.0 Web- und Tech-Cloud-Open-Container-Projekt

Wie Sie sehen können, ist der Abschnitt mit den Blog-Ergebnissen doppelt so groß. Irgendwelche Vorschläge, was das Problem sein könnte?

Installierte Such-Plugins: Relevanssi

ANMERKUNG: ohne Relevanssi (aber mit dem Plugin "Alles durchsuchen") wird es ordnungsgemäß angezeigt, aber das Plugin "Alles durchsuchen" erlaubt keine Suche nach mehreren Begriffen, was in meinem Fall ein Muss ist.

Neueste Wordpress-Version.

Danke im Voraus.

1
semibur

Hier ist eine Idee, sortieren Sie Ihre Schleife, bevor es ausgeführt wird. Ihre aktuelle Ausgabe ist genau das. Sie werden feststellen, dass die Art der Sortierung ( wenn ich richtig liege, wenn ich glaube, dass Ihre Reihenfolge nicht alphabetisch nach Post-Typ ist ) von Haus aus nicht möglich ist. Daher benötigen wir eine Problemumgehung ( gerade) Wenn Sie nur alphabetisch sortierte Beitragstypen benötigen, fehlt der native Weg immer noch die richtige Funktionalität ). Hier kommt usort() ins Spiel, wir können den Beitragstyp nach Belieben sortieren. Dies geschieht im the_posts-Filter

Ich kann Ihnen beide Beispiele zeigen. HINWEIS: Für das Codebeispiel ist mindestens PHP 5.4+ erforderlich. Dies sollte jetzt Ihre Mindestversion sein. Alle Versionen vor 5.4 sind EOL-fähig, werden nicht unterstützt und stellen daher ein großes Sicherheitsrisiko dar, wenn Sie diese Versionen weiterhin verwenden.

SORTIEREN NACH BENUTZERDEFINIERTER POST ART BESTELLUNG

add_filter( 'the_posts', function( $posts, $q ) 
{
    if( $q->is_main_query() && $q->is_search() ) 
    {
        usort( $posts, function( $a, $b ){
            /**
             * Sort by post type. If the post type between two posts are the same
             * sort by post date. Make sure you change your post types according to 
             * your specific post types. This is my post types on my test site
             */
            $post_types = [
                'event_type' => 1,
                'post'       => 2,
                'cameras'    => 3
            ];              
            if ( $post_types[$a->post_type] != $post_types[$b->post_type] ) {
                return $post_types[$a->post_type] - $post_types[$b->post_type];
            } else {
                return $a->post_date < $b->post_date; // Change to > if you need oldest posts first
            }
        });
    }
    return $posts;
}, 10, 2 );

SORTIEREN NACH POST TYP ALPHABETISCHE BESTELLUNG

add_filter( 'the_posts', function( $posts, $q ) 
{
    if( $q->is_main_query() && $q->is_search() ) 
    {
        usort( $posts, function( $a, $b ){
            /**
             * Sort by post type. If the post type between two posts are the same
             * sort by post date. Be sure to change this accordingly
             */

            if ( $a->post_type != $b->post_type ) {
                return strcasecmp( 
                    $a->post_type, // Change these two values around to sort descending
                    $b->post_type 
                );
            } else {
                return $a->post_date < $b->post_date; // Change to > if you need oldest posts first
            }
        });
    }
    return $posts;
}, 10, 2 );

Ihre Beiträge sollten jetzt nach Beitragstyp auf Ihrer Suchseite sortiert sein, wenn Sie anstelle Ihrer Hauptabfrage keine benutzerdefinierte Abfrage verwenden. Behalten Sie den obigen Code bei, da keine Anpassungen erforderlich sind

5
Pieter Goosen

Sie erhalten Ihre Post-Ergebnisse in der Reihenfolge, in der das Relevanssi-Plugin dies für richtig hält. Das heißt, Sie erhalten die Ergebnisse in der relevantesten Reihenfolge gemäß der Logik des Plugins (ich weiß nicht genau, was das ist), auf die sich das Plugin bezieht.

Generell ist es nicht so schwierig, nach Posttyp zu bestellen:

function orderby_type($orderby) {
  remove_filter('posts_orderby','orderby_type');
  global $wpdb;
  return $wpdb->posts.'.post_type';
}
add_filter('posts_orderby','orderby_type');
$args = array(
  'post_type' => array('post','page','book'),
  'orderby' => 'post_type'
);
$w = new WP_Query($args);

Allerdings würde ich davon ausgehen, dass das Plugin die "relevante" Bestellung aufgibt. Tatsächlich wird alles, was Sie tun, wahrscheinlich die "Relevanz" -Berechnung in gewissem Maße durchbrechen. In etwa das Folgende sollte das Beste sein, was Sie tun können:

function resort_posts($posts) {
  $sorted = $ret = array();
  foreach ($posts as $p) {
    $sorted[$p->post_type][] = $p;
  }
  foreach ($sorted as $s) {
    $ret = array_merge($ret,$s);
  }
  // verify
//   $pid = wp_list_pluck($posts,'ID');
//   $sid = wp_list_pluck($ret,'ID');
//   var_dump(array_diff($pid,$sid));
  return $ret;
}
add_filter('the_posts','resort_posts');

Sie müssen herausfinden, wie dies mit Relevanssi funktioniert, ohne sich auch mit allen Abfragen auf der Site herumzuschlagen (was auch so gemacht wird, wie es geschrieben steht). Ich habe dieses Plugin noch nie benutzt, daher kann ich es nicht sagen.

2
s_ha_dum

Haben Sie die endlosen Weiten des Internets durchsucht?

Weil der erste Eintrag in der SERP ein Artikel in der relvanssi Knowledge Base ist, mit dem Titel " Beiträge nach Beitragstyp trennen ", hört sich für mich passend an. Unten ist der Code für den vorgeschlagenen Ansatz:

add_filter('relevanssi_hits_filter', 'separate_result_types');
function separate_result_types($hits) {
    $types = array();

    // Split the post types in array $types
    if (!empty($hits)) {
        foreach ($hits[0] as $hit) {
            if (!is_array($types[$hit->post_type])) $types[$hit->post_type] = array();                        
            array_Push($types[$hit->post_type], $hit);
        }
    }

    // Merge back to $hits in the desired order
    $hits[0] = array_merge(
        $types['mycustomtypethatgoesfirst'], 
        $types['thesecondmostimportanttype'], 
        $types['post'], $types['pages']
    );
    return $hits;
}


Anmerkungen:

  • Ich habe nichts anderes getan, als den Code zu kopieren.
  • Ich konnte die Suche nicht mit LMGTFY verknüpfen, anscheinend wird sie nicht als Nizza angesehen (zumindest nicht mehr). Ok, ich verstehe das irgendwie - vielleicht sogar komplett - aber im Ernst, recherchiere - bitte schön :)
1
Nicolai