Přidání custom posts do výsledků vyhledávání

Do functions.php přidáme

add_filter( 'pre_get_posts', 'tgm_cpt_search' );
/**
* This function modifies the main WordPress query to include an array of post types instead of the default 'post' post type.
*
* @param mixed $query The original query
* @return $query The amended query
*/
function tgm_cpt_search( $query ) {
if ( $query->is_search )
$query->set( 'post_type', array( 'post', 'movies', 'products', 'portfolio' ) );
return $query;
};

Multikriteriální filtrování (vyhledávání) příspěvků

Multiple Category Selection Widget
http://wordpress.org/…tion-widget/

This plugin gives you the ability to provide your users with a widget full of dropdowns based upon parent categories and their sub-categories. You can now set up an AJAX chained select box. For example, if you have multiple countries, and multiple states for each country, you can get a user to select a country. Upon selecting the country, the plugin looks for any states under that country, and then shows the dropdown box for the states under that country beneath the country dropdown.

Multiple subcategories spanning multiple parent categories (though multiple categories inside a single parent cannot be chosen) are chosen and intelligently filter your posts.

Please note that this plugin, while it is a widget, can be used on a sidebar you define anywhere within your theme that you like. Think of it as a 'block' area rather than a 'sidebar'.

Alternativy

WP Ultimate Search
https://wordpress.org/…screenshots/

Powerful AJAX-based search alternative which supports faceting queries by taxonomies, terms, location, and post metadata.

Query Multiple Taxonomies
http://wordpress.org/…-taxonomies/

Say you have two custom taxnomies defined: genre and artist.

Currently, you can do the following types of queries on your site:
?genre=jazz
?genre=jazz&cat=1

But you can't do this:
?genre=jazz&ar­tist=chet-baker

WordPress will just ignore one of the parameters. This plugin fixes that. It also comes with a drill-down navigation widget.

WP Custom Fields Search
http://wordpress.org/…elds-search/

This plugin allows multiple form inputs to be configured to search different aspects of a post including custom fields.
It is designed to filter posts in a more structured way than the default wordpress search. Specifically it allows multiple form inputs to be configured to search different aspects of a post, i.e. one term could search the post content, one the post title and one could search a custom field associated with the post.

The blog admin is able to build a customised search form. It allows you to search by the standard post information and by custom fields and to choose what HTML form elements should be presented for each search field.

Taxonomy Picker
http://wordpress.org/…nomy-picker/

Taxonomy Picker is a widget which you can include in your sidebar to help visitors build complex queries using categories and your custom taxonomies by chosing terms from drop down boxes. The widget also includes a text search making it easy to search for text only within certain categories or taxonomies.
Results will be displayed using your theme's standard search form so the results need no additonal styling.

Demo »

Úpravou kódu (bez pluginů)

Výběr (průnik) z více štítků současně, zaškrtáváním checkboxů v šabloně stránky s filtrem:

<?php if (empty($_POST)): ?>
        <form action="<?php echo bloginfo('url'); ?>/?page_id=xy" method="post" accept-charset="utf-8">
                <div>Filtrování příspěvků podle štítků</div>
                <p>
                <?php
                // list all tags with a checkbox next to them
                $tags = get_terms( 'post_tag' );
                $checkboxes = '';
                foreach($tags as $tag):
                        $checkboxes .='<input type="checkbox" name="tags[]" value="'.$tag -> slug.'" id="tag-'.$tag->term_id.'" /><label for="tag-'.$tag->term_id.'">'.$tag->name.'</label>';
                endforeach;
                print $checkboxes;
                ?>
                </p>
                <p><input type="submit" value="Filtruj"></p>
        </form>

<?php else:

        // If there's a tag search
        if (isset($_POST["tags"])){
                $tags_array = array();
                $tags_array = $_POST["tags"];

                foreach ($tags_array as $key => $value) {
                        //      tag1 AND tag2 is chosen, add a plus after the tags.
                        $string .= $value.'+';
                }
                // Remove the last + symbol in the string
                $tags = substr($string, 0, -1);
        }

        // build the url with the variables
        $url = home_url()."?tag=$tags";

        // redirect to output page
        wp_redirect($url); exit;
endif; ?>

Výběr (průnik) z více kategorií současně, zaškrtáváním checkboxů:

U kategorií je třeba ještě nejprve přidat do functions.php

// List categories with checkboxes
function get_categories_checkboxes( $selected_cats = null ) {
        $all_categories = get_categories();
        $o = '<ul style="margin-left:12px">';
        foreach($all_categories as $key => $cat) {
                if($cat->parent == "0") $o .= __show_category($cat, $selected_cats);
        }
        return $o.'</ul>';
}

function __show_category($cat_object, $selected_cats = null) {
        $checked = "";
        if(!is_null($selected_cats) && is_array($selected_cats)) {
                $checked = (in_array($cat_object->cat_ID, $selected_cats)) ? 'checked="checked"' : "";
        }
        $ou = '<li><label><input ' . $checked .' type="checkbox" name="cats[]" value="'. $cat_object->cat_ID .'" /> ' . $cat_object->cat_name . '</label>';
        $childs = get_categories('parent=' . $cat_object->cat_ID);
        foreach($childs as $key => $cat) {
                $ou .= '<ul style="margin-left:12px">' . __show_category($cat, $selected_cats) . '</ul>';
        }
        $ou .= '</li>';
        return $ou;
}

// get category slug form id
function get_cat_slug($cat_id) {
        $cat_id = (int) $cat_id;
        $category = &get_category($cat_id);
        return $category->slug;
}

a v šabloně stránky s filtrem pak

<?php if (empty($_POST)): ?>

        <form action="<?php echo bloginfo('url'); ?>/?page_id=xy" method="post" accept-charset="utf-8">
                <div>Filtrování příspěvků podle kategorií</div>
                <p>
                <?php

                // list all categories with a checkbox next to them
                echo get_categories_checkboxes();
                ?>
                </p>
                <p><input type="submit" value="Filtruj"></p>
        </form>

<?php else:

                //      If there's a category search
                if (isset($_POST["cats"])){
                        $cats_array = array();
                        $cats_array = $_POST["cats"];

                        foreach ($cats_array as $key => $value) {
                                // cat1 AND cat2 is chosen, add a plus after the cats.
                                $slug = get_cat_slug($value);
                                $string .= $slug.'+';
                        }
                        // Remove the last + symbol in the string
                        $cats = substr($string, 0, -1);
                                        }

                // build the url with the variables
                $url = home_url()."/rubriky/".$cats."/";

                // redirect to output page
                wp_redirect($url); exit;
endif; ?>

This shows 15 posts (total) from categories 3 and 11 and 9

<?php query_posts("showposts=15&offset=0&cat=3,11,9"); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>

List categories with checkboxes »

Filtering Wordpress categories using undocumented hook »

Rozšířené vyhledávání v rubrikách

WordPress sice v základním nastavení žádné rozšířené vyhledávání nemá, ale s pomocí několika chytrých funkcí můžeme tento nedostatek napravit. Zdrojový kód se bude skládat ze dvou částí – vyhledávacího formuláře a speciální šablony pro page, jež realizuje samotné vyhledávání.

Začneme tedy formulářem:

<form action='<?php bloginfo( 'url' ) ?>/hledej' method='post'> <input type='checkbox' name='povidky'>Po­vídky <input type='checkbox' name='fejetony'>Fe­jetony <input type='checkbox' name='drabble'>Drab­ble <input type='submit' value='Hledat'> </form>

Action odkazuje na url, kde bude umístěna vaše speciální vyhledávací stránka. Name u každého checkboxu je také názvem vyhledávané kategorie. Kód pro šablonu stránky vypadá takto:

<?php /*Template Name: Hledač*/ ?> <?php $cat = '';foreach($_POST as $key => $val){ if($val == 'on') $cat .= $key . ','; }$the_query = new WP_Query('cate­gory_name=' . $cat);while ( $the_query->have_posts() ) : $the_query->the_post(); echo '<li>'; the_title(); echo '</li>'; endwhile; ?>

Pokud uživatel zaškrtne políčka Povídky a Drabble, tak se uživatelovi ve výpisu zobrazí články z těchto dvou rubrik. Pokud byste chtěli spíše něco jako filtr, tedy že se zobrazí příspěvky, které jsou v rubrice Povídky a zároveň Drabble, bude třeba několik částí upravit. Už v samotném formuláři nemůžete uvádět názvy kategorií, ale jejich id. Změny na vyhledávací stránce vypadají takto:

 foreach($_POST as $key => $val){ if($val == 'on') $cat[] = $key; }$the_query = new WP_Query(array( 'category__and' => $cat)); 

Zvýraznění právě hledaných slov

Několik následujících řádků kódu obalí všechna právě vyhledávaná klíčová slova do značky STRONG (class search-keyword). Kód je možné vložit do function.php ve Vašem template. Nebo jej můžete vložit rovnou do search.php někde těsně za volání funkce get_header(). Předpokladem samozřejmě je, že využíváte standardních vyhledávacích funkcí WordPress.

function omSearchHeighlig­ht($text) { $keys = explode(" ", get_search_qu­ery()); $text = preg_replace('/('­.implode('|', $keys) .')/iu', '<strong class="search-keyword">\0</stron­g>', $text); return $text; }add_filter('the_ti­tle','omSearchHe­ighlight'); add_filter('the_con­tent','omSear­chHeighlight'); add_filter('the_ex­cerpt','omSear­chHeighlight');// nezapomeňte strong element nastylovat např. // strong.search-keyword {background: #f3ff0f!important; color:#000!im­portant;}

Výsledkem je malé, ale užitečné, vylepšení výsledků vyhledávání, které Vás navíc nestojí téměř žádnou námahu. Ještě malá poznámka na závěr: Kód nedbá na velikost písmen.

Prohledávání webu

Relevanssi
http://wordpress.org/…/relevanssi/
http://www.mikkosaari.fi/relevanssi/

Náhrada standardního vyhledávání.

Relevanssi replaces the basic WordPress search with a partial-match search that sorts the results based on relevance. It is a partial match search, so if user inputs several search terms, the search will find all documents that match even one term, ranking highest those documents that match all search terms.

Relevanssi does some fuzzy matching too, so if user searches for something that doesn't produce any results, Relevanssi will look for similar terms. Strict phrases using quotation marks (like "search phrase") are supported.

The matching is based on basic tf * idf weighing, with some extra features added like a boost for words that appear in titles.

Relevanssi can create custom search result snippets that show the part of the document where the search hit was made. Relevanssi can also highlight the query terms in the search results.

Relevanssi can keep a log of user queries and display both most popular queries and recent queries that got no hits.

Relevanssi supports the hidden input field cat to restrict searches to certain categories (or tags, since those are pretty much the same). Just add a hidden input field named cat in your search form and list the desired category or tag IDs in the value field - positive numbers include those categories and tags, negative numbers exclude them. You can also set the restriction from general plugin settings (and then override it in individual search forms with the special field).

In addition of post and page content (including tags and categories), Relevanssi can index comments and pingbacks. It can also expand shortcodes in post content before indexing, so that everything the user sees on the entry page will be included in the index.

Alternativy

Dave's WordPress Live Search
https://wordpress.org/…live-search/

Adds "live search" functionality to your WordPress site. Uses the built-in search and jQuery.

Better Search
https://wordpress.org/…tter-search/

Better Search replaces the default WordPress search with a better search that gives contextual results sorted by relevance.