当查询POST_TYPE时,Switch_to_Blog()不起作用,为什么?

时间:2018-01-06 作者:Pradeep Sapkota

我有以下代码

<?php

$sites = get_sites();
foreach ( $sites as $site ) {
    switch_to_blog( $site->blog_id );
    echo bloginfo(\'name\');              
    $args = array(
         \'public\'   => true,
         \'_builtin\' => false
    );
    $post_types = get_post_types( $args, \'\', \'and\');
    foreach($post_types as $post_type){
    ?>
<div class="col-lg-3 col-md-4 col-sm-6">
<div class="card card-default text-center wow slideInUp" data-wow-duration="2s" >
<h4 class="card-text"><?php echo $post_type->label; ?></h4>
<p class="card-text"><i class="fa fa-5x fa-<?php echo $post_type->menu_icon; ?>"></i></p>
<p class="card-text">
  <a href="" class="btn btn-success btn-small" href="#">Read more<i class="fa fa-arrow-circle-o-right"></i></a>
</p>
</div>
</div>

<?php 
    }
    restore_current_blog();
}    
?>
我想获取在网络中的站点上创建的所有自定义帖子。当我检查blog\\u id时,它会随着新blog而改变。当我回显bloginfo(“name”)时,它还会打印不同站点的名称,但当我查询自定义帖子时,它只显示来自当前站点的自定义帖子。

1 个回复
SO网友:Pat J

这里似乎有两件事在起作用:

switch_to_blog() 调用不切换插件(see ticket #14941), 因此,如果您的自定义帖子类型是在插件中定义的(它们很可能是,也应该是),那么它们将不会加载到switch_to_blog() 脚本(从门票上的评论来看,这很可能不会改变。)

此外get_post_types() 使用全局变量;它不会获取在您切换到的站点中注册的CPT,而是从您开始的站点中获取列表。全局变量似乎没有更新switch_to_blog(), 大概是因为与插件未卸载/加载的原因类似的原因switch_to_blog().

恐怕我不知道有没有一种简单的方法来做你想做的事。

可能的解决方法

register_post_type() 激发操作-registered_post_type—当它结束的时候。您应该能够使用它在给定网站上构建自定义帖子类型的列表。

类似这样的代码(非常简单,未经测试的代码):

<?php

add_action( \'registered_post_type\', \'wpse_290292_post_types\', 10, 2 );
function wpse_290292_post_types( $post_type_name, $post_type_object ) {
    $post_types = get_option( \'my_prefix_post_types\', array() );
    if ( 
        ! isset( $post_types[ $post_type_name ] ) 
        || $post_type_object !== $post_types[ $post_type_name ] 
    ) {
        // Adds the $post_type_object to the array if it\'s a) not already there or b) changed since it was added.
        $post_types[ $post_type_name ] = $post_type_object;
        update_option( \'my_prefix_post_types\', $post_types );
    }
}
?>
这将向*_options 桌子您可能需要添加一些检查,以防止添加_builtin 岗位类型等。

一旦将其设置为一个支持网络的插件,您应该能够使用my_prefix_post_types 选项(可以根据需要随意重命名)。

结束

相关推荐

WordPress MultiSite Theme

我有多个网站。(3个网站)所以我想在其中一个网站上应用不同的主题。但当我激活主题时。所有站点都受到影响。这就是多站点的工作方式吗??有人能澄清一下多站点可以做什么吗?安装多站点(子目录)修改了wp配置。php和。htaccessdefine( \'WP_ALLOW_MULTISITE\', true ); define(\'MULTISITE\', true); define(\'SUBDOMAIN_INSTALL\', false); define(\'DOMAIN_CURREN