it-swarm.com.de

Suchfilter ausgelöst und nach benutzerdefiniertem Beitragstyp sortiert

Ich benutze ein Plugin ( Relevanssi ) und eine benutzerdefinierte Funktion, um die Suchergebnisse nach benutzerdefinierten Beitragstypen zu sortieren (siehe unten). Das funktioniert super .

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((array)$types['cats'], (array)$types['dogs'], (array)$types['horses']);
   return $hits;

}

Das Problem tritt auf, wenn ich Suchergebnisse nach Typ anzeigen möchte. Wenn ich mich zum Beispiel auf der Seite "Haustiere suchen" (bei der es sich um eine Seitenvorlage handelt, search-pets.php) befinde, möchte ich nur Suchergebnisse für die oben genannten CPTs anzeigen. Wenn ich mich auf der Seite "Blog" (Standard-WP Posts) befinde, möchte ich nur Blog-Posts anzeigen. Wenn ich mich auf einer nicht benutzerdefinierten CPT-Seite befinde, werden Seitenergebnisse angezeigt. Ich dachte, dass durch Hinzufügen einer if/else-Anweisung (siehe unten) das funktionieren würde.

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

    // If post type = dogs, cats, horses
    if (in_array( get_post_type(), array('dogs','cats','horses'))){
    // Merge back to $hits in the desired order
    $hits[0] = array_merge((array)$types['dogs'], (array)$types['cats'], (array)$types['horses']);
   // return $hits;

    } else {

     // If post type = posts, page
    if (in_array( get_post_type(), array('post','page'))){
    // Merge back to $hits in the desired order
    $hits[0] = array_merge((array)$types['post'], (array)$types['page']);
    //return $hits;

    }}
    return $hits;
}

Es scheint jedoch nur die besten Filterergebnisse zu liefern. Irgendeine Idee, wo ich falsch liege oder ob meine Logik überhaupt funktioniert? Sehr viel ein PHP noob. Vielen Dank!

Ramsey

1
RodeoRamsey

Dies scheint keine WordPress-Post-Schleife zu sein, daher müssen Sie die Post-ID oder das Post-Objekt an get_post_type übergeben. Ich weiß nicht viel über Relevansi, aber in Ihrem obigen Code sieht es so aus, als ob $hit dieses Objekt sein könnte.

Ich glaube jedoch nicht, dass Sie das wollen. Vielleicht lese ich Sie falsch, aber es hört sich so an, als wollten Sie "wenn auf einer Kategoriearchivseite" und nicht "wenn dieser Beitrag ein". In diesem Fall benötigen Sie folgende Funktion: - die "Bedingten Tags" .

Also das...

// If post type = dogs, cats, horses
if (in_array( get_post_type(), array('dogs','cats','horses'))){
  // ...
}

Wird ( using is_post_type_archive ) ...

// If post type = dogs, cats, horses
if (is_post_type_archive('dogs')
    || is_post_type_archive('cats')
    || is_post_type_archive('horses')
){
   // ...
}
0
s_ha_dum