WP_Error 工具缺点工具和非常很类似,也有一个缺点代码和缺点信息,比如上面的缺点,返回 WP_Error 工具的缺点代码便是 empty_content,缺点信息是:内容,标题和择要为空。
WordPress 还供应了 is_wp_error 函数,用于判断接管到数据是不是 WP_Error 工具,这样我们在写代码的时候,就须要自己判断返回值是不是 WP_Error 工具,然后进行额外处理,举个例子,WPJAM Basic 的快速复制扩展功能的代码:
function wpjam_duplicate_post($post_id){// 获取旧文章信息,并插入新文章$post_arr= get_post($post_id, ARRAY_A);$new_post_id= wp_inssert_post($post_arr, $wp_error=true);if(is_wp_error($new_post_id)){// 如果失落败,返回缺点return $new_post_id;}// 获取旧文章的分类信息,并将同样的分类信息设置到新的文章中foreach(get_object_taxonomies($post_arr['post_type']) as $taxonomy){$terms= wp_get_object_terms($post_id, $taxonomy, ['fields' => 'ids']);$result= wp_set_object_terms($new_post_id, $terms, $taxonomy);if(is_wp_error($result)){// 如果失落败,返回缺点return $result;}}// 如果还有其他操作$result= other_post_function($new_post_id, $args);if(is_wp_error($result)){// 如果失落败,返回缺点return $result;}return $new_post_id;// 末了才返回答制成功的文章 ID}
上面的代码我为了方便演示,做了一些简化,留下大致的骨架,可以看出快速复制文章有三个过程,注释里面已经写的非常清楚,下面大略说一下
获取旧文章信息,并插入新文章,如果 WP_Error 工具,则直接返回。获取旧文章的分类信息,并将同样的分类信息设置到新的文章中,同样碰到 WP_Error 工具,则直接返回末了假设还有其他操作,同样也要处理缺点。
这样的代码给人觉得便是满屏的缺点处理,非常难熬痛苦。
利用 Try / Catch 非常处理机制有没有办法优化我们的代码呢?可以把 WP_Error 工具转换成 PHP 非常继续类的工具,然后利用当代 PHP 的 Try / Catch 非常处理机制来优化。
首先创建用于处理 WP_Error 工具的非常处理类:
class WPJAM_Exception extends Exception{private $wp_error= null;public function __construct($message, $code=0, Throwable $previous=null){if(is_wp_error($message)){$this->wp_error= $message;$message= $this->wp_error->get_error_message();$code= $this->wp_error->get_error_code();}else{$this->wp_error= new WP_Error($code, $message);}parent::__construct($message, 0, $previous);}public function get_wp_error(){return $this->wp_error;}}
创建一个高阶函数 wpjam_try,自动将 WP_Error 工具转换成非常:
function wpjam_try($callback, ...$args){try{$result= call_user_func_array($callback, $args);if(is_wp_error($result)){throw new WPJAM_Exception($result);}return $result;}catch(Exception $e){throw $e;}}
末了我们就可以利用 wpjam_try 对上面复制文章这段代码进行改造了
function wpjam_duplicate_post($post_id){try{// 获取旧文章信息,并插入新文章$post_arr= get_post($post_id, ARRAY_A);$new_post_id= wpjam_try('wp_inssert_post', $post_arr, $wp_error=true);// 获取旧文章的分类信息,并将同样的分类信息设置到新的文章中foreach(get_object_taxonomies($post_arr['post_type']) as $taxonomy){$terms= wp_get_object_terms($post_id, $taxonomy, ['fields' => 'ids']);$result= wpjam_try('wp_set_object_terms', $new_post_id, $terms, $taxonomy);}// 如果还有其他操作$result= wpjam_try('other_post_function', $new_post_id, $args);return $new_post_id;// 末了才返回答制成功的文章 ID}catch(WPJAM_Exception $e){if($exception){throw $e;}else{return $e->get_wp_error();}}}
改造的过程分成三步:
把会返回 WP_Error 工具的函数,通过 wpjam_try 调用。去掉所有 is_wp_error 的判断,由于 wpjam_try 会抛出非常。将所有代码放到 try/catch 的构造中,末了只须要捕捉非常,再将非常转换成 WP_Error 工具即可。这样就可以在 WordPress 写代码的时候,避免满屏幕的缺点处理,末了返回还是 WP_Error 工具,担保了对原来逻辑的兼容。