['menu_title'=>'用户设置', 'order'=>16],
'wpjam-page' => ['menu_title'=>'页面设置', 'order'=>15],
'wpjam-links' => ['menu_title'=>'链接设置', 'order'=>14],
'wpjam-seo' => ['menu_title'=>'SEO 设置', 'order'=>12],
'wpjam-about' => ['menu_title'=>'关于WPJAM', 'order'=>1, 'function'=>[self::class, 'about_page']],
'wpjam-icons' => ['menu_title'=>'图标列表', 'order'=>9, 'tabs'=>['dashicons'=>['title'=>'Dashicons', 'function'=>[self::class, 'dashicons_page']]]],
] as $slug => $args){
if($args['order'] < 10 || wpjam_filter(wpjam_admin('tabs[]'), fn($v)=> wpjam_get($v, 'plugin_page') == $slug)){
wpjam_add_menu_page($slug, $args+['parent'=>'wpjam-basic', 'function'=>'tab', 'network'=>false]);
}
}
wpjam_add_admin_load(['type'=>'builtin_page', 'model'=> self::class]);
add_action('admin_menu', fn()=> $GLOBALS['menu'] += ['58.88'=> ['', 'read', 'separator'.'58.88', '', 'wp-menu-separator']]);
if(get_transient('wpjam_basic_verify')){
wpjam_admin('pages[wpjam-basic][subs][wpjam-about]', null);
}elseif(WPJAM_Verify::verify()){
if(isset($_GET['unbind_wpjam_user'])){
delete_user_meta(get_current_user_id(), 'wpjam_weixin_user');
wp_redirect(admin_url('admin.php?page=wpjam-verify'));
}
}else{
wpjam_admin('pages[wpjam-basic][subs]', ['wpjam-verify'=> [
'menu_title' => '扩展管理',
'page_title' => '验证 WPJAM',
'function' => 'form',
'model' => 'WPJAM_Verify'
]]);
}
}
public static function dashicons_page(){
$file = fopen(ABSPATH.'/'.WPINC.'/css/dashicons.css','r');
$html = [];
while(!feof($file)){
$line = fgets($file);
$icon = $line && preg_match_all('/.dashicons-(.*?):before/i', $line, $matches) ? $matches[1][0] : '';
$html[] = $icon && $icon != 'before' ? wpjam_tag('span', ['dashicons-before', 'dashicons-'.$icon])->after('
'.$icon)->wrap('p', ['data-dashicon'=>'dashicons-'.$icon]) : '';
}
fclose($file);
echo '
'.implode($html).'
'.'';
?>
wpjam_remote_request(self::api_url('about'), ['field'=>'body.template.table.content']));
?>
WPJAM Basic
WPJAM Basic 是 我爱水煮鱼 的 Denis 开发的 WordPress 插件。
WPJAM Basic 除了能够优化你的 WordPress ,也是 「WordPress 果酱」团队进行 WordPress 二次开发的基础。
为了方便开发,WPJAM Basic 使用了最新的 PHP 7.2 语法,所以要使用该插件,需要你的服务器的 PHP 版本是 7.2 或者更高。
我们开发所有插件都需要首先安装 WPJAM Basic,其他功能组件将以扩展的模式整合到 WPJAM Basic 插件一并发布。
base, ['dashboard', 'dashboard-network', 'dashboard-user'])){
is_multisite() && !is_user_member_of_blog() && remove_meta_box('dashboard_quick_press', get_current_screen(), 'side');
$args = ['post_type'=>get_post_types(['show_ui'=>true, 'public'=>true, '_builtin'=>false])+['post']];
wpjam_hooks('dashboard_recent_posts_query_args, dashboard_recent_drafts_query_args', '+', $args+['cache_results'=>true]);
add_action('pre_get_comments', fn($query)=> $query->query_vars = array_merge($query->query_vars, $args+['type'=>'comment']));
wpjam_dashboard('load', ['name'=>'dashboard', 'widgets'=>['wpjam_update'=>[
'title' => 'WordPress资讯及技巧',
'context' => 'side',
'callback' => function(){
$posts = wpjam_transient('jam_dashboard_posts', fn()=> wpjam_remote_request('https://jam.wpweixin.com/api/post/list.json', ['timeout'=>1, 'field'=>'body.posts']));
echo is_array($posts) ? '' : '';
}
]]]);
wpjam_style([
'#dashboard_wpjam .inside{margin:0; padding:0;}',
'a.jam-post {border-bottom:1px solid #eee; margin: 0 !important; padding:6px 0; display: block; text-decoration: none; }',
'a.jam-post:last-child{border-bottom: 0;}',
'a.jam-post p{display: table-row; }',
'a.jam-post img{display: table-cell; width:40px; height: 40px; margin:4px 12px; }',
'a.jam-post span{display: table-cell; height: 40px; vertical-align: middle;}'
]);
}elseif($base = array_find(['plugins', 'themes', 'update-core'], fn($base)=> str_starts_with($screen->base, $base))){
foreach(['plugin', 'theme'] as $type){
wpjam_updater($type, 'blog.wpjam.com', self::api_url($type));
// wpjam_print_r(get_site_transient('update_'.$type.'s'));
// delete_site_transient('update_'.$type.'s');
}
add_filter('pre_set_site_transient_update_plugins', function($updates){
$file = 'wpjam-basic/wpjam-basic.php';
if($key = array_find(['response', 'no_update'], fn($k)=> isset($updates->$k[$file]))){
$plugin = get_plugin_data(WP_PLUGIN_DIR.'/'.$file);
$update = apply_filters('update_plugins_blog.wpjam.com', false, $plugin, $file, []);
if($update && is_array($update) && version_compare($update['new_version'], $plugin['Version'], '>')){
$updates->response[$file] = (object)(array_merge((array)$updates->$key[$file], $update));
unset($updates->no_update[$file]);
}
}
return $updates;
});
}
}
}
class WPJAM_Verify{
public static function verify(){
$verify_user = get_user_meta(get_current_user_id(), 'wpjam_weixin_user', true);
if(empty($verify_user)){
return false;
}
if(time() - $verify_user['last_update'] < DAY_IN_SECONDS){
return true;
}
$openid = $verify_user['openid'];
$hash = $verify_user['hash'] ?? '';
$user_id = get_current_user_id();
if(wpjam_lock('fetching_wpjam_weixin_user_'.$openid, 10)){
return false;
}
$response = self::request(['openid'=>$openid, 'hash'=>$hash]);
if(is_wp_error($response) && $response->get_error_code() != 'invalid_openid'){
$failed_times = (int)get_user_meta($user_id, 'wpjam_weixin_user_failed_times');
$failed_times ++;
if($failed_times >= 3){ // 重复三次
delete_user_meta($user_id, 'wpjam_weixin_user_failed_times');
delete_user_meta($user_id, 'wpjam_weixin_user');
}else{
update_user_meta($user_id, 'wpjam_weixin_user_failed_times', $failed_times);
}
return false;
}
delete_user_meta($user_id, 'wpjam_weixin_user_failed_times');
if(empty($response) || !is_array($response) || !$response['subscribe']){
delete_user_meta($user_id, 'wpjam_weixin_user');
return false;
}
update_user_meta($user_id, 'wpjam_weixin_user', array_merge($response, ['last_update'=>time()]));
return true;
}
public static function request($data, $throw=false){
return wpjam_remote_request('https://wpjam.wpweixin.com/api/weixin/verify.json', ['method'=>'POST', 'body'=>$data, 'throw'=>$throw]);
}
public static function get_form(){
wpjam_style('.form-table th{width: 100px;}');
$qrcode = wpjam_tag('img', ['src'=>'https://open.weixin.qq.com/qr/code?username=wpjamcom', 'style'=>'max-width:250px;'])->wrap('p')->before('p', [], '使用微信扫描下面的二维码:');
return [
'submit_text' => '验证',
'response' => 'redirect',
'validate' => true,
'callback' => function($data){
update_user_meta(get_current_user_id(), 'wpjam_weixin_user', array_merge(self::request($data, true), ['last_update'=>time(), 'subscribe'=>1]));
return ['url'=>admin_url('page=wpjam-extends')];
},
'fields' => [
'qr_view' => ['title'=>'1. 二维码', 'type'=>'view', 'value'=>$qrcode],
'keyword' => ['title'=>'2. 关键字', 'type'=>'view', 'value'=>'回复关键字「验证码」。'],
'code' => ['title'=>'3. 验证码', 'type'=>'number', 'required', 'before'=>'将获取验证码输入提交即可'],
'notes' => ['title'=>'4. 注意事项', 'type'=>'view', 'value'=>'验证码5分钟内有效!
如果验证不通过,请使用 Chrome 浏览器验证,并在验证之前清理浏览器缓存。
如多次测试无法通过,可以尝试重新关注公众号测试!
'],
]
];
}
}
add_action('wpjam_admin_init', ['WPJAM_Basic_Admin', 'on_admin_init'], 99);