我如何信任switch_to_blog()?


18

当我switch_to_blog()使用博客ID 打电话时,我不知道该博客是否确实存在。该函数始终返回TRUE

测试用例:

switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();

这将导致数据库错误显示给用户。我该如何预防?

现实世界中的用例

我是Multilingual Press的首席开发人员。用户翻译帖子时,会看到如下屏幕:

在此处输入图片说明

现在可能发生以下情况:

  1. 她成功保存了帖子,并继续翻译帖子。
  2. 另一个用户(网络管理员)在写作时会删除德语博客。
  3. 她再次点击保存并获得数据库错误。

我想避免这种情况。如何快速检查目标博客是否存在?我switch_to_blog()经常在多个不同的班级中打电话,因此必须快速。


怎么样 $wpdb->blogid;那钩又wp_insert_post_data呢?
JMau 2014年

@JMau get_post()只是阅读。在上一次保存和下一次编辑屏幕重新加载之间可能会有较长的暂停时间。
fuxia

5
对wp_blogs表中的blog_id的按请求缓存的SQL查询(已删除= 0)?
gmazzap

1
@GMSELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
凯撒

@toscho 大声思考 ...有wp_cache_switch_to_blog(),但仅对持久性缓存有帮助,而不对页面WP上的默认设置有用。无论如何,对我而言,并不确定在哪里检查博客的存在:当某人删除博客或某人试图撰写指向另一博客的翻译后的帖子时(用另一种语言提供相同的内容)?
凯撒

Answers:


10

@GM缓存支票的想法使我进入了以下帮助器功能。我将其放入全局命名空间中,以使其在任何地方都可用。

该功能不会说明博客状态,即使它存在且未标记为已删除。数据库查询速度非常快(0.0001秒),并且每个站点ID仅运行一个查询,无论调用该函数的频率如何。

if ( ! function_exists( 'blog_exists' ) ) {

    /**
     * Checks if a blog exists and is not marked as deleted.
     *
     * @link   http://wordpress.stackexchange.com/q/138300/73
     * @param  int $blog_id
     * @param  int $site_id
     * @return bool
     */
    function blog_exists( $blog_id, $site_id = 0 ) {

        global $wpdb;
        static $cache = array ();

        $site_id = (int) $site_id;

        if ( 0 === $site_id )
            $site_id = get_current_site()->id;

        if ( empty ( $cache ) or empty ( $cache[ $site_id ] ) ) {

            if ( wp_is_large_network() ) // we do not test large sites.
                return TRUE;

            $query = "SELECT `blog_id` FROM $wpdb->blogs
                    WHERE site_id = $site_id AND deleted = 0";

            $result = $wpdb->get_col( $query );

            // Make sure the array is always filled with something.
            if ( empty ( $result ) )
                $cache[ $site_id ] = array ( 'do not check again' );
            else
                $cache[ $site_id ] = $result;
        }

        return in_array( $blog_id, $cache[ $site_id ] );
    }
}

用法

if ( ! blog_exists( $blog_id ) )
    return new WP_Error( '410', "The blog with the id $blog_id has vanished." );

为什么$wpdb->get_results+ wp_list_pluck而不是仅+ (int) $wpdb->get_var?但是+1,我认为核心switch_to_blog中应该有类似的内容...
gmazzap

@GM get_var()仅返回一个结果。我已经使用过get_col(),并且确保不会再次获取空结果。
fuxia

啊,好吧。。。我现在最好阅读查询,您将获得特定站点ID的所有博客ID,首先阅读时,您一次只能获得一个博客ID(传递给函数的那个​​ID)...确定数组方式更好。抱歉,再次不能+1 :)
gmazzap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.