/** * Plugin Name: WP文章自动刷新插件 * Plugin URI: https://www.imwpweb.com/ * Description: 真正意义上的文章翻新插件,模拟手工重新发布,让老旧文章重新获得搜索引擎青睐,提升网站流量 * Version: 1.0.0 * Author: IMWPWEB * Author URI: https://www.imwpweb.com/ * Text Domain: wp-article-refresh * Domain Path: /languages * License: GPL v2 or later */ if (!defined('ABSPATH')) { exit; } // 插件常量定义 define('WP_ARTICLE_REFRESH_VERSION', '1.0.0'); define('WP_ARTICLE_REFRESH_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('WP_ARTICLE_REFRESH_PLUGIN_URL', plugin_dir_url(__FILE__)); /** * 主插件类 */ class WP_Article_Refresh { /** * 单例实例 */ private static $instance = null; /** * 获取单例实例 */ public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } /** * 构造函数 */ private function __construct() { // 注册激活/停用钩子 register_activation_hook(__FILE__, array($this, 'activate')); register_deactivation_hook(__FILE__, array($this, 'deactivate')); // 初始化插件 add_action('init', array($this, 'init')); // 添加定时任务钩子 add_action('wp_article_refresh_event', array($this, 'do_refresh')); } /** * 插件激活 */ public function activate() { // 设置默认选项 $default_options = array( 'enabled' => 1, 'refresh_interval' => 60, // 分钟 'days_range' => 365, // 1年内 'daily_limit' => 10, // 每天最多翻新10篇 'time_window_start' => '00:00', 'time_window_end' => '23:59', 'categories' => array(), // 空数组表示所有分类 'exclude_categories' => array(), 'refresh_mode' => 'today', // today:今天, random:随机前几天, gradual:逐渐递增 'refreshed_today' => 0, 'last_refresh_date' => date('Y-m-d'), 'total_refreshed' => 0 ); if (!get_option('wp_article_refresh_options')) { add_option('wp_article_refresh_options', $default_options); } // 设置定时任务 if (!wp_next_scheduled('wp_article_refresh_event')) { wp_schedule_event(time(), 'wp_article_refresh_interval', 'wp_article_refresh_event'); } // 刷新重写规则 flush_rewrite_rules(); } /** * 插件停用 */ public function deactivate() { // 清除定时任务 wp_clear_scheduled_hook('wp_article_refresh_event'); // 刷新重写规则 flush_rewrite_rules(); } /** * 初始化插件 */ public function init() { // 加载文本域 load_plugin_textdomain('wp-article-refresh', false, dirname(plugin_basename(__FILE__)) . '/languages'); // 添加自定义定时间隔 add_filter('cron_schedules', array($this, 'add_cron_interval')); // 添加管理菜单 add_action('admin_menu', array($this, 'add_admin_menu')); // 注册AJAX处理 add_action('wp_ajax_wp_article_refresh', array($this, 'handle_ajax')); // 添加设置链接 add_filter('plugin_action_links_' . plugin_basename(__FILE__), array($this, 'add_settings_link')); // 加载前端资源(仅在插件页面加载) add_action('admin_enqueue_scripts', array($this, 'enqueue_assets')); } /** * 添加自定义Cron间隔 */ public function add_cron_interval($schedules) { $options = get_option('wp_article_refresh_options'); $interval = isset($options['refresh_interval']) ? $options['refresh_interval'] : 60; $schedules['wp_article_refresh_interval'] = array( 'interval' => $interval * 60, 'display' => sprintf(__('每 %d 分钟', 'wp-article-refresh'), $interval) ); return $schedules; } /** * 添加管理菜单 */ public function add_admin_menu() { add_menu_page( __('文章自动刷新', 'wp-article-refresh'), __('文章刷新', 'wp-article_refresh'), 'manage_options', 'wp-article-refresh', array($this, 'render_admin_page'), 'dashicons-update', 30 ); } /** * 渲染管理页面 */ public function render_admin_page() { // 处理表单提交 if (isset($_POST['wp_article_refresh_nonce']) && wp_verify_nonce($_POST['wp_article_refresh_nonce'], 'wp_article_refresh_save')) { $this->save_options(); echo '

' . __('设置已保存!', 'wp-article-refresh') . '

'; } // 处理手动刷新 if (isset($_POST['wp_article_refresh_manual']) && wp_verify_nonce($_POST['wp_article_refresh_manual_nonce'], 'wp_article_refresh_manual')) { $result = $this->do_refresh(); if ($result) { echo '

' . sprintf(__('成功刷新了 %d 篇文章!', 'wp-article-refresh'), $result) . '

'; } else { echo '

' . __('没有找到符合条件的文章或已达今日上限!', 'wp-article-refresh') . '

'; } } $options = get_option('wp_article_refresh_options'); $stats = $this->get_statistics(); $categories = get_categories(array('hide_empty' => false)); include WP_ARTICLE_REFRESH_PLUGIN_DIR . 'templates/admin-page.php'; } /** * 保存设置选项 */ private function save_options() { $options = array( 'enabled' => isset($_POST['enabled']) ? 1 : 0, 'refresh_interval' => absint($_POST['refresh_interval']), 'days_range' => absint($_POST['days_range']), 'daily_limit' => absint($_POST['daily_limit']), 'time_window_start' => sanitize_text_field($_POST['time_window_start']), 'time_window_end' => sanitize_text_field($_POST['time_window_end']), 'categories' => isset($_POST['categories']) ? array_map('absint', $_POST['categories']) : array(), 'exclude_categories' => isset($_POST['exclude_categories']) ? array_map('absint', $_POST['exclude_categories']) : array(), 'refresh_mode' => sanitize_text_field($_POST['refresh_mode']), 'refreshed_today' => isset($_POST['reset_count']) ? 0 : get_option('wp_article_refresh_options', array()) ); // 获取之前的设置 $prev_options = get_option('wp_article_refresh_options', array()); $options['refreshed_today'] = isset($prev_options['refreshed_today']) ? $prev_options['refreshed_today'] : 0; $options['last_refresh_date'] = isset($prev_options['last_refresh_date']) ? $prev_options['last_refresh_date'] : date('Y-m-d'); $options['total_refreshed'] = isset($prev_options['total_refreshed']) ? $prev_options['total_refreshed'] : 0; update_option('wp_article_refresh_options', $options); // 重新设置定时任务 wp_clear_scheduled_hook('wp_article_refresh_event'); if ($options['enabled']) { wp_schedule_event(time(), 'wp_article_refresh_interval', 'wp_article_refresh_event'); } } /** * 执行文章刷新 */ public function do_refresh() { $options = get_option('wp_article_refresh_options'); // 检查插件是否启用 if (!$options['enabled']) { return 0; } // 检查时间窗口 $current_time = current_time('H:i'); if ($current_time < $options['time_window_start'] || $current_time > $options['time_window_end']) { return 0; } // 重置每日计数 $today = date('Y-m-d'); if ($options['last_refresh_date'] !== $today) { $options['refreshed_today'] = 0; $options['last_refresh_date'] = $today; } // 检查每日限制 if ($options['refreshed_today'] >= $options['daily_limit']) { return 0; } // 获取符合条件的文章 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => $options['daily_limit'] - $options['refreshed_today'], 'date_query' => array( 'before' => date('Y-m-d H:i:s', strtotime('-1 day')), 'after' => date('Y-m-d H:i:s', strtotime('-' . $options['days_range'] . ' days')) ), 'orderby' => 'rand', 'no_found_rows' => true ); // 分类筛选 if (!empty($options['categories'])) { $args['category__in'] = $options['categories']; } if (!empty($options['exclude_categories'])) { $args['category__not_in'] = $options['exclude_categories']; } $query = new WP_Query($args); $refreshed = 0; if ($query->have_posts()) { foreach ($query->posts as $post) { // 更新文章日期 $new_date = $this->calculate_new_date($post->post_date, $options['refresh_mode']); wp_update_post(array( 'ID' => $post->ID, 'post_date' => $new_date, 'post_date_gmt' => get_gmt_from_date($new_date), 'post_modified' => current_time('mysql'), 'post_modified_gmt' => current_time('mysql', 1) )); // 清理缓存 clean_post_cache($post->ID); $refreshed++; } wp_reset_postdata(); } // 更新统计 $options['refreshed_today'] += $refreshed; $options['total_refreshed'] += $refreshed; update_option('wp_article_refresh_options', $options); return $refreshed; } /** * 计算新日期 */ private function calculate_new_date($original_date, $mode) { $original = strtotime($original_date); $now = time(); switch ($mode) { case 'today': // 设置为今天 return date('Y-m-d H:i:s', time()); case 'random': // 随机1-7天前 $random_days = wp_rand(1, 7); $new_time = strtotime("-{$random_days} days"); return date('Y-m-d H:i:s', $new_time); case 'gradual': // 逐渐递增(基于原日期递减) $days_diff = floor(($now - $original) / 86400); if ($days_diff > 7) { $new_time = strtotime('-7 days'); } else { $new_time = $original + 86400; // 往后推一天 } return date('Y-m-d H:i:s', $new_time); default: return date('Y-m-d H:i:s', time()); } } /** * 获取统计信息 */ public function get_statistics() { $options = get_option('wp_article_refresh_options'); // 统计文章总数 $total_posts = wp_count_posts('post'); // 统计符合条件的文章数量 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'date_query' => array( 'before' => date('Y-m-d H:i:s', strtotime('-1 day')), 'after' => date('Y-m-d H:i:s', strtotime('-' . $options['days_range'] . ' days')) ), 'no_found_rows' => true ); if (!empty($options['categories'])) { $args['category__in'] = $options['categories']; } if (!empty($options['exclude_categories'])) { $args['category__not_in'] = $options['exclude_categories']; } $query = new WP_Query($args); $eligible_posts = $query->found_posts; return array( 'total_posts' => $total_posts->publish, 'eligible_posts' => $eligible_posts, 'refreshed_today' => $options['refreshed_today'], 'daily_limit' => $options['daily_limit'], 'total_refreshed' => $options['total_refreshed'], 'is_enabled' => $options['enabled'], 'next_refresh' => wp_next_scheduled('wp_article_refresh_event') ? date('Y-m-d H:i:s', wp_next_scheduled('wp_article_refresh_event')) : __('未设置', 'wp-article-refresh') ); } /** * 处理AJAX请求 */ public function handle_ajax() { if (!current_user_can('manage_options') || !wp_verify_nonce($_POST['nonce'], 'wp_article_refresh_ajax')) { wp_die(__('无权限', 'wp-article-refresh')); } $action = sanitize_text_field($_POST['sub_action']); switch ($action) { case 'get_stats': $stats = $this->get_statistics(); wp_send_json_success($stats); break; case 'refresh_now': $result = $this->do_refresh(); wp_send_json_success(array('refreshed' => $result)); break; default: wp_send_json_error(__('未知操作', 'wp-article-refresh')); } } /** * 添加设置链接 */ public function add_settings_link($links) { $settings_link = '' . __('设置', 'wp-article-refresh') . ''; array_unshift($links, $settings_link); return $links; } /** * 加载资源文件 */ public function enqueue_assets($hook) { if ('toplevel_page_wp-article-refresh' !== $hook) { return; } wp_enqueue_style('wp-article-refresh-admin', WP_ARTICLE_REFRESH_PLUGIN_URL . 'assets/css/admin.css', array(), WP_ARTICLE_REFRESH_VERSION); wp_enqueue_script('wp-article-refresh-admin', WP_ARTICLE_REFRESH_PLUGIN_URL . 'assets/js/admin.js', array('jquery'), WP_ARTICLE_REFRESH_VERSION, true); wp_localize_script('wp-article-refresh-admin', 'wpArticleRefresh', array( 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wp_article_refresh_ajax'), 'strings' => array( 'confirm' => __('确定要手动刷新吗?', 'wp-article-refresh'), 'refreshing' => __('刷新中...', 'wp-article-refresh'), 'success' => __('刷新成功!', 'wp-article-refresh'), 'error' => __('刷新失败!', 'wp-article-refresh') ) )); } } // 初始化插件 WP_Article_Refresh::get_instance(); // 创建模板目录 function wp_article_refresh_create_templates_dir() { $dir = WP_ARTICLE_REFRESH_PLUGIN_DIR . 'templates'; if (!file_exists($dir)) { mkdir($dir, 0755, true); } } add_action('admin_init', 'wp_article_refresh_create_templates_dir'); position属性_第28页_创想鸟

position属性

  • CSS中z-index属性在不同定位元素中的表现

    CSS中z-index属性在不同定位元素中的表现CSS中z-index属性在不同定位元素中的表现CSS中z-index属性在不同定位元素中的表现CSS中z-index属性在不同定位元素中的表现

    z-index在css中不起作用的主要原因有三点:首先,元素必须设置非static的position属性(如relative、absolute、fixed或sticky),否则z-index无效;其次,不同定位方式的元素处于不同的层叠上下文中,例如fixed和sticky元素层级独立于relativ…

    2025年12月2日 用户投稿
    300
  • css怎么控制图片大小?css图片尺寸调整技巧

    css怎么控制图片大小?css图片尺寸调整技巧css怎么控制图片大小?css图片尺寸调整技巧css怎么控制图片大小?css图片尺寸调整技巧css怎么控制图片大小?css图片尺寸调整技巧

    要控制图片大小并实现响应式设计,1. 使用width、height属性设定基础尺寸;2. 结合max-width、max-height保持比例缩放;3. 利用object-fit控制图片填充方式(fill、contain、cover等);4. 通过元素和srcset属性实现多设备适配;5. 使用si…

    2025年12月2日 用户投稿
    100
  • 怎样用CSS操作数据标签样式—badge组件设计

    怎样用CSS操作数据标签样式—badge组件设计怎样用CSS操作数据标签样式—badge组件设计怎样用CSS操作数据标签样式—badge组件设计怎样用CSS操作数据标签样式—badge组件设计

    要让徽章在不同场景下保持视觉一致性与可读性,需遵循以下步骤:1. 颜色语义化并确保对比度达标;2. 使用em或rem单位统一尺寸比例;3. 设置最小宽度和高度保证形状稳定;4. 选用小尺寸清晰字体并限制内容长度;5. 定义css变量统一管理样式。在复杂布局中控制徽章定位与层级的方法包括:1. 使用相…

    2025年12月2日 用户投稿
    000
  • CSS中如何实现数据卡片堆叠—z-index层叠控制

    CSS中如何实现数据卡片堆叠—z-index层叠控制CSS中如何实现数据卡片堆叠—z-index层叠控制CSS中如何实现数据卡片堆叠—z-index层叠控制CSS中如何实现数据卡片堆叠—z-index层叠控制

    在css中实现数据卡片堆叠的核心方法是使用position属性与z-index属性配合。1. 首先为父容器设置position: relative,创建定位上下文;2. 为每张卡片设置position: absolute,使其脱离文档流并允许自由定位;3. 通过设定不同z-index值控制堆叠顺序,…

    2025年12月2日 用户投稿
    100
  • CSS层叠顺序怎么控制 层叠顺序控制教程

    CSS层叠顺序怎么控制 层叠顺序控制教程CSS层叠顺序怎么控制 层叠顺序控制教程CSS层叠顺序怎么控制 层叠顺序控制教程CSS层叠顺序怎么控制 层叠顺序控制教程

    z-index生效需元素设置非static的position属性,且值越大层级越高,但受层叠上下文限制。1. 层叠上下文由根元素、定位元素结合z-index、transform、opacity等属性创建,独立影响内部元素层级;2. z-index无效常见原因包括未设position属性、处于不同层叠…

    2025年12月2日 用户投稿
    200
  • CSS选择器控制响应式导航栏的显示与隐藏

    CSS选择器控制响应式导航栏的显示与隐藏CSS选择器控制响应式导航栏的显示与隐藏CSS选择器控制响应式导航栏的显示与隐藏CSS选择器控制响应式导航栏的显示与隐藏

    响应式导航栏的显示与隐藏可通过css选择器实现,其核心方法是“复选框技巧”。1. html结构包括隐藏的复选框、点击用的label(汉堡图标)和导航菜单;2. css默认隐藏菜单并设置过渡效果;3. 利用复选框状态变化控制菜单显示;4. 媒体查询在大屏下自动显示导航;5. 优化用户体验需添加过渡动画…

    2025年12月2日 用户投稿
    000
  • CSS怎样设置背景定位?CSS背景图片位置调整

    CSS怎样设置背景定位?CSS背景图片位置调整CSS怎样设置背景定位?CSS背景图片位置调整CSS怎样设置背景定位?CSS背景图片位置调整CSS怎样设置背景定位?CSS背景图片位置调整

    在css中设置背景定位的方法有多种,包括使用关键词、像素值、百分比或混合方式。1. 使用关键词:如top、bottom、left、right、center,可以快速定义背景图的位置,例如background-position: center实现居中显示;2. 使用像素值:通过具体的数值控制偏移量,如…

    2025年12月2日 用户投稿
    000
  • CSS伪元素如何设置 伪元素设置指南

    CSS伪元素如何设置 伪元素设置指南CSS伪元素如何设置 伪元素设置指南CSS伪元素如何设置 伪元素设置指南CSS伪元素如何设置 伪元素设置指南

    伪元素允许通过css为html元素添加额外样式而不改变结构,核心通过::before和::after实现。1. 使用content属性定义内容,即使为空也需声明;2. 可用于创建装饰性元素、美化复选框等复杂布局;3. 调试时可通过添加背景色定位伪元素;4. ::before插入内容前,::after…

    2025年12月2日 用户投稿
    000
  • CSS 浮动与定位区别 浮动和定位在 CSS 中有什么关系

    CSS 浮动与定位区别 浮动和定位在 CSS 中有什么关系CSS 浮动与定位区别 浮动和定位在 CSS 中有什么关系CSS 浮动与定位区别 浮动和定位在 CSS 中有什么关系CSS 浮动与定位区别 浮动和定位在 CSS 中有什么关系

    浮动与定位的核心区别在于对文档流的影响及使用场景。①浮动(float)使元素半脱离文档流,仍影响相邻内容,常用于文本环绕和简单布局,但需清除浮动以解决高度塌陷问题;②定位(position)则让元素完全脱离文档流(如absolute、fixed),实现精确位置控制和层叠效果,适用于弹窗、固定导航等场…

    2025年12月2日 用户投稿
    100
  • CSS中如何创建数据仪表指针—rotate动画精准定位

    CSS中如何创建数据仪表指针—rotate动画精准定位CSS中如何创建数据仪表指针—rotate动画精准定位CSS中如何创建数据仪表指针—rotate动画精准定位CSS中如何创建数据仪表指针—rotate动画精准定位

    仪表盘指针定位的关键css属性包括position、transform、transform-origin、transition和z-index。其中,position属性用于精确定位指针在容器中的位置;transform配合rotate()实现旋转功能;transform-origin定义旋转中心点…

    2025年12月2日 用户投稿
    000
关注微信