web-dev-qa-db-fra.com

Séparer les résultats de recherche par type de message

Question originale: Séparation Résultats de recherche de publication personnalisée

J'ai essayé d'implémenter ce code sur mon site web, mais cela me pose problème. Ce que j'ai changé, c'est que j'ai ajouté un autre commutateur pour le type de troisième message, comme suit:

<?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; ?>       

Ce code se traduit par:

Résultats de la recherche de leçons

Leçon 1 Leçon 4 Leçon 3

Résultats du blog

Sous test

Résultats de la recherche de partenaires

Quatrième partenaire

Résultats du blog

Projet Open Container de Lorem ipsum Wave 2.0 Web et Tech Cloud

Comme vous pouvez le constater, la section des résultats du blog est doublée. Des suggestions sur ce que pourrait être le problème?

Plugins de recherche installés: Relevanssi

NOTE:sans Relevanssi (mais avec le plugin Search Everything), il le montre correctement, mais le plugin Search Everything ne permet pas la recherche de plusieurs termes, ce qui est indispensable dans mon cas.

Dernière version de Wordpress.

Merci d'avance.

1
semibur

Voici une idée, triez votre boucle avant son exécution. Votre problème actuel est juste ceci. Vous verrez que le type de tri ( si je ne me trompe pas - et si je pense que votre commande n'est pas alphabétique selon le type de message ) n'est pas possible en mode natif, nous avons donc besoin d'une solution de contournement ( même si vous avez juste besoin de types de publications triés par ordre alphabétique, la fonctionnalité native ne possède toujours pas les fonctionnalités appropriées ). C'est ici que usort() entre, nous pouvons trier le type de message post dans l'ordre de votre choix. Cela sera fait à l'intérieur du filtre the_posts

Je peux vous montrer les deux exemples. NOTE: L'échantillon de code nécessite au moins PHP 5.4+, ce qui devrait être votre version minimale maintenant. Toutes les versions antérieures à 5.4 sont EOL, elles ne sont pas prises en charge et constituent donc un risque énorme pour la sécurité si vous utilisez toujours ces versions.

TRIER PAR CUSTOM POST TYPE D'ORDRE

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 );

TRIER PAR POST TYPE ORDRE ALPHABETIQUE

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 );

Vos articles doivent maintenant être triés par type d'article sur votre page de recherche, c'est-à-dire si vous n'utilisez pas une requête personnalisée à la place de votre requête principale. En ce qui concerne votre code ci-dessus, conservez-le tel quel, il n'est pas nécessaire de le modifier.

5
Pieter Goosen

Vous obtenez les résultats de votre publication dans l'ordre indiqué par le plug-in Relevanssi. C'est-à-dire que vous obtenez les résultats dans l'ordre le plus approprié selon la logique du plugin (je ne sais pas ce que c'est exactement), ce qui est le but du plugin.

De manière générale, commander par type de courrier n'est pas si difficile:

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);

Cependant, je m'attendrais à ce que casser le "pertinent" commander le plugin fournit. En fait, quoi que vous fassiez est susceptible de briser le calcul de la "pertinence" dans une certaine mesure. Quelque chose comme ce qui suit devrait être le meilleur que vous puissiez faire:

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

Vous aurez besoin de comprendre comment faire fonctionner cela avec Relevanssi sans également jouer avec toutes les requêtes sur le site (ce qui sera fait comme il est écrit). Je n'ai jamais utilisé ce plugin, donc je ne peux pas le dire (au fait, les questions spécifiques au plugin sont également hors sujet)

2
s_ha_dum

Avez-vous recherché les étendues infinies d’Internet ?

Parce que la première entrée sur le SERP est un article de la base de connaissances relvanssi, avec le titre " Séparer les messages par type de message ", me convient. Vous trouverez ci-dessous le code de l'approche proposée:

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


Notes:

  • Je n'ai rien fait d'autre que copier le code.
  • Je ne pouvais pas lier la recherche à LMGTFY, apparemment ce n’est pas considéré comme étant Nice (du moins au moins). Ok, j'ai un peu - peut-être même complètement - eu cela, mais sérieusement, faites vos recherches - jolie s'il vous plait :)
1
Nicolai