wordpress 多站点跨站点 query 获取 post

wordpress 多站点跨站点 query 获取 post

正在查看 5 个帖子:1-5 (共 5 个帖子)
  • 作者
    帖子
  • gnt-wordpress
    参与者
    • 文章数量: 49
    @gnt-wordpress
    楼主

    环境简述:

    创建了一个多站点环境,改环境中 站点 id:318 的站管理所有的文章,目前希望在其他站通过 elementor post 的 custom query 直接获取 318 站点中的文章,尝试使用了 switch_to_blog(318)   获取失败请问,请教,请教!!

    壳壳虫
    参与者
    • 文章数量: 328
    @kekechong

    要在 WordPress 多站点环境中跨站点获取文章,可以尝试以下步骤:

    1. 在需要获取文章的站点中,使用 switch_to_blog(318) 切换到 318 站点。
    2. 使用 WP_Queryget_posts 函数来获取 318 站点中的文章。
    3. 获取完文章后,使用 restore_current_blog() 恢复到原始站点。

    示例代码如下:

    // 切换到 318 站点
    switch_to_blog(318);
    
    // 查询文章
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => 10,
        // 其他查询参数
    );
    $query = new WP_Query($args);
    
    // 处理查询结果
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            // 输出文章内容或其他操作
        }
    }
    
    // 恢复到原始站点
    restore_current_blog();

    通过以上步骤,你应该能够在其他站点中成功获取 318 站点中的文章。如果仍然遇到问题,请检查站点权限、代码逻辑等方面是否有问题。


    以上由壳壳虫自动解答供参考,您可以继续跟帖或等待人工回复。

    诗语
    管理员
    • 文章数量: 5,908
    @feibisi

    用简码调用吧,单纯是这种用 elementor 的情况很难,需要用 API 来实现。

    我们官网首页调用的代码如下:

    
    function get_latest_posts_titles_from_subsite($atts) {
        // 解析短代码参数
        $atts = shortcode_atts(array(
            'subsite_id' => 1, // 默认子站点 ID
            'count' => 5, // 默认获取 5 个文章标题
            'post_type' => 'post', // 默认文章类型为 post
        ), $atts);
    
        // 获取短代码参数中的子站点 ID 和文章类型
        $subsite_id = intval($atts['subsite_id']);
        $post_type = $atts['post_type'];
    
        // 保存当前主站点 ID
        $current_blog_id = get_current_blog_id();
    
        // 使用 switch_to_blog 函数切换到特定子站点
        switch_to_blog($subsite_id);
    
        // 构建 WP_Query 查询
        $args = array(
            'posts_per_page' => intval($atts['count']), // 获取指定数量的文章标题
            'post_type'      => $post_type, // 设置文章类型
            'post_status'    => 'publish',
            'orderby'        => 'date',
            'order'          => 'DESC',
            'ignore_sticky_posts' => 1, // 排除置顶文章
        );
    
        $query = new WP_Query($args);
    
        // 检查是否有文章
        if ($query->have_posts()) {
            $titles_list = '<ul>';
    
            // 循环输出文章标题
            while ($query->have_posts()) {
                $query->the_post();
                $titles_list .= '<li><a href="' . get_permalink() . '" target="_blank">' . get_the_title() . '</a></li>';
            }
    
            $titles_list .= '</ul>';
    
            // 切换回之前的主站点
            switch_to_blog($current_blog_id);
    
            // 重置文章数据
            wp_reset_postdata();
    
            // 返回标题列表
            return $titles_list;
        } else {
            // 切换回之前的主站点
            switch_to_blog($current_blog_id);
    
            return ' 没有找到最新文章。';
        }
    }
    
    // 添加一个 shortcode 以便在文章或页面中调用该函数
    add_shortcode('latest_posts_titles', 'get_latest_posts_titles_from_subsite');
    

    使用方式就是加简码 [latest_posts_titles subsite_id="300" count="3"

    subsite_id 换成你们的 318 。

    gnt-wordpress
    参与者
    • 文章数量: 49
    @gnt-wordpress
    楼主

    感谢 @feibisi  经过寻找测试,最终实现的 custom query 如下

     

    add_action( ‘elementor/query/get_blog_post_xiangmu’, function( $query ) {
    // 切换到 318 站点
    switch_to_blog(318);
    $query->set( ‘post_type’, [ ‘post’ ] );
    $query->set( ‘category__in’, array( 12 ) );
    // 恢复到原始站点
    add_action(‘loop_end’, function() {
    restore_current_blog();
    });
    });

    add_action(‘loop_end’, function()  最后这个是必须的不然会导致死循环,造成站点 504 。

    测试在 elementor 组件中  post 可以用,但是 loop 的 post 模块无效!

    诗语
    管理员
    • 文章数量: 5,908
    @feibisi

    你需要完全实现自定义文章类型查询在后续的 WordPress 版本中这种方式容易导致网站负载增大,我上面给的方式可以测试下,完全从数据库里面直接读取,不分编辑器版本不容易出错,也没那么多额外查询

正在查看 5 个帖子:1-5 (共 5 个帖子)
  • 哎呀,回复话题必需登录。

话题信息