我有一个网站,每天大约有24000个帖子和200个帖子,数据库很快就会变得庞大。因此,我计划将旧帖子转移到自定义表中,以减少数据库负载。没有必要在网站上显示这些帖子。我会为搜索引擎保留它,并避免sql_calc_found_rows
问题。以下是我创建的三个表:
wp_posts -> wp_custom_posts
wp_postmeta -> wp_custom_postmeta
wp_term_relationships -> wp_custom_term_relationships
我已经使用phpMyAdmin手动将旧帖子转移到这些表中,并使用一个函数使WordPress使用我的自定义帖子表,而不是
wp_posts
如果其中不存在帖子:
function custom_prefix_change($sql) {
global $wpdb,$wp;
$prefix = $wpdb->prefix;
if(is_single()){
//check if the post exists in the genuine posts table
$results = $wpdb->get_results($sql,"ARRAY_A");
if($results[0][\'ID\']){
//if exists then return
return $sql;
}else{
//else change the query
$sql = str_replace("$wpdb->posts","{$wpdb->prefix}custom_posts",$sql);
}
}
//echo $sql;
return $sql;
}
add_action(\'posts_request\',"custom_prefix_change");
然而,在本例中,我的旧帖子显示没有元数据和分类法值。如何对meta和relationships表执行相同的操作?有什么建议吗?
SO网友:Bainternet
一个简单但并不完美的解决方案可以完成大部分工作,就是覆盖如下表名:
function custom_prefix_change($sql) {
global $wpdb,$wp;
$prefix = $wpdb->prefix;
if(is_single()){
//check if the post exists in the genuine posts table
$results = $wpdb->get_results($sql,"ARRAY_A");
if($results[0][\'ID\']){
//if exists then return
return $sql;
}else{
//else change the query
$sql = str_replace("$wpdb->posts","{$wpdb->prefix}custom_posts",$sql);
$wpdb->term_relationships = $wpdb->prefix . \'custom_term_relationships\';
$wpdb->postmeta = $wpdb->prefix . \'custom_postmeta\';
}
}
return $sql;
}
现在,要获得完整的解决方案,您需要替换
terms_clauses
过滤器挂钩
get_terms
并使用
get_post_metadata
对于
get_post_meta
.