同一服务器双WordPress(不同数据库)外部首页内容整合技术问询
嘿,我明白你现在的需求——在同一服务器上跑着两个用不同数据库的WordPress站点,想在一个外部首页里展示它们的最新文章和图片库,而且还没法用多站点、RSS或者WP JSON API,打算通过加载两个wp-load.php来实现。我来给你梳理下可行的方案和需要注意的坑:
解决方案:加载多个WP实例获取内容
直接连续加载两个wp-load.php会导致WordPress的全局变量(比如$wpdb、$wp_query、当前用户状态等)冲突,所以必须在加载每个站点的wp-load.php前后,保存和恢复全局环境,避免互相干扰。
步骤1:封装站点内容获取函数
每个站点的内容获取都要遵循「保存环境→加载WP→查询内容→恢复环境」的流程,这样两个站点的WP实例不会互相污染:
// 获取第一个站点的指定内容(示例:带video标签的3篇文章) function get_blog1_content() { // 保存当前全局状态,防止后续加载第二个站点时覆盖 global $wpdb, $wp_query, $post, $wp_version, $wp; $original_wpdb = $wpdb; $original_wp_query = $wp_query; $original_post = $post; $original_wp_version = $wp_version; $original_wp = $wp; // 加载第一个站点的wp-load.php(替换成你的实际路径) require_once("/home/user/public_html/domain/wp-load.php"); // 执行文章查询,注意替换废弃的参数 $args = array( 'tag' => 'video', 'posts_per_page' => 3, // 替代已废弃的showposts 'ignore_sticky_posts' => true // 替代已废弃的caller_get_posts ); $blog1_posts = new WP_Query($args); // 收集文章数据(先存起来,不要直接输出) $content = array(); if ($blog1_posts->have_posts()) { while ($blog1_posts->have_posts()) { $blog1_posts->the_post(); $content[] = array( 'title' => get_the_title(), 'permalink' => get_permalink(), 'thumbnail' => get_the_post_thumbnail_url(), 'excerpt' => get_the_excerpt() ); } } // 重置查询并恢复全局状态 wp_reset_postdata(); $wpdb = $original_wpdb; $wp_query = $original_wp_query; $post = $original_post; $wp_version = $original_wp_version; $wp = $original_wp; return $content; } // 获取第二个站点的内容(示例:最新文章+自定义图片库) function get_blog2_content() { global $wpdb, $wp_query, $post, $wp_version, $wp; $original_wpdb = $wpdb; $original_wp_query = $wp_query; $original_post = $post; $original_wp_version = $wp_version; $original_wp = $wp; // 加载第二个站点的wp-load.php(替换成你的实际路径) require_once("/home/user/public_html/another-domain/wp-load.php"); // 查询最新5篇文章 $args_posts = array( 'posts_per_page' => 5, 'post_type' => 'post' ); $blog2_posts = new WP_Query($args_posts); // 查询图片库(假设是自定义文章类型'gallery') $args_galleries = array( 'posts_per_page' => 4, 'post_type' => 'gallery' // 替换成你的图片库自定义文章类型 ); $blog2_galleries = new WP_Query($args_galleries); // 收集文章和图片库数据 $content = array( 'posts' => array(), 'galleries' => array() ); // 处理文章数据 if ($blog2_posts->have_posts()) { while ($blog2_posts->have_posts()) { $blog2_posts->the_post(); $content['posts'][] = array( 'title' => get_the_title(), 'permalink' => get_permalink(), 'thumbnail' => get_the_post_thumbnail_url() ); } } // 处理图片库数据(假设用自定义字段存储图片ID) if ($blog2_galleries->have_posts()) { while ($blog2_galleries->have_posts()) { $blog2_galleries->the_post(); $image_ids = get_post_meta(get_the_ID(), 'gallery_images', true); $images = array(); if ($image_ids) { foreach ($image_ids as $id) { $images[] = wp_get_attachment_image_url($id, 'medium'); } } $content['galleries'][] = array( 'title' => get_the_title(), 'permalink' => get_permalink(), 'images' => $images ); } } // 重置查询并恢复全局状态 wp_reset_postdata(); $wpdb = $original_wpdb; $wp_query = $original_wp_query; $post = $original_post; $wp_version = $original_wp_version; $wp = $original_wp; return $content; }
步骤2:在外部首页调用函数并渲染内容
拿到两个站点的内容后,就可以在外部首页里按需求渲染了:
// 获取两个站点的内容数据 $blog1_content = get_blog1_content(); $blog2_content = get_blog2_content(); // 渲染第一个站点的视频文章 echo '<h2>站点1的最新视频文章</h2>'; echo '<div class="blog1-posts">'; foreach ($blog1_content as $post) { echo '<div class="post-item">'; if ($post['thumbnail']) { echo '<img src="' . esc_url($post['thumbnail']) . '" alt="' . esc_attr($post['title']) . '">'; } echo '<h3><a href="' . esc_url($post['permalink']) . '">' . esc_html($post['title']) . '</a></h3>'; echo '<p>' . esc_html($post['excerpt']) . '</p>'; echo '</div>'; } echo '</div>'; // 渲染第二个站点的最新文章 echo '<h2>站点2的最新文章</h2>'; echo '<div class="blog2-posts">'; foreach ($blog2_content['posts'] as $post) { echo '<div class="post-item">'; if ($post['thumbnail']) { echo '<img src="' . esc_url($post['thumbnail']) . '" alt="' . esc_attr($post['title']) . '">'; } echo '<h3><a href="' . esc_url($post['permalink']) . '">' . esc_html($post['title']) . '</a></h3>'; echo '</div>'; } echo '</div>'; // 渲染第二个站点的图片库 echo '<h2>站点2的图片库</h2>'; echo '<div class="blog2-galleries">'; foreach ($blog2_content['galleries'] as $gallery) { echo '<div class="gallery-item">'; echo '<h3><a href="' . esc_url($gallery['permalink']) . '">' . esc_html($gallery['title']) . '</a></h3>'; echo '<div class="gallery-images">'; foreach ($gallery['images'] as $image) { echo '<img src="' . esc_url($image) . '" alt="' . esc_attr($gallery['title']) . '">'; } echo '</div>'; echo '</div>'; } echo '</div>';
关键注意事项
- 全局变量冲突:必须保存和恢复
$wpdb、$wp_query等核心全局变量,否则第二个站点的加载会覆盖第一个的环境,导致查询错误。 - 废弃参数替换:你示例里的
showposts和caller_get_posts已经被WordPress废弃,改用posts_per_page和ignore_sticky_posts保证兼容性。 - 安全处理:所有输出的内容都要用
esc_url()、esc_html()、esc_attr()做转义,防止XSS攻击。 - 性能优化:如果外部首页访问量高,建议给查询结果加缓存(比如用
wp_cache_set()和wp_cache_get()),避免每次请求都加载两次WP环境,影响访问速度。 - 路径正确性:确保
wp-load.php的绝对路径正确,建议用realpath()验证路径是否存在,避免加载失败。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

