文档章节

WordPress插件开发: 文章同步到OSC博客插件(OscPress) (五)

FalconChen
 FalconChen
发布于 2016/07/14 02:50
字数 1482
阅读 48
收藏 0
点赞 0
评论 0
本文通过 OscPress 同步至oschina,最新版本请查看原文:
https://www.cellmean.com/?p=1012

我们再增加一些可以自定义的设置项目,如为同步到osc的博客的文章 增加前置,后置内容,自定义动弹模板,修正一些同步到osc的图片排版问题等。

向 admin_init() 追回以下内容

add_settings_field('appid', '应用ID', array($this,'input_text'), 'oscpress', 'oscpress_settings',array(
    "field" =>"appid", "label"=>"应用ID","placeholder"=>"请输入应用ID"
));
add_settings_field('appsecret', '应用私钥', array($this,'input_text'), 'oscpress', 'oscpress_settings',array(
    "field" =>"appsecret", "label"=>"应用私钥","placeholder"=>"请输入应用私钥"
));

// 增加其他设置项
// 为同步到osc的博客的文章 增加前置,后置内容
$depcription = "%%post_link%%: 文章短链接;<br/> %%title%%: 文章标题;<br/>%%home_url%%:站点地址;<br>%%site_name%%:站点名称<br/>%%post_thumb%%: 缩略图url";
add_settings_field('prefix_content', '同步到osc的文章前置内容', array($this,'textarea'), 'oscpress', 'oscpress_settings',array(
    "field" =>"prefix_content", "label"=>"同步到osc的文章前置内容",
    "description" => $depcription
));

add_settings_field('postfix_content', '同步到osc的文章后置内容', array($this,'textarea'), 'oscpress', 'oscpress_settings',array(
    "field" =>"postfix_content", "label"=>"同步到osc的文章后置内容",
    "description" => $depcription
));

// 动弹模板
add_settings_field('tweet_template', '发送到osc的动弹模板', array($this,'textarea'), 'oscpress', 'oscpress_settings',array(
    "field" =>"tweet_template", "label"=>"发送到osc的动弹模板",
    "description" => $depcription
));

// div包裹显示链接图片,防止同步到osc上的排版问题
add_settings_field('display_link_image_in_div', 'div包裹显示链接图片', array($this,'checkbox'),'oscpress','oscpress_settings',array(
    "field" =>"display_link_image_in_div", "label"=>"div包裹显示链接图片",
    "description" => '修正同步到osc上的图片排版问题'
));

增加一个助手方法,用texarea显示选项:

public function textarea($arr) {
    $settings = (array) get_option( 'oscpress_settings' );
    $field = $arr['field'];
    $value = esc_textarea( $settings[$field] );

    echo "<label class=\"oscpress_settings\" for=\"{$arr['field']}\"><textarea type='text' id='{$arr['field']}' name='oscpress_settings[$field]' rows=\"5\" cols=\"50\"/>{$value}</textarea><br><em>{$arr['description']}</em></label>";

}

再增加一个助手方法,用checkbox显示选项

public function checkbox($arr) {

    $settings = $this->_get_oscpress_settings();
    $field = $arr['field'];
    $value = intval( $settings[$field] );
    $if_checked = $value ? 'checked' :"";
    echo "<label class=\"oscpress_settings\" for=\"{$arr['field']}\"><input $if_checked type='checkbox' id='{$arr['field']}' name='oscpress_settings[$field]' value='1'}\"  /><em>{$arr['description']}</em></label>";
}

加入一个获取文章特色图片url的方法,即%%post_thumb%% 变量对应的变量, 如果文章没有设置特色图片,则使用当前用户的头像替代:

protected function _get_thumb_url( $post_id = null ) {

    $post = get_post($post_id);
    $thumb = "http://static.oschina.net/uploads/user/286/572975_100.jpg";
    $thumbnail_id = get_post_thumbnail_id($post->ID);
    if($thumbnail_id){
        $thumb = wp_get_attachment_image_src($thumbnail_id, 'thumbnail');
        $thumb = $thumb[0];

    }else{
        //使用授权用户头像

        $response = $this->_get_openapi_user();
        if(!is_wp_error($response)) {
            $info_obj = json_decode($response['body']);
            $thumb = $info_obj->avatar;
        }
    }

    return $thumb;
}

增加一个默认设置文件,这样当用户激活插件后,上面的几项内容不会是空的。在插件目录下新建一个文件settings.php.写入以下内容

<?php
return
array(
    'appid'=>"",
    'appsecret'=>"",
    'prefix_content' =>'<blockquote>
<table>
<tr><td><img align="left" src="%%post_thumb%%"></td>
<td>本文通过<a href="https://www.cellmean.com/oscpress/">OscPress</a>
同步至oschina,最新版本请查看原文:<a href="%%post_link%%">%%post_link%%</a>
</td>
</table>
</blockquote>',
    'postfix_content'=>'<br>
<p style="text-align:right">
<em>感谢阅读本文,欢迎访问<a href="%%post_link%%"> %%site_name%% </a>获取更多内容或 <a href="%%post_link%%"> 查看原文</a>
</em>
</p>',
    'tweet_template'=>'我写了一篇日志《%%post_title%%》, 传送门:%%post_link%%。  via #OscPress# 同步',
    'display_link_image_in_div'=>1,

);

保存后,在OscPress.php下再增加一个方法。初次激活插件加载默认配置.

protected function _get_oscpress_settings(){

    $settings = get_option( 'oscpress_settings' );
    if(empty($settings)) {
        $settings = include 'settings.php';
        return $settings;
    }else{
        return $settings;
    }

}

统一使用新的获取设置配置的方式,把其他用到

$settings = get_option( 'oscpress_settings' );

的地方都改成

$settings = $this->_get_oscpress_settings();

完成后刷新设置页面。

再修改一些样式,设置页前端的效果就做好了。

QQ20160714-0@2x
QQ20160714-1@2x

 

接下来我们在publish_post方法下进行逻辑处理:

// 发布文章时同步到osc
public function publish_post($ID,$post) {


    if( isset($_POST['oscpress_syn_enable']) && $_POST['oscpress_syn_enable'] == 0){
        return ; // 不同步到osc博客
    }
    $settings = $this->_get_oscpress_settings();
    $post_link = apply_filters('oscpress_sync_link',wp_get_shortlink($ID),$ID); // 发布到osc动弹的文章链接
    $home_url = home_url('/');

    $site_name = get_bloginfo('name');
    $post_thumb = $this->_get_thumb_url();
    $post_arr = array();
    $tags = "";
    $post_arr['title'] = $post->post_title;

    $prefix_content = str_replace(
        array('%%post_title%%','%%post_link%%','%%home_url%%','%%site_name%%','%%post_thumb%%'),
        array($post_arr['title'],$post_link,$home_url,$site_name,$post_thumb),
        $settings['prefix_content']
    );
    $postfix_content = str_replace(
        array('%%post_title%%','%%post_link%%','%%home_url%%','%%site_name%%','%%post_thumb%%'),
        array($post_arr['title'],$post_link,$home_url,$site_name,$post_thumb),
        $settings['postfix_content']
    );
    /*
     *如图: <a href="https://www.cellmean.com/wp-content/uploads/2016/07/屏幕截图-2016-07-08-22.00.19-1.png"><img alt="屏幕截图 2016-07-08 22.00.19" height="239" src="http://static.oschina.net/uploads/img/201607/12155338_Krda.png" width="300" /></a>
     * 将此类图片作为block元素显示
     */

    //$post_content = preg_replace("#<a href=#")
    if($settings['display_link_image_in_div']){
        $post_content = preg_replace('#(<a[^<>]*><img[^<>]*></a>)#iUs', "<div>$0</div>",$post->post_content);
    }else{
        $post_content = $post->post_content;
    }
    $post_arr['content'] = $prefix_content . $post_content . $postfix_content;

    $post_arr['abstracts'] = get_the_excerpt($ID);
    $tags_arr = wp_get_post_tags($ID);
    if(!empty($tags_arr)){
        foreach($tags_arr as $tag) {
            $tags .= $tag->name .',';
        }
        $tags = rtrim($tags,',');
    }
    $post_arr['tags'] = $tags;
    $post_arr = array_merge($post_arr,$_POST['oscpress_syn']);
    unset($post_arr['tweet_enable']);
    $response = $this->_blog_pub($post_arr);
    $oscpress_syn = $_POST['oscpress_syn'];
    $oscpress_syn['error_msg'] = "ok";
    $oscpress_syn['timestamp'] = current_time('timestamp');

    if(!is_wp_error($response) ){

        if( $_POST['oscpress_syn']['tweet_enable']) {

            // $tweet_template = "我发布了一篇文章:<<%%post_title%%>>,传送门:%%post_link%%, 自豪地使用 #OscPress# 同步 ";
            $tweet_template = $settings['tweet_template'];
            $tweet_content = str_replace(
                array('%%post_title%%','%%post_link%%','%%home_url%%','%%site_name%%','%%post_thumb%%'),
                array($post_arr['title'],$post_link,$home_url,$site_name,$post_thumb),
                $tweet_template
            );
            $response2  = $this->_send_tweet($tweet_content);
        }


    }else{

        $oscpress_syn['error_msg'] = $response->get_error_code();
    }

    update_post_meta($ID,'_oscpress_syn',$oscpress_syn);
}

 

前置,后置内容很容易明白,就是放到osc博文前面或者后面的内容,效果可以看 我的osc博客

QQ20160714-2@2x
QQ20160714-3@2x

“div包裹显示链接图片”的原因是在wordpress自带的编辑器里(TinyMCE) 插入图片后的html一般是这样的:

<a href=”https://www.cellmean.com/wp-content/uploads/2016/07/屏幕截图-2016-07-08-11.55.58.png”><img class=”alignnone size-medium wp-image-875″ src=”https://www.cellmean.com/wp-content/uploads/2016/07/屏幕截图-2016-07-08-11.55.58-300×54.png” alt=”屏幕截图 2016-07-08 11.55.58″ width=”300″ height=”54″ /></a>

在Wordpress的一般主题都会用block元素单独一行显示这类图片,比如我的博客,而在osc是inline元素显示的,会造成排版的冲突。类似这样。

33474397-F1AE-4C52-ACBE-4152AD97C5A0

而替换后(使用正则表达式),会以一个<div>标签包裹住这些内容:

<div><a href=”https://www.cellmean.com/wp-content/uploads/2016/07/屏幕截图 -2016-07-08-11.55.58.png”><img class=”alignnone size-medium wp-image-875″ src=”https://www.cellmean.com/wp-content/uploads/2016/07/屏幕截图 -2016-07-08-11.55.58-300×54.png” alt=”屏幕截图 2016-07-08 11.55.58″ width=”300″ height=”54″ /></a></div>

如果测试同步到oschina你的排版没有问题,请不要勾选。

好了,今天把插件提交到Wordpress官方去。


感谢阅读本文,欢迎访问 微言 获取更多内容或 查看原文

© 著作权归作者所有

共有 人打赏支持
FalconChen
粉丝 57
博文 45
码字总数 24806
作品 0
深圳
高级程序员
WordPress插件开发: 文章同步到OSC博客插件(OscPress) (一)

个人感觉osc的博客不是很好用,主要是编辑器不是很符合我的习惯,允许上传图片图片太小,而且不少人有自己的博客,只是想给osc上做个文章的备份。 于是我决定写一个插件,实现以下功能:先在...

FalconChen
2016/07/11
74
0
WordPress插件开发: 文章同步到OSC博客插件(OscPress) (四)

今天测试OscPress时发现了一些问题,aceess token失效了,token的授权没有到失效时间,可能是osc那边重置了。从文档知道用失效的token请求api时,会返回40x的错误,按照restful api, 我想当然...

FalconChen
2016/07/13
81
0
WordPress插件开发: 文章同步到OSC博客插件(OscPress) (二)

在上一篇文章我们讲了wordpress设置页的编码,这篇文章里我们讲oauth2鉴权,也就是从osc open api中获取access token的过程。有了access token ,我们才能调用osc的相关接口。 原理和流程请先...

FalconChen
2016/07/11
54
0
cnblogs2wp

当前插件可以将博客园(cnblogs.com)以及开源中国(oscchina.net)博客导出的文章数据导入wordpress,系统会自动处理提交的数据文件。可下载远程图片至wordpress博客中,也可以选择作者以及...

李惟
2014/11/23
506
0
OSChina 开源周刊第32期 —— Go 的插件化开发 Pingo

每周技术抢先看,总有你想要的! 移动开发 【博客】IOS 表视图(UITableView)使用详解 UITableView视图是IOS开发中常用而好用的一个控件。详情 前端开发 【软件】AngularJS 无限滚动指令 ngIn...

OSC编辑部
2015/05/03
2.3K
1
OSChina 开源周刊 41 期 —— Python 不是 C

每周技术抢先看,总有你想要的! 移动开发 【翻译】为什么 JavaScript 会在移动端中胜出? 【博客】开发基于 PhoneGap 的 Hybrid APP 前端开发 【翻译】使用 HTML5 时如何改进移动 Web 应用开...

OSC编辑部
2015/07/04
4.1K
0
WordPress加速缓存插件WP Super cache安装方法及使用技巧

当Wordpress博客的访问量逐渐升高时,如何加快Wordpress运行效率,减少服务器压力,提高Wordpress的访问速度,就成为了日益紧迫的事情了。话说Wordpress臃肿低效率的毛病在网上被好多人所诟病...

mickelfeng
2013/09/12
0
0
九款让WordPress成为赚钱利器的广告插件

Blog有了很不错的流量后,看到别人博客挂的广告挣$,是否也有挂广告的冲动,但是,修改wordpress模版去让人不厌其烦,布局、样式都的重新修改一下,为了不那么麻烦,笔者整理的几款wordpress...

云栖希望。
2017/12/04
0
0
wordpress博客批量导入OSchina博客

wordpress博客批量导入OSchina博客 Wordpress有同步文章到百度hi空间、新浪博客等的插件,没有同步到OSchina博客的插件,而OSChina也没有提供博客导入的功能。就简单用代码(java)实现了这功能...

youthflies
2013/09/28
0
4
使用inotify和git pull 实现网站自动部署(附wordpress插件)

本文转载自我的个人网站的博客文章,原文: 使用inotify和git-pull-实现网站自动部署附wordpress插件 --------------------- 我的个人网站项目托管在osc的git仓库里,以前的更新方法是从把代...

FalconChen
2016/04/28
141
10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

百度云iOS架构师在职场中的忠告

1.工具不能代替思考 在我多年的咨询工作和与许多组织和管理者的共事中,我发现了修复问题的共同套路,那就是管理人员相信工具可以“解决”给出的问题。当问题域被理解透彻,并且不可能有很多...

_小迷糊
19分钟前
0
0
Java基础——异常

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 异常处理: 可以挖很多个陷阱,但是不要都是一样...

凯哥学堂
32分钟前
0
0
180723-Quick-Task 动态脚本支持框架之结构设计篇

文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构设计篇/ Quick-Task 动态脚本支持框架之结构设计篇 相关博文: 180702-QuickTask动态脚本...

小灰灰Blog
35分钟前
0
0
SBT 常用开发技巧

SBT 一直以来都是 Scala 开发者不可言说的痛,最主要的原因就是官方文档维护质量较差,没有经过系统的、循序渐进式的整理,导致初学者入门门槛较高。虽然也有其它构建工具可以选择(例如 Mill...

joymufeng
40分钟前
0
0
HBase in Practice - 性能、监控及问题解决

李钰(社区ID:Yu Li),阿里巴巴计算平台事业部高级技术专家,HBase开源社区PMC&committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续4年基于HBase/HDFS设计和...

中国HBase技术社区
41分钟前
1
0
ES18-JAVA API 批量操作

1.批量查询 Multi Get API public static void multiGet() {// 批量查询MultiGetResponse response = getClient().prepareMultiGet().add("my_person", "my_index", "1")// 查......

贾峰uk
45分钟前
0
0
SpringBoot2.0使用health

1,引入actuator <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 2,application.properties ......

暗中观察
52分钟前
0
0
阿里巴巴Java开发规约

###编程规约 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。...

简心
57分钟前
0
0
如何用TypeScript来创建一个简单的Web应用

转载地址 如何用TypeScript来创建一个简单的Web应用 安装TypeScript 获取TypeScript工具的方式: 通过npm(Node.js包管理器) npm install -g typescript 构建你的第一个TypeScript文件 创建...

durban
今天
0
0
分享好友,朋友圈自定义分享链接无效

这个问题是微信6.5.6版本以后,修改了分享规则:分享的连接必须在公众号后台设定的js安全域名内

LM_Mike
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部