PHP
<?php
/*
Plugin Name: Search Reloaded
Version: 1.0
Plugin URI: http://www.semiologic.com/projects/search-reloaded/
Description: [url="http://www.semiologic.com/projects/search-reloaded/"]Doc/FAQ[/url] • [url="http://wordpress.org/tags/semiologic"]Support forum[/url] — Enhances WordPress' default search engine
Author: Denis de Bernardy
Author URI: http://www.semiologic.com
*/
/*
* config
**/
$sem_search_version = 1.0;
/*
* sem_search_init()
* -----------------------
* initializes the sem_search_init plugin
**/
function sem_search_init()
{
global $wpdb;
global $table_prefix;
global $sem_search_version;
global $user_ID;
global $user_level;
$wpdb->sem_nodes = $table_prefix."sem_nodes";
$wpdb->sem_links = $table_prefix."sem_links";
// Initialize
$cur_sem_search_version = get_option('sem_search_version');
get_currentuserinfo();
if ( !$user_ID || $user_level < 8 )
return;
if ( $_REQUEST['flush'] )
update_option( 'sem_search_version', 0 );
if ( !$cur_sem_search_version || $cur_sem_search_version < $sem_search_version )
{
switch ( $cur_sem_search_version )
{
case '':
case '0':
$wpdb->get_results("# sem_search_init
CREATE TABLE IF NOT EXISTS `$wpdb->sem_nodes` (
`node_id` int(10) unsigned NOT NULL default '0' ,
`node_name` tinytext NOT NULL ,
`node_content` text NOT NULL ,
PRIMARY KEY (`node_id`) ,
FULLTEXT KEY `node` (`node_name`,`node_content`)
) TYPE=MyISAM");
case '0.1':
case '0.2':
case '0.3':
case '0.4':
$wpdb->query( "DELETE FROM $wpdb->sem_nodes" );
update_option('sem_search_dyn_index_done', '');
default:
break;
}
update_option( 'sem_search_version', $sem_search_version );
}
} // end sem_search_init()
add_action('init', 'sem_search_init');
/*
* sem_search_dyn_index()
* ----------------------
**/
function sem_search_dyn_index()
{
global $wpdb;
global $user_ID;
global $user_level;
if ( get_settings('sem_search_dyn_index_done') ) return;
get_currentuserinfo();
if ( !$user_ID || $user_level < 8 )
return;
$posts = $wpdb->get_results("# sem_search_dyn_index
SELECT
posts.*
FROM
$wpdb->posts AS posts
LEFT JOIN
$wpdb->sem_nodes AS nodes
ON nodes.node_id = posts.ID
WHERE
nodes.node_id IS NULL
LIMIT 100
");
if ( $posts )
foreach ( $posts as $post )
sem_search_index( $post );
else
update_option('sem_search_dyn_index_done', true);
} // end sem_search_dyn_index()
add_action('shutdown', 'sem_search_dyn_index' );
/*
* sem_search_index()
* ------------------
* index a post
**/
function sem_search_index( $post )
{
global $wpdb;
global $user_ID;
global $user_level;
get_currentuserinfo();
if ( !$user_ID || $user_level < 8 )
return;
if ( !$post )
return;
$node_id = $post->ID;
# echo '
no worries: this is Denis doing tests. only admins can see this</p>';
$node_name = $post->post_title;
$node_name = apply_filters( 'the_title', $node_name );
$node_name = strip_tags( $node_name );
$node_name = trim( $node_name );
$node_name = mysql_real_escape_string( $node_name );
$node_content = $post->post_excerpt."\n\n".$post->post_content;
$node_content = apply_filters( 'the_content', $node_content );
$node_content = strip_tags( $node_content );
$node_content = trim( $node_content );
$node_content = mysql_real_escape_string( $node_content );
// echo Markdown($content);
$wpdb->query("# sem_search_index
REPLACE
INTO $wpdb->sem_nodes ( node_id, node_name, node_content )
VALUES ( $node_id, '$node_name', '$node_content' )
");
return $post;
} // end sem_search_index()
/*
* sem_search_reindex()
* ------------------
* indexes a post
**/
function sem_search_reindex( $ID )
{
global $wpdb;
if ( !$ID )
return;
$post = $wpdb->get_row("# sem_search_reindex
SELECT
*
FROM
$wpdb->posts
WHERE
ID = $ID
");
if ( $post )
sem_search_index( $post );
} // end sem_search_reindex()
add_filter('edit_post', 'sem_search_reindex');
add_filter('publish_post', 'sem_search_reindex');
add_filter('save_post', 'sem_search_reindex');
/*
* sem_search_bypass()
* ---------------------
* bypass the default search
**/
function sem_search_bypass( $where )
{
if ( !is_search() )
return $where;
return " AND 1 = 0 ";
} // sem_search_bypass()
add_filter('posts_where', 'sem_search_bypass');
/*
* sem_search_reloaded()
* --------------------
* enhances the default search
**/
function sem_search_reloaded( $posts )
{
if ( !is_search() )
return $posts;
global $s;
global $sem_s;
global $wp_query;
// Defaults
$sem_s = $s; // WordPress damages the query string
$paged = $wp_query->get('paged');
if (!$paged)
$paged = 1;
$posts_per_page = $wp_query->get('posts_per_page');
if ( !$posts_per_page )
$posts_per_page = get_settings('posts_per_page');
$offset = ( $paged - 1 ) * $posts_per_page;
return sem_search_posts($s, $posts_per_page, $offset, true);
} // sem_search_reloaded()
add_filter('the_posts', 'sem_search_reloaded');
#
# sem_search_posts()
# ------------------
# For use outside of the plugin, e.g. terms2posts
#
function sem_search_posts($s = "", $num_posts = 5, $offset = 0, $refresh_request = true, $exclude = '')
{
global $wpdb;
global $request;
// Initialize
$now = gmdate('Y-m-d H:i:59');
$sem_w = array(); // search words
$sem_r = array(); // search regexps
$all_small_words = true;
// Fetch the search words -- this is strictly additive at the moment...
preg_match_all( "/\b(\w+)\b|\"([^\"]+)\"/", stripslashes($s), $matches, PREG_SET_ORDER );
if ( !sizeof( $matches ) )
return array();
foreach( $matches as $match )
{
if ( $match[1] )
$sem_w[] = $match[1];
else
$sem_w[] = $match[2];
}
// Build the string filter
while ( list( $k, $w ) = each ( $sem_w ) )
{
$str_filter .= ( ( $str_filter != "" ) ? " " : "" ) . mysql_real_escape_string( $sem_w[$k] );
$all_small_words &= ( strlen( $sem_w[$k] ) <= 2 );
}
reset( $sem_w );
// Build search regexp
$sem_regexp_pb = "/(\\/|\\\|\*|\?|\+|\.|\^|\\$|\(|\)|\[|\]|\||\{|\})/";
$sem_regexp_fix = "\\\\$1";
while ( list( $k, $w ) = each( $sem_w ) )
{
$sem_r[$k] = $sem_w[$k];
$sem_r[$k] = preg_replace( $sem_regexp_pb, $sem_regexp_fix, $sem_r[$k] );
$sem_r[$k] = mysql_real_escape_string($sem_r[$k]);
$sem_r[$k] = preg_replace( "/\s+/", "[[:space:]]+", $sem_r[$k] );
$sem_r[$k] = "([[:<:]]|[[:space:]])".$sem_r[$k]."([[:>:]]|[[:space:]])";
}
reset( $sem_w );
/*
echo 'Search query: '.stripslashes(preg_replace("/\"/", """, $sem_s )).'
';
echo 'Search words:
';
while ( list( $k, $w ) = each( $sem_w ) )
echo $sem_w[$k].' - '.$sem_r[$k].'
';
reset( $sem_w );
*/
while ( list( $k, $w ) = each ( $sem_w ) )
{
$reg_all_in_name .= ( ( $reg_all_in_name != "" ) ? " AND " : " " ) . " sem_nodes.node_name REGEXP '".$sem_r[$k]."' ";
$reg_all_in_content .= ( ( $reg_all_in_content != "" ) ? " AND " : " " ) . " sem_nodes.node_content REGEXP '".$sem_r[$k]."' ";
if ( strlen( $sem_w[$k] ) > 2 || $all_small_words )
{
$reg_same_order .= "(". ( ( $reg_same_order != "" ) ? ".+" : "" ) . $sem_r[$k] . ")? ";
$reg_one_present .= ( ( $reg_one_present != "" ) ? "|" : "" ) . $sem_r[$k];
}
}
reset( $sem_w );
$reg_name_in_same_order = " sem_nodes.node_name REGEXP '$reg_same_order' ";
$reg_one_in_name = " sem_nodes.node_name REGEXP '$reg_one_present' ";
$reg_content_in_same_order = " sem_nodes.node_content REGEXP '$reg_same_order' ";
$reg_one_in_content = " sem_nodes.node_content REGEXP '$reg_one_present' ";
$seed_sql = "# sem_search_reloaded
SELECT
posts.*,
CASE
WHEN $reg_all_in_name
THEN 1
ELSE 0
END AS all_in_title,
CASE
WHEN $reg_name_in_same_order
THEN 1
ELSE 0
END AS title_in_same_order,
CASE
WHEN $reg_one_in_name
THEN 1
ELSE 0
END AS one_in_title,
CASE
WHEN $reg_all_in_content
THEN 1
ELSE 0
END AS all_in_content,
CASE
WHEN $reg_content_in_same_order
THEN 1
ELSE 0
END AS content_in_same_order,
CASE
WHEN $reg_one_in_content
THEN 1
ELSE 0
END AS one_in_content,
MATCH ( sem_nodes.node_name, sem_nodes.node_content )
AGAINST ( '$str_filter' ) AS mysql_score
FROM
$wpdb->posts AS posts
INNER JOIN
$wpdb->sem_nodes AS sem_nodes
ON sem_nodes.node_id = posts.ID
WHERE
( posts.post_status = 'static' OR posts.post_status = 'publish' )
AND posts.post_date <= '$now'
AND
(
$reg_one_in_name
OR $reg_one_in_content
)
" . ( $exclude ? "AND posts.ID NOT IN ( $exclude )" : "" ) . "
GROUP BY
posts.ID
ORDER BY
all_in_title DESC, title_in_same_order DESC, one_in_title DESC, all_in_content DESC, content_in_same_order DESC, one_in_content DESC, mysql_score DESC, posts.post_title ASC
" . ( ( $num_posts != -1 ) ? "LIMIT $offset, $num_posts" : "" );
/*
global $user_ID;
get_currentuserinfo();
if ( $user_ID )
$user = get_userdata( $user_ID );
if ( $user->user_level >= 8 )
echo "<pre style=\"font-size: 8pt;\">$seed_sql</pre>";
*/
// with smart cluster, we'll fetch the clustered result, which should be more relevant
// in the meanwhile, the sql seed will be good enough
$posts = $wpdb->get_results( $seed_sql );
// update the request, for use in posts_nav_link
if ( $refresh_request )
{
$request = "SELECT posts.* FROM $wpdb->posts AS posts INNER JOIN $wpdb->sem_nodes AS sem_nodes ON sem_nodes.node_id = posts.ID WHERE ( posts.post_status = 'static' OR posts.post_status = 'publish' ) AND posts.post_date <= '$now' AND ( $reg_one_in_name OR $reg_one_in_content ) GROUP BY posts.ID " . ( ( $num_posts != -1 ) ? "LIMIT $offset, $num_posts" : "" );
}
// update cache
if ( function_exists('update_post_cache') )
update_post_cache( $posts );
if ( function_exists('update_page_cache') )
update_page_cache( $posts );
return $posts;
} # end sem_search_posts
/*
* sem_search_results()
* --------------------
* Display the search results
**/
function sem_search_results()
{
global $wp_query;
global $sem_s;
$paged = $wp_query->get('paged');
if (!$paged)
$paged = 1;
$posts_per_page = $wp_query->get('posts_per_page');
if ( !$posts_per_page )
$posts_per_page = get_settings('posts_per_page');
$start = ( $paged + 1 ) * $posts_per_page - 1;
?>
<div class="header">
<h1>Search results for: <?php echo stripslashes(preg_replace("/\"/", """, $sem_s )); ?></h1>
<?php
if ( function_exists('sem_display_ad_space') )
sem_display_ad_space();
?>
</div>
<div class="body">
[list=1]">
<?php while (have_posts()) : the_post(); ?>
<li id="post-<?php the_ID(); ?>"><h2>[url="<?php the_permalink(); ?>"]<?php the_title(); ?>[/url]
<?php edit_post_link('Edit', '<span class="edit_link"> | ', '</span>'); ?></h2>
<?php the_excerpt(); ?>
<?php endwhile; ?>
[/list]
</div>
<?php
} // end sem_search_results()
?>
Alles anzeigen
Es ist das Plugin "Search Reloaded"
nun meine sache. er sortiert die beiträge chronologisch (glaub ich) vom ältesten bis zum neuchsten. ich häts allerdings gern umgekehrt, heißt vom neuchsten bis zum ältesten.
steht das da jetzt irgendwo in den kauderwelsch oder im restlichen teil :planlos
und was muss ich ändern
danke für eure hilfe :gott