在多站点中,我如何从一个站点获取帖子并在另一个站点显示它们的固定链接?

时间:2018-12-04 作者:cag8f

我有一个WordPress多站点,有一个主站点和四个子站点。在我的主站点上的PHP模板中,我想从其中一个子站点获取帖子,并将永久链接打印到页面上。这是如何做到的?

下面是我的代码——当执行此代码时,永久链接确实会打印到屏幕上,但它们不正确——帖子名称正确,但路径不正确。

$tp_blog_id = 4;
switch_to_blog( $tp_blog_id );
$posts = get_posts(
            array(
                \'post_type\' => \'property\',
                \'posts_per_page\' => 100,
                \'numberposts\' => -1
            )
);
restore_current_blog();
error_log(print_r($posts,true));
foreach ($posts as $post) {
    echo "The URL is: <br>";    
    echo get_blog_permalink( $tp_blog_id, $post->ID ) . "<br>";
}
这是一个screenshot 输出页面的。permalinks不正确——每一个都会导致404页。本例中打印的错误永久链接的形式如下

http://dev.thailandproperty-hh.com/pattaya/blog/property/1-bedroom-condo-central-pattaya-10/

实际上,permalinks是

http://dev.thailandproperty-hh.com/pattaya/property/1-bedroom-condo-central-pattaya-10/.

作为测试,我在错误日志中打印了$posts 大堆它确实包含所有所需的post对象。此外,数组中的每个post对象都有一个属性guid, 其值为正确的permalink(screenshot). 我想作为一种解决方法,我可以简单地将此属性回显到页面,而不是get_blog_permalink(). 但我想理解为什么后者没有返回预期的永久链接。

UPDATE

我使用以下代码注册我的CPT:

$slug = get_theme_mod( \'property_permalink\' );
$slug = ( empty( $slug ) ) ? \'property\' : $slug;
    $args = array(
        \'labels\'              => $labels,
        \'public\'              => true,
        \'publicly_queryable\'  => true,
        \'show_ui\'             => true,
        \'show_in_menu\'        => true,
        \'query_var\'           => true,
        \'rewrite\'             => array( \'slug\' => $slug ),
        \'capability_type\'     => \'post\',
        \'has_archive\'         => true,
        \'hierarchical\'        => false,
        \'menu_position\'       => null,
        \'supports\'            => $supports,
        \'taxonomies\'          => array( \'property_type\' )
    );

register_post_type( \'property\', $args );

1 个回复
SO网友:Krzysiek Dróżdż

让我们看看get_blog_permalink:

get_blog_permalink( $blog_id, $post_id ) {
    switch_to_blog( $blog_id );
    $link = get_permalink( $post_id );
    restore_current_blog();

    return $link;
}
正如你所见,没有魔法。。。但是有一些问题,因为switch_to_blog 效率不高。。。

这意味着如果你这样做会更好:

$tp_blog_id = 4;
switch_to_blog( $tp_blog_id );
$posts = get_posts(
            array(
                \'post_type\' => \'property\',
                \'posts_per_page\' => 100,
                \'numberposts\' => -1
            )
);

error_log( print_r($posts,true) );
foreach ( $posts as $post ) {
    echo "The URL is: <br>";    
    echo get_permalink( $post->ID ) . "<br>";
}
restore_current_blog();
如果永久链接仍然存在问题,那么您必须检查注册此CPT的方式(尤其是with_front 部分rewrite 参数输入register_post_type).

正如我所料,问题就在这一点上。注册CPT时,您使用:

\'rewrite\' => array( \'slug\' => $slug ),
如果你看看register_post_type docs, 然后您将看到此参数有多个字段:

  • slug => 字符串自定义permalink结构段塞。默认为$post\\U类型值。应该是可翻译的
  • with_front => bool应将permalink结构与前基座连接在一起。(例如:如果permalink结构是/blog/,那么链接将是:false->/news/,true->/blog/news/)。默认为truefeeds => bool应该为这种帖子类型构建一个feed permalink结构。默认值为has\\u archive value
  • pages => bool应为permalink结构提供分页。默认为trueep_mask => 从3.4开始,const为该post类型分配一个端点掩码。有关更多信息,请参阅重写API/add\\u Rewrite\\u endpoint,并制作端点的WordPress插件摘要。如果未指定,则它继承自permalink\\u epmask(如果设置了permalink\\u epmask),否则默认为EP\\u permalinkwith_front 默认值为true. 这意味着您的帖子类型被告知在其URL前面加上前置基。

    因此,如果front base设置为blog,那么该帖子类型的URL应该包含它-因此它是正确生成的。。。

    附:很难说为什么它会导致404个错误,以及这些链接是如何处理的,所以它在没有前置基座的情况下工作。但您的问题很明显-注册和处理该CPT有问题。

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?