文章目录
-
- 在当今快速变化的数字媒体环境中,网络传媒机构面临着内容需求波动大、资源分配不均的挑战。柔性供应系统通过动态调整内容生产、分发和资源分配,帮助传媒机构灵活应对市场需求变化。本教程将指导您开发一个WordPress插件,实现基本的柔性供应功能,包括内容自动调度、资源管理和多渠道发布。
- 在开始开发之前,请确保您已准备好以下环境: WordPress 5.0+ 安装 PHP 7.2+ 运行环境 MySQL 5.6+ 数据库 代码编辑器(如VS Code、PHPStorm) 本地开发环境(如XAMPP、MAMP或Local by Flywheel)
- 首先,我们创建插件的基本目录结构和主文件: <?php /** * 插件名称: 网络传媒柔性供应系统 * 插件URI: https://yourwebsite.com/ * 描述: 实现网络传媒柔性供应的WordPress插件 * 版本: 1.0.0 * 作者: 您的名称 * 作者URI: https://yourwebsite.com/ * 许可证: GPL v2或更高版本 * 文本域: flexible-media-supply */ // 防止直接访问 if (!defined('ABSPATH')) { exit; } // 定义插件常量 define('FMS_VERSION', '1.0.0'); define('FMS_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('FMS_PLUGIN_URL', plugin_dir_url(__FILE__)); // 初始化插件 class FlexibleMediaSupply { private static $instance = null; // 获取单例实例 public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } // 构造函数 private function __construct() { $this->init_hooks(); } // 初始化钩子 private function init_hooks() { // 激活/停用钩子 register_activation_hook(__FILE__, array($this, 'activate')); register_deactivation_hook(__FILE__, array($this, 'deactivate')); // 管理菜单 add_action('admin_menu', array($this, 'add_admin_menu')); // 加载文本域 add_action('init', array($this, 'load_textdomain')); // 初始化功能模块 $this->init_modules(); } // 激活插件 public function activate() { // 创建数据库表 $this->create_tables(); // 设置默认选项 $this->set_default_options(); // 刷新重写规则 flush_rewrite_rules(); } // 停用插件 public function deactivate() { // 清理临时数据 // 注意:这里不删除数据,以便用户重新激活时保留设置 flush_rewrite_rules(); } // 加载文本域 public function load_textdomain() { load_plugin_textdomain( 'flexible-media-supply', false, dirname(plugin_basename(__FILE__)) . '/languages/' ); } // 添加管理菜单 public function add_admin_menu() { add_menu_page( __('柔性供应系统', 'flexible-media-supply'), __('柔性供应', 'flexible-media-supply'), 'manage_options', 'flexible-media-supply', array($this, 'render_dashboard'), 'dashicons-schedule', 30 ); // 添加子菜单 add_submenu_page( 'flexible-media-supply', __('内容调度', 'flexible-media-supply'), __('内容调度', 'flexible-media-supply'), 'manage_options', 'fms-content-schedule', array($this, 'render_content_schedule') ); add_submenu_page( 'flexible-media-supply', __('资源管理', 'flexible-media-supply'), __('资源管理', 'flexible-media-supply'), 'manage_options', 'fms-resource-management', array($this, 'render_resource_management') ); } // 初始化模块 private function init_modules() { // 这里将初始化各个功能模块 require_once FMS_PLUGIN_DIR . 'includes/class-content-scheduler.php'; require_once FMS_PLUGIN_DIR . 'includes/class-resource-manager.php'; require_once FMS_PLUGIN_DIR . 'includes/class-multi-channel-publisher.php'; // 初始化模块实例 new Content_Scheduler(); new Resource_Manager(); new Multi_Channel_Publisher(); } // 创建数据库表 private function create_tables() { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); // 内容调度表 $table_name = $wpdb->prefix . 'fms_content_schedule'; $sql = "CREATE TABLE IF NOT EXISTS $table_name ( id mediumint(9) NOT NULL AUTO_INCREMENT, post_id bigint(20) NOT NULL, schedule_time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, channel varchar(100) NOT NULL, status varchar(20) DEFAULT 'pending', created_at datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY post_id (post_id), KEY schedule_time (schedule_time) ) $charset_collate;"; // 资源分配表 $table_name2 = $wpdb->prefix . 'fms_resource_allocation'; $sql2 = "CREATE TABLE IF NOT EXISTS $table_name2 ( id mediumint(9) NOT NULL AUTO_INCREMENT, resource_type varchar(50) NOT NULL, resource_id bigint(20) NOT NULL, allocation_date date NOT NULL, hours_allocated decimal(5,2) DEFAULT 0.00, project_id bigint(20), notes text, PRIMARY KEY (id), KEY allocation_date (allocation_date), KEY resource_type (resource_type) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); dbDelta($sql2); } // 设置默认选项 private function set_default_options() { $default_options = array( 'auto_schedule' => true, 'default_channels' => array('website', 'social_media'), 'max_daily_posts' => 10, 'resource_warning_threshold' => 80, 'notification_email' => get_option('admin_email') ); add_option('fms_settings', $default_options); } // 渲染仪表板 public function render_dashboard() { ?> <div class="wrap"> <h1><?php echo esc_html__('网络传媒柔性供应系统', 'flexible-media-supply'); ?></h1> <div class="fms-dashboard"> <div class="fms-stats-container"> <div class="fms-stat-box"> <h3><?php echo esc_html__('今日计划内容', 'flexible-media-supply'); ?></h3> <p class="stat-number"><?php echo $this->get_today_scheduled_count(); ?></p> </div> <div class="fms-stat-box"> <h3><?php echo esc_html__('可用资源', 'flexible-media-supply'); ?></h3> <p class="stat-number"><?php echo $this->get_available_resources(); ?></p> </div> <div class="fms-stat-box"> <h3><?php echo esc_html__('多渠道发布', 'flexible-media-supply'); ?></h3> <p class="stat-number"><?php echo $this->get_channel_count(); ?></p> </div> </div> </div> </div> <?php } // 渲染内容调度页面 public function render_content_schedule() { // 这里将实现内容调度界面 echo '<div class="wrap"><h1>内容调度</h1></div>'; } // 渲染资源管理页面 public function render_resource_management() { // 这里将实现资源管理界面 echo '<div class="wrap"><h1>资源管理</h1></div>'; } // 获取今日计划内容数量 private function get_today_scheduled_count() { global $wpdb; $table_name = $wpdb->prefix . 'fms_content_schedule'; $today = current_time('mysql'); $count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $table_name WHERE DATE(schedule_time) = DATE(%s) AND status = 'pending'", $today ) ); return $count ? $count : 0; } // 获取可用资源 private function get_available_resources() { // 简化示例,实际应计算实际可用资源 return '85%'; } // 获取渠道数量 private function get_channel_count() { $settings = get_option('fms_settings', array()); if (isset($settings['default_channels'])) { return count($settings['default_channels']); } return 0; } } // 初始化插件 FlexibleMediaSupply::get_instance(); ?>
- 内容调度是柔性供应系统的核心功能之一。以下是一个简化的内容调度类: <?php /** * 内容调度模块 * 负责自动和手动安排内容发布时间 */ class Content_Scheduler { public function __construct() { // 添加发布动作钩子 add_action('save_post', array($this, 'schedule_on_save'), 10, 2); // 添加定时任务检查 add_action('fms_check_scheduled_content', array($this, 'process_scheduled_content')); // 注册定时任务 if (!wp_next_scheduled('fms_check_scheduled_content')) { wp_schedule_event(time(), 'hourly', 'fms_check_scheduled_content'); } // 添加管理列 add_filter('manage_post_posts_columns', array($this, 'add_schedule_column')); add_action('manage_post_posts_custom_column', array($this, 'render_schedule_column'), 10, 2); } /** * 保存文章时自动调度 * @param int $post_id 文章ID * @param WP_Post $post 文章对象 */ public function schedule_on_save($post_id, $post) { // 检查自动发布权限 if (!current_user_can('edit_post', $post_id) || wp_is_post_revision($post_id)) { return; } // 检查是否启用自动调度 $settings = get_option('fms_settings', array()); if (!isset($settings['auto_schedule']) || !$settings['auto_schedule']) { return; } // 获取文章类型 $post_type = get_post_type($post_id); // 只处理文章和自定义类型 if (!in_array($post_type, array('post', 'fms_content'))) { return; } // 检查是否已有调度 $existing_schedule = $this->get_post_schedule($post_id); if (!$existing_schedule && $post->post_status == 'future') { // 如果文章是定时发布,创建调度记录 $this->create_schedule($post_id, $post->post_date); } } /** * 创建内容调度 * @param int $post_id 文章ID * @param string $schedule_time 调度时间 * @param string $channel 发布渠道 * @return bool 成功与否 */ public function create_schedule($post_id, $schedule_time, $channel = 'website') { global $wpdb; $table_name = $wpdb->prefix . 'fms_content_schedule'; $result = $wpdb->insert( $table_name, array( 'post_id' => $post_id, 'schedule_time' => $schedule_time, 'channel' => $channel, 'status' => 'pending' ), array('%d', '%s', '%s', '%s') ); return $result !== false; } /** * 处理已调度的内容 */ public function process_scheduled_content() { global $wpdb; $table_name = $wpdb->prefix . 'fms_content_schedule'; $current_time = current_time('mysql'); // 获取到期的调度 $scheduled_items = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table_name WHERE schedule_time <= %s AND status = 'pending'", $current_time ) ); foreach ($scheduled_items as $item) { // 发布内容 $this->publish_content($item->post_id, $item->channel); // 更新状态 $wpdb->update( $table_name, array('status' => 'published'), array('id' => $item->id), array('%s'), array('%d') ); } } /** * 发布内容到指定渠道 * @param int $post_id 文章ID * @param string $channel 发布渠道 */ private function publish_content($post_id, $channel) { $post = get_post($post_id); if (!$post) { return; } // 根据渠道执行不同的发布逻辑 switch ($channel) { case 'website': // 更新文章状态为发布 wp_publish_post($post_id); break; case 'social_media': // 发布到社交媒体(简化示例) $this->publish_to_social_media($post); break; // 可以添加更多渠道 } // 记录发布日志 $this->log_publication($post_id, $channel); } /** * 发布到社交媒体 * @param WP_Post $post 文章对象 */ private function publish_to_social_media($post) { // 这里应集成社交媒体API // 简化示例:记录日志 error_log('发布到社交媒体: ' . $post->post_title); } /** * 记录发布日志 * @param int $post_id 文章ID * @param string $channel 发布渠道 */ private function log_publication($post_id, $channel) { // 这里可以记录详细的发布日志 update_post_meta($post_id, '_fms_last_published', array( 'channel' => $channel, 'time' => current_time('mysql') )); } /** * 获取文章的调度信息 * @param int $post_id 文章ID * @return object|null 调度信息 */ private function get_post_schedule($post_id) { global $wpdb; $table_name = $wpdb->prefix . 'fms_content_schedule'; return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table_name WHERE post_id = %d AND status = 'pending'", $post_id ) ); } /** * 添加调度列到文章列表 * @param array $columns 现有列 * @return array 更新后的列 */ public function add_schedule_column($columns) { $columns['fms_schedule'] = __('调度状态', 'flexible-media-supply'); return $columns; } /** * 渲染调度列内容 * @param string $column 列名 * @param int $post_id 文章ID */ public function render_schedule_column($column, $post_id) { if ($column === 'fms_schedule') { $schedule = $this->get_post_schedule($post_id); if ($schedule) { echo '<span class="dashicons dashicons-clock" title="' . esc_attr(sprintf(__('计划于 %s 发布', 'flexible-media-supply'), $schedule->schedule_time)) . '"></span>'; } else { echo '<span class="dashicons dashicons-minus" title="' . esc_attr__('未调度', 'flexible-media-supply') . '"></span>'; } } } } ?>
- 资源管理是柔性供应系统的另一个关键组成部分: <?php /** * 资源管理模块 * 管理人力、时间和内容资源 */ class Resource_Manager { public function __construct() { // 添加资源管理页面 add_action('admin_init', array($this, 'register_resource_settings')); // 添加上下文帮助 add_action('load-toplevel_page_flexible-media-supply', array($this, 'add_help_tabs')); // 资源使用情况短代码 add_shortcode('fms_resource_usage', array($this, 'resource_usage_shortcode')); } /** * 注册资源设置 */ public function register_resource_settings() { register_setting('fms_resource_settings', 'fms_resource_allocations'); add_settings_section( 'fms_resource_section', __('资源分配设置', 'flexible-media-supply'), array($this, 'render_resource_section'), 'flexible-media-supply' ); add_settings_field( 'fms_editor_hours', __('编辑人员工时', 'flexible-media-supply'), _field'), 'flexible-media-supply', 'fms_resource_section' ); add_settings_field( 'fms_designer_hours', __('设计人员工时', 'flexible-media-supply'), array($this, 'render_designer_hours_field'), 'flexible-media-supply', 'fms_resource_section' ); } /** * 渲染资源部分说明 */ public function render_resource_section() { echo '<p>' . __('配置您的团队资源分配,系统将根据这些设置优化内容生产计划。', 'flexible-media-supply') . '</p>'; } /** * 渲染编辑工时字段 */ public function render_editor_hours_field() { $allocations = get_option('fms_resource_allocations', array()); $editor_hours = isset($allocations['editor_hours']) ? $allocations['editor_hours'] : 40; echo '<input type="number" name="fms_resource_allocations[editor_hours]" value="' . esc_attr($editor_hours) . '" min="0" max="168" />'; echo '<p class="description">' . __('每周可用编辑工时(小时)', 'flexible-media-supply') . '</p>'; } /** * 渲染设计工时字段 */ public function render_designer_hours_field() { $allocations = get_option('fms_resource_allocations', array()); $designer_hours = isset($allocations['designer_hours']) ? $allocations['designer_hours'] : 30; echo '<input type="number" name="fms_resource_allocations[designer_hours]" value="' . esc_attr($designer_hours) . '" min="0" max="168" />'; echo '<p class="description">' . __('每周可用设计工时(小时)', 'flexible-media-supply') . '</p>'; } /** * 计算资源使用率 * @param string $resource_type 资源类型 * @param string $period 时间周期 * @return array 使用率数据 */ public function calculate_resource_usage($resource_type = 'all', $period = 'week') { global $wpdb; $table_name = $wpdb->prefix . 'fms_resource_allocation'; $allocations = get_option('fms_resource_allocations', array()); // 计算时间范围 $date_condition = ''; if ($period === 'week') { $date_condition = "AND allocation_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)"; } elseif ($period === 'month') { $date_condition = "AND allocation_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)"; } // 查询已分配的资源 $query = "SELECT resource_type, SUM(hours_allocated) as total_used FROM $table_name WHERE 1=1 $date_condition"; if ($resource_type !== 'all') { $query .= $wpdb->prepare(" AND resource_type = %s", $resource_type); } $query .= " GROUP BY resource_type"; $used_resources = $wpdb->get_results($query); // 计算使用率 $usage_data = array(); foreach ($used_resources as $resource) { $available_key = $resource->resource_type . '_hours'; $available = isset($allocations[$available_key]) ? $allocations[$available_key] : 0; if ($available > 0) { $usage_percentage = ($resource->total_used / $available) * 100; } else { $usage_percentage = 0; } $usage_data[$resource->resource_type] = array( 'used' => $resource->total_used, 'available' => $available, 'percentage' => round($usage_percentage, 2), 'status' => $usage_percentage > 90 ? 'critical' : ($usage_percentage > 70 ? 'warning' : 'normal') ); } return $usage_data; } /** * 分配资源到项目 * @param string $resource_type 资源类型 * @param int $resource_id 资源ID * @param float $hours 分配工时 * @param string $date 分配日期 * @param int $project_id 项目ID * @param string $notes 备注 * @return bool 成功与否 */ public function allocate_resource($resource_type, $resource_id, $hours, $date, $project_id = null, $notes = '') { global $wpdb; $table_name = $wpdb->prefix . 'fms_resource_allocation'; // 检查是否超分配 $usage_data = $this->calculate_resource_usage($resource_type, 'week'); $allocations = get_option('fms_resource_allocations', array()); $available_key = $resource_type . '_hours'; $available = isset($allocations[$available_key]) ? $allocations[$available_key] : 0; $current_used = isset($usage_data[$resource_type]) ? $usage_data[$resource_type]['used'] : 0; if (($current_used + $hours) > $available) { // 记录警告但不阻止分配 error_log(sprintf( __('资源分配警告:%s 类型资源分配超出可用量', 'flexible-media-supply'), $resource_type )); } $result = $wpdb->insert( $table_name, array( 'resource_type' => $resource_type, 'resource_id' => $resource_id, 'allocation_date' => $date, 'hours_allocated' => $hours, 'project_id' => $project_id, 'notes' => $notes ), array('%s', '%d', '%s', '%f', '%d', '%s') ); return $result !== false; } /** * 资源使用情况短代码 * @param array $atts 短代码属性 * @return string 渲染的HTML */ public function resource_usage_shortcode($atts) { $atts = shortcode_atts(array( 'type' => 'all', 'period' => 'week', 'show_chart' => 'true' ), $atts, 'fms_resource_usage'); $usage_data = $this->calculate_resource_usage($atts['type'], $atts['period']); if (empty($usage_data)) { return '<p>' . __('暂无资源使用数据', 'flexible-media-supply') . '</p>'; } ob_start(); ?> <div class="fms-resource-usage"> <h3><?php echo esc_html__('资源使用情况', 'flexible-media-supply'); ?></h3> <div class="resource-stats"> <?php foreach ($usage_data as $type => $data): ?> <div class="resource-stat-item"> <h4><?php echo esc_html($this->get_resource_type_label($type)); ?></h4> <div class="usage-bar"> <div class="usage-fill" style="width: <?php echo esc_attr(min($data['percentage'], 100)); ?>%; background-color: <?php echo $this->get_status_color($data['status']); ?>;"> </div> </div> <p class="usage-numbers"> <?php printf( __('已用: %.1f / 可用: %.1f 小时 (%.1f%%)', 'flexible-media-supply'), $data['used'], $data['available'], $data['percentage'] ); ?> </p> </div> <?php endforeach; ?> </div> </div> <style> .fms-resource-usage { margin: 20px 0; } .resource-stat-item { margin-bottom: 15px; } .usage-bar { height: 20px; background: #f0f0f0; border-radius: 10px; overflow: hidden; margin: 5px 0; } .usage-fill { height: 100%; transition: width 0.5s ease; } .usage-numbers { font-size: 12px; color: #666; margin: 0; } </style> <?php return ob_get_clean(); } /** * 获取资源类型标签 * @param string $type 资源类型 * @return string 标签 */ private function get_resource_type_label($type) { $labels = array( 'editor' => __('编辑', 'flexible-media-supply'), 'designer' => __('设计', 'flexible-media-supply'), 'video' => __('视频制作', 'flexible-media-supply'), 'seo' => __('SEO优化', 'flexible-media-supply') ); return isset($labels[$type]) ? $labels[$type] : $type; } /** * 获取状态颜色 * @param string $status 状态 * @return string 颜色代码 */ private function get_status_color($status) { $colors = array( 'normal' => '#4CAF50', 'warning' => '#FF9800', 'critical' => '#F44336' ); return isset($colors[$status]) ? $colors[$status] : '#4CAF50'; } /** * 添加上下文帮助标签 */ public function add_help_tabs() { $screen = get_current_screen(); $screen->add_help_tab(array( 'id' => 'fms_resource_help', 'title' => __('资源管理', 'flexible-media-supply'), 'content' => '<p>' . __('资源管理帮助内容...', 'flexible-media-supply') . '</p>' )); } }?> ## 多渠道发布模块 <?php/** 多渠道发布模块 管理内容分发到不同平台 */ class Multi_Channel_Publisher { private $channels = array(); public function __construct() { // 初始化可用渠道 $this->init_channels(); // 添加发布动作 add_action('publish_post', array($this, 'on_post_publish'), 10, 2); // 添加上下文帮助 add_action('load-post.php', array($this, 'add_channel_meta_box')); // 注册REST API端点 add_action('rest_api_init', array($this, 'register_rest_routes')); } /** * 初始化渠道 */ private function init_channels() { $this->channels = array( 'website' => array( 'name' => __('网站', 'flexible-media-supply'), 'description' => __('发布到主网站', 'flexible-media-supply'), 'enabled' => true, 'auto_publish' => true ), 'social_media' => array( 'name' => __('社交媒体', 'flexible-media-supply'), 'description' => __('发布到社交媒体平台', 'flexible-media-supply'), 'enabled' => true, 'auto_publish' => false ), 'newsletter' => array( 'name' => __('新闻邮件', 'flexible-media-supply'), 'description' => __('包含在新闻邮件中', 'flexible-media-supply'), 'enabled' => false, 'auto_publish' => false ), 'third_party' => array( 'name' => __('第三方平台', 'flexible-media-supply'), 'description' => __('分发到合作平台', 'flexible-media-supply'), 'enabled' => false, 'auto_publish' => false ) ); // 允许通过过滤器修改渠道 $this->channels = apply_filters('fms_publishing_channels', $this->channels); } /** * 文章发布时触发多渠道发布 * @param int $post_id 文章ID * @param WP_Post $post 文章对象 */ public function on_post_publish($post_id, $post) { // 检查是否自动发布到其他渠道 $auto_channels = $this->get_auto_publish_channels(); foreach ($auto_channels as $channel_id => $channel) { if ($channel['enabled'] && $channel['auto_publish']) { $this->publish_to_channel($post_id, $channel_id); } } } /** * 发布到指定渠道 * @param int $post_id 文章ID * @param string $channel_id 渠道ID * @return bool 成功与否 */ public function publish_to_channel($post_id, $channel_id) { if (!isset($this->channels[$channel_id]) || !$this->channels[$channel_id]['enabled']) { return false; } $post = get_post($post_id); if (!$post) { return false; } // 根据渠道执行不同的发布逻辑 switch ($channel_id) { case 'website': // 网站发布已在WordPress中处理 $result = true; break; case 'social_media': $result = $this->publish_to_social_media($post); break; case 'newsletter': $result = $this->add_to_newsletter($post); break; case 'third_party': $result = $this->publish_to_third_party($post); break; default: // 允许通过钩子添加自定义渠道 $result = apply_filters('fms_publish_to_channel', false, $post, $channel_id); break; } // 记录发布状态 if ($result) { $this->log_channel_publication($post_id, $channel_id, 'success'); } else { $this->log_channel_publication($post_id, $channel_id, 'failed'); } return $result; } /** * 发布到社交媒体 * @param WP_Post $post 文章对象 * @return bool 成功与否 */ private function publish_to_social_media($post) { // 这里应集成社交媒体API // 简化示例:模拟API调用 $message = $this->prepare_social_media_message($post); // 模拟发布到不同平台 $platforms = array('twitter', 'facebook', 'linkedin'); $success_count = 0; foreach ($platforms as $platform) { // 这里应该是实际的API调用 // $api_result = $this->call_social_media_api($platform, $message); $api_result = true; // 模拟成功 if ($api_result) { $success_count++; $this->log_social_media_post($post->ID, $platform, $message); } } return $success_count > 0; } /** * 准备社交媒体消息 * @param WP_Post $post 文章对象 * @return string 格式化消息 */ private function prepare_social_media_message($post) { $title = wp_strip_all_tags($post->post_title); $excerpt = wp_trim_words(wp_strip_all_tags($post->post_excerpt), 20); $url = get_permalink($post->ID); // 根据不同平台调整消息格式 $message = sprintf( __('新文章发布: %s - %s %s', 'flexible-media-supply'), $title, $excerpt, $url ); // 限制长度(针对Twitter等平台) if (strlen($message) > 280) { $message = substr($message, 0, 277) . '...'; } return $message; } /** * 添加到新闻邮件 * @param WP_Post $post 文章对象 * @return bool 成功与否 */ private function add_to_newsletter($post) { // 这里应集成邮件服务 // 简化示例:添加到待发送队列 $newsletter_queue = get_option('fms_newsletter_queue', array()); $newsletter_queue[] = array( 'post_id' => $post->ID, 'added_time' => current_time('mysql'), 'status' => 'pending' ); update_option('fms_newsletter_queue', $newsletter_queue); return true; } /** * 发布到第三方平台 * @param WP_Post $post 文章对象 * @return bool 成功与否 */ private function publish_to_third_party($post) { // 这里应集成第三方平台API // 简化示例:记录日志 error_log(sprintf( __('文章 "%s" 已排队等待发布到第三方平台', 'flexible-media-supply'), $post->post_title )); return true; } /** * 记录社交媒体发布 * @param int $post_id 文章ID * @param string $platform 平台名称 * @param string $message 发布消息 */ private function log_social_media_post($post_id, $platform, $message) { $social_logs = get_post_meta($post_id, '_fms_social_media_logs', true); if (!is_array($social_logs)) { $social_logs = array(); } $social_logs[] = array( 'platform' => $platform, 'message' => $message, 'time' => current
在当今快速变化的数字媒体环境中,网络传媒机构面临着内容需求波动大、资源分配不均的挑战。柔性供应系统通过动态调整内容生产、分发和资源分配,帮助传媒机构灵活应对市场需求变化。本教程将指导您开发一个WordPress插件,实现基本的柔性供应功能,包括内容自动调度、资源管理和多渠道发布。
在开始开发之前,请确保您已准备好以下环境:
- WordPress 5.0+ 安装
- PHP 7.2+ 运行环境
- MySQL 5.6+ 数据库
- 代码编辑器(如VS Code、PHPStorm)
- 本地开发环境(如XAMPP、MAMP或Local by Flywheel)
首先,我们创建插件的基本目录结构和主文件:
<?php
/**
* 插件名称: 网络传媒柔性供应系统
* 插件URI: https://yourwebsite.com/
* 描述: 实现网络传媒柔性供应的WordPress插件
* 版本: 1.0.0
* 作者: 您的名称
* 作者URI: https://yourwebsite.com/
* 许可证: GPL v2或更高版本
* 文本域: flexible-media-supply
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('FMS_VERSION', '1.0.0');
define('FMS_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('FMS_PLUGIN_URL', plugin_dir_url(__FILE__));
// 初始化插件
class FlexibleMediaSupply {
private static $instance = null;
// 获取单例实例
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
// 构造函数
private function __construct() {
$this->init_hooks();
}
// 初始化钩子
private function init_hooks() {
// 激活/停用钩子
register_activation_hook(__FILE__, array($this, 'activate'));
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
// 管理菜单
add_action('admin_menu', array($this, 'add_admin_menu'));
// 加载文本域
add_action('init', array($this, 'load_textdomain'));
// 初始化功能模块
$this->init_modules();
}
// 激活插件
public function activate() {
// 创建数据库表
$this->create_tables();
// 设置默认选项
$this->set_default_options();
// 刷新重写规则
flush_rewrite_rules();
}
// 停用插件
public function deactivate() {
// 清理临时数据
// 注意:这里不删除数据,以便用户重新激活时保留设置
flush_rewrite_rules();
}
// 加载文本域
public function load_textdomain() {
load_plugin_textdomain(
'flexible-media-supply',
false,
dirname(plugin_basename(__FILE__)) . '/languages/'
);
}
// 添加管理菜单
public function add_admin_menu() {
add_menu_page(
__('柔性供应系统', 'flexible-media-supply'),
__('柔性供应', 'flexible-media-supply'),
'manage_options',
'flexible-media-supply',
array($this, 'render_dashboard'),
'dashicons-schedule',
30
);
// 添加子菜单
add_submenu_page(
'flexible-media-supply',
__('内容调度', 'flexible-media-supply'),
__('内容调度', 'flexible-media-supply'),
'manage_options',
'fms-content-schedule',
array($this, 'render_content_schedule')
);
add_submenu_page(
'flexible-media-supply',
__('资源管理', 'flexible-media-supply'),
__('资源管理', 'flexible-media-supply'),
'manage_options',
'fms-resource-management',
array($this, 'render_resource_management')
);
}
// 初始化模块
private function init_modules() {
// 这里将初始化各个功能模块
require_once FMS_PLUGIN_DIR . 'includes/class-content-scheduler.php';
require_once FMS_PLUGIN_DIR . 'includes/class-resource-manager.php';
require_once FMS_PLUGIN_DIR . 'includes/class-multi-channel-publisher.php';
// 初始化模块实例
new Content_Scheduler();
new Resource_Manager();
new Multi_Channel_Publisher();
}
// 创建数据库表
private function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 内容调度表
$table_name = $wpdb->prefix . 'fms_content_schedule';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id bigint(20) NOT NULL,
schedule_time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
channel varchar(100) NOT NULL,
status varchar(20) DEFAULT 'pending',
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY post_id (post_id),
KEY schedule_time (schedule_time)
) $charset_collate;";
// 资源分配表
$table_name2 = $wpdb->prefix . 'fms_resource_allocation';
$sql2 = "CREATE TABLE IF NOT EXISTS $table_name2 (
id mediumint(9) NOT NULL AUTO_INCREMENT,
resource_type varchar(50) NOT NULL,
resource_id bigint(20) NOT NULL,
allocation_date date NOT NULL,
hours_allocated decimal(5,2) DEFAULT 0.00,
project_id bigint(20),
notes text,
PRIMARY KEY (id),
KEY allocation_date (allocation_date),
KEY resource_type (resource_type)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
dbDelta($sql2);
}
// 设置默认选项
private function set_default_options() {
$default_options = array(
'auto_schedule' => true,
'default_channels' => array('website', 'social_media'),
'max_daily_posts' => 10,
'resource_warning_threshold' => 80,
'notification_email' => get_option('admin_email')
);
add_option('fms_settings', $default_options);
}
// 渲染仪表板
public function render_dashboard() {
?>
<div class="wrap">
<h1><?php echo esc_html__('网络传媒柔性供应系统', 'flexible-media-supply'); ?></h1>
<div class="fms-dashboard">
<div class="fms-stats-container">
<div class="fms-stat-box">
<h3><?php echo esc_html__('今日计划内容', 'flexible-media-supply'); ?></h3>
<p class="stat-number"><?php echo $this->get_today_scheduled_count(); ?></p>
</div>
<div class="fms-stat-box">
<h3><?php echo esc_html__('可用资源', 'flexible-media-supply'); ?></h3>
<p class="stat-number"><?php echo $this->get_available_resources(); ?></p>
</div>
<div class="fms-stat-box">
<h3><?php echo esc_html__('多渠道发布', 'flexible-media-supply'); ?></h3>
<p class="stat-number"><?php echo $this->get_channel_count(); ?></p>
</div>
</div>
</div>
</div>
<?php
}
// 渲染内容调度页面
public function render_content_schedule() {
// 这里将实现内容调度界面
echo '<div class="wrap"><h1>内容调度</h1></div>';
}
// 渲染资源管理页面
public function render_resource_management() {
// 这里将实现资源管理界面
echo '<div class="wrap"><h1>资源管理</h1></div>';
}
// 获取今日计划内容数量
private function get_today_scheduled_count() {
global $wpdb;
$table_name = $wpdb->prefix . 'fms_content_schedule';
$today = current_time('mysql');
$count = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE DATE(schedule_time) = DATE(%s) AND status = 'pending'",
$today
)
);
return $count ? $count : 0;
}
// 获取可用资源
private function get_available_resources() {
// 简化示例,实际应计算实际可用资源
return '85%';
}
// 获取渠道数量
private function get_channel_count() {
$settings = get_option('fms_settings', array());
if (isset($settings['default_channels'])) {
return count($settings['default_channels']);
}
return 0;
}
}
// 初始化插件
FlexibleMediaSupply::get_instance();
?>
内容调度是柔性供应系统的核心功能之一。以下是一个简化的内容调度类:
<?php
/**
* 内容调度模块
* 负责自动和手动安排内容发布时间
*/
class Content_Scheduler {
public function __construct() {
// 添加发布动作钩子
add_action('save_post', array($this, 'schedule_on_save'), 10, 2);
// 添加定时任务检查
add_action('fms_check_scheduled_content', array($this, 'process_scheduled_content'));
// 注册定时任务
if (!wp_next_scheduled('fms_check_scheduled_content')) {
wp_schedule_event(time(), 'hourly', 'fms_check_scheduled_content');
}
// 添加管理列
add_filter('manage_post_posts_columns', array($this, 'add_schedule_column'));
add_action('manage_post_posts_custom_column', array($this, 'render_schedule_column'), 10, 2);
}
/**
* 保存文章时自动调度
* @param int $post_id 文章ID
* @param WP_Post $post 文章对象
*/
public function schedule_on_save($post_id, $post) {
// 检查自动发布权限
if (!current_user_can('edit_post', $post_id) || wp_is_post_revision($post_id)) {
return;
}
// 检查是否启用自动调度
$settings = get_option('fms_settings', array());
if (!isset($settings['auto_schedule']) || !$settings['auto_schedule']) {
return;
}
// 获取文章类型
$post_type = get_post_type($post_id);
// 只处理文章和自定义类型
if (!in_array($post_type, array('post', 'fms_content'))) {
return;
}
// 检查是否已有调度
$existing_schedule = $this->get_post_schedule($post_id);
if (!$existing_schedule && $post->post_status == 'future') {
// 如果文章是定时发布,创建调度记录
$this->create_schedule($post_id, $post->post_date);
}
}
/**
* 创建内容调度
* @param int $post_id 文章ID
* @param string $schedule_time 调度时间
* @param string $channel 发布渠道
* @return bool 成功与否
*/
public function create_schedule($post_id, $schedule_time, $channel = 'website') {
global $wpdb;
$table_name = $wpdb->prefix . 'fms_content_schedule';
$result = $wpdb->insert(
$table_name,
array(
'post_id' => $post_id,
'schedule_time' => $schedule_time,
'channel' => $channel,
'status' => 'pending'
),
array('%d', '%s', '%s', '%s')
);
return $result !== false;
}
/**
* 处理已调度的内容
*/
public function process_scheduled_content() {
global $wpdb;
$table_name = $wpdb->prefix . 'fms_content_schedule';
$current_time = current_time('mysql');
// 获取到期的调度
$scheduled_items = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM $table_name WHERE schedule_time <= %s AND status = 'pending'",
$current_time
)
);
foreach ($scheduled_items as $item) {
// 发布内容
$this->publish_content($item->post_id, $item->channel);
// 更新状态
$wpdb->update(
$table_name,
array('status' => 'published'),
array('id' => $item->id),
array('%s'),
array('%d')
);
}
}
/**
* 发布内容到指定渠道
* @param int $post_id 文章ID
* @param string $channel 发布渠道
*/
private function publish_content($post_id, $channel) {
$post = get_post($post_id);
if (!$post) {
return;
}
// 根据渠道执行不同的发布逻辑
switch ($channel) {
case 'website':
// 更新文章状态为发布
wp_publish_post($post_id);
break;
case 'social_media':
// 发布到社交媒体(简化示例)
$this->publish_to_social_media($post);
break;
// 可以添加更多渠道
}
// 记录发布日志
$this->log_publication($post_id, $channel);
}
/**
* 发布到社交媒体
* @param WP_Post $post 文章对象
*/
private function publish_to_social_media($post) {
// 这里应集成社交媒体API
// 简化示例:记录日志
error_log('发布到社交媒体: ' . $post->post_title);
}
/**
* 记录发布日志
* @param int $post_id 文章ID
* @param string $channel 发布渠道
*/
private function log_publication($post_id, $channel) {
// 这里可以记录详细的发布日志
update_post_meta($post_id, '_fms_last_published', array(
'channel' => $channel,
'time' => current_time('mysql')
));
}
/**
* 获取文章的调度信息
* @param int $post_id 文章ID
* @return object|null 调度信息
*/
private function get_post_schedule($post_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'fms_content_schedule';
return $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM $table_name WHERE post_id = %d AND status = 'pending'",
$post_id
)
);
}
/**
* 添加调度列到文章列表
* @param array $columns 现有列
* @return array 更新后的列
*/
public function add_schedule_column($columns) {
$columns['fms_schedule'] = __('调度状态', 'flexible-media-supply');
return $columns;
}
/**
* 渲染调度列内容
* @param string $column 列名
* @param int $post_id 文章ID
*/
public function render_schedule_column($column, $post_id) {
if ($column === 'fms_schedule') {
$schedule = $this->get_post_schedule($post_id);
if ($schedule) {
echo '<span class="dashicons dashicons-clock" title="'
. esc_attr(sprintf(__('计划于 %s 发布', 'flexible-media-supply'), $schedule->schedule_time))
. '"></span>';
} else {
echo '<span class="dashicons dashicons-minus" title="'
. esc_attr__('未调度', 'flexible-media-supply')
. '"></span>';
}
}
}
}
?>
资源管理是柔性供应系统的另一个关键组成部分:
<?php
/**
* 资源管理模块
* 管理人力、时间和内容资源
*/
class Resource_Manager {
public function __construct() {
// 添加资源管理页面
add_action('admin_init', array($this, 'register_resource_settings'));
// 添加上下文帮助
add_action('load-toplevel_page_flexible-media-supply', array($this, 'add_help_tabs'));
// 资源使用情况短代码
add_shortcode('fms_resource_usage', array($this, 'resource_usage_shortcode'));
}
/**
* 注册资源设置
*/
public function register_resource_settings() {
register_setting('fms_resource_settings', 'fms_resource_allocations');
add_settings_section(
'fms_resource_section',
__('资源分配设置', 'flexible-media-supply'),
array($this, 'render_resource_section'),
'flexible-media-supply'
);
add_settings_field(
'fms_editor_hours',
__('编辑人员工时', 'flexible-media-supply'),
_field'),
'flexible-media-supply',
'fms_resource_section'
);
add_settings_field(
'fms_designer_hours',
__('设计人员工时', 'flexible-media-supply'),
array($this, 'render_designer_hours_field'),
'flexible-media-supply',
'fms_resource_section'
);
}
/**
* 渲染资源部分说明
*/
public function render_resource_section() {
echo '<p>' . __('配置您的团队资源分配,系统将根据这些设置优化内容生产计划。', 'flexible-media-supply') . '</p>';
}
/**
* 渲染编辑工时字段
*/
public function render_editor_hours_field() {
$allocations = get_option('fms_resource_allocations', array());
$editor_hours = isset($allocations['editor_hours']) ? $allocations['editor_hours'] : 40;
echo '<input type="number" name="fms_resource_allocations[editor_hours]" value="' . esc_attr($editor_hours) . '" min="0" max="168" />';
echo '<p class="description">' . __('每周可用编辑工时(小时)', 'flexible-media-supply') . '</p>';
}
/**
* 渲染设计工时字段
*/
public function render_designer_hours_field() {
$allocations = get_option('fms_resource_allocations', array());
$designer_hours = isset($allocations['designer_hours']) ? $allocations['designer_hours'] : 30;
echo '<input type="number" name="fms_resource_allocations[designer_hours]" value="' . esc_attr($designer_hours) . '" min="0" max="168" />';
echo '<p class="description">' . __('每周可用设计工时(小时)', 'flexible-media-supply') . '</p>';
}
/**
* 计算资源使用率
* @param string $resource_type 资源类型
* @param string $period 时间周期
* @return array 使用率数据
*/
public function calculate_resource_usage($resource_type = 'all', $period = 'week') {
global $wpdb;
$table_name = $wpdb->prefix . 'fms_resource_allocation';
$allocations = get_option('fms_resource_allocations', array());
// 计算时间范围
$date_condition = '';
if ($period === 'week') {
$date_condition = "AND allocation_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)";
} elseif ($period === 'month') {
$date_condition = "AND allocation_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)";
}
// 查询已分配的资源
$query = "SELECT resource_type, SUM(hours_allocated) as total_used
FROM $table_name
WHERE 1=1 $date_condition";
if ($resource_type !== 'all') {
$query .= $wpdb->prepare(" AND resource_type = %s", $resource_type);
}
$query .= " GROUP BY resource_type";
$used_resources = $wpdb->get_results($query);
// 计算使用率
$usage_data = array();
foreach ($used_resources as $resource) {
$available_key = $resource->resource_type . '_hours';
$available = isset($allocations[$available_key]) ? $allocations[$available_key] : 0;
if ($available > 0) {
$usage_percentage = ($resource->total_used / $available) * 100;
} else {
$usage_percentage = 0;
}
$usage_data[$resource->resource_type] = array(
'used' => $resource->total_used,
'available' => $available,
'percentage' => round($usage_percentage, 2),
'status' => $usage_percentage > 90 ? 'critical' : ($usage_percentage > 70 ? 'warning' : 'normal')
);
}
return $usage_data;
}
/**
* 分配资源到项目
* @param string $resource_type 资源类型
* @param int $resource_id 资源ID
* @param float $hours 分配工时
* @param string $date 分配日期
* @param int $project_id 项目ID
* @param string $notes 备注
* @return bool 成功与否
*/
public function allocate_resource($resource_type, $resource_id, $hours, $date, $project_id = null, $notes = '') {
global $wpdb;
$table_name = $wpdb->prefix . 'fms_resource_allocation';
// 检查是否超分配
$usage_data = $this->calculate_resource_usage($resource_type, 'week');
$allocations = get_option('fms_resource_allocations', array());
$available_key = $resource_type . '_hours';
$available = isset($allocations[$available_key]) ? $allocations[$available_key] : 0;
$current_used = isset($usage_data[$resource_type]) ? $usage_data[$resource_type]['used'] : 0;
if (($current_used + $hours) > $available) {
// 记录警告但不阻止分配
error_log(sprintf(
__('资源分配警告:%s 类型资源分配超出可用量', 'flexible-media-supply'),
$resource_type
));
}
$result = $wpdb->insert(
$table_name,
array(
'resource_type' => $resource_type,
'resource_id' => $resource_id,
'allocation_date' => $date,
'hours_allocated' => $hours,
'project_id' => $project_id,
'notes' => $notes
),
array('%s', '%d', '%s', '%f', '%d', '%s')
);
return $result !== false;
}
/**
* 资源使用情况短代码
* @param array $atts 短代码属性
* @return string 渲染的HTML
*/
public function resource_usage_shortcode($atts) {
$atts = shortcode_atts(array(
'type' => 'all',
'period' => 'week',
'show_chart' => 'true'
), $atts, 'fms_resource_usage');
$usage_data = $this->calculate_resource_usage($atts['type'], $atts['period']);
if (empty($usage_data)) {
return '<p>' . __('暂无资源使用数据', 'flexible-media-supply') . '</p>';
}
ob_start();
?>
<div class="fms-resource-usage">
<h3><?php echo esc_html__('资源使用情况', 'flexible-media-supply'); ?></h3>
<div class="resource-stats">
<?php foreach ($usage_data as $type => $data): ?>
<div class="resource-stat-item">
<h4><?php echo esc_html($this->get_resource_type_label($type)); ?></h4>
<div class="usage-bar">
<div class="usage-fill" style="width: <?php echo esc_attr(min($data['percentage'], 100)); ?>%;
background-color: <?php echo $this->get_status_color($data['status']); ?>;">
</div>
</div>
<p class="usage-numbers">
<?php printf(
__('已用: %.1f / 可用: %.1f 小时 (%.1f%%)', 'flexible-media-supply'),
$data['used'],
$data['available'],
$data['percentage']
); ?>
</p>
</div>
<?php endforeach; ?>
</div>
</div>
<style>
.fms-resource-usage { margin: 20px 0; }
.resource-stat-item { margin-bottom: 15px; }
.usage-bar {
height: 20px;
background: #f0f0f0;
border-radius: 10px;
overflow: hidden;
margin: 5px 0;
}
.usage-fill {
height: 100%;
transition: width 0.5s ease;
}
.usage-numbers {
font-size: 12px;
color: #666;
margin: 0;
}
</style>
<?php
return ob_get_clean();
}
/**
* 获取资源类型标签
* @param string $type 资源类型
* @return string 标签
*/
private function get_resource_type_label($type) {
$labels = array(
'editor' => __('编辑', 'flexible-media-supply'),
'designer' => __('设计', 'flexible-media-supply'),
'video' => __('视频制作', 'flexible-media-supply'),
'seo' => __('SEO优化', 'flexible-media-supply')
);
return isset($labels[$type]) ? $labels[$type] : $type;
}
/**
* 获取状态颜色
* @param string $status 状态
* @return string 颜色代码
*/
private function get_status_color($status) {
$colors = array(
'normal' => '#4CAF50',
'warning' => '#FF9800',
'critical' => '#F44336'
);
return isset($colors[$status]) ? $colors[$status] : '#4CAF50';
}
/**
* 添加上下文帮助标签
*/
public function add_help_tabs() {
$screen = get_current_screen();
$screen->add_help_tab(array(
'id' => 'fms_resource_help',
'title' => __('资源管理', 'flexible-media-supply'),
'content' => '<p>' . __('资源管理帮助内容...', 'flexible-media-supply') . '</p>'
));
}
}
?>
## 多渠道发布模块
<?php
/**
- 多渠道发布模块
- 管理内容分发到不同平台
*/
class Multi_Channel_Publisher {
private $channels = array();
public function __construct() {
// 初始化可用渠道
$this->init_channels();
// 添加发布动作
add_action('publish_post', array($this, 'on_post_publish'), 10, 2);
// 添加上下文帮助
add_action('load-post.php', array($this, 'add_channel_meta_box'));
// 注册REST API端点
add_action('rest_api_init', array($this, 'register_rest_routes'));
}
/**
* 初始化渠道
*/
private function init_channels() {
$this->channels = array(
'website' => array(
'name' => __('网站', 'flexible-media-supply'),
'description' => __('发布到主网站', 'flexible-media-supply'),
'enabled' => true,
'auto_publish' => true
),
'social_media' => array(
'name' => __('社交媒体', 'flexible-media-supply'),
'description' => __('发布到社交媒体平台', 'flexible-media-supply'),
'enabled' => true,
'auto_publish' => false
),
'newsletter' => array(
'name' => __('新闻邮件', 'flexible-media-supply'),
'description' => __('包含在新闻邮件中', 'flexible-media-supply'),
'enabled' => false,
'auto_publish' => false
),
'third_party' => array(
'name' => __('第三方平台', 'flexible-media-supply'),
'description' => __('分发到合作平台', 'flexible-media-supply'),
'enabled' => false,
'auto_publish' => false
)
);
// 允许通过过滤器修改渠道
$this->channels = apply_filters('fms_publishing_channels', $this->channels);
}
/**
* 文章发布时触发多渠道发布
* @param int $post_id 文章ID
* @param WP_Post $post 文章对象
*/
public function on_post_publish($post_id, $post) {
// 检查是否自动发布到其他渠道
$auto_channels = $this->get_auto_publish_channels();
foreach ($auto_channels as $channel_id => $channel) {
if ($channel['enabled'] && $channel['auto_publish']) {
$this->publish_to_channel($post_id, $channel_id);
}
}
}
/**
* 发布到指定渠道
* @param int $post_id 文章ID
* @param string $channel_id 渠道ID
* @return bool 成功与否
*/
public function publish_to_channel($post_id, $channel_id) {
if (!isset($this->channels[$channel_id]) || !$this->channels[$channel_id]['enabled']) {
return false;
}
$post = get_post($post_id);
if (!$post) {
return false;
}
// 根据渠道执行不同的发布逻辑
switch ($channel_id) {
case 'website':
// 网站发布已在WordPress中处理
$result = true;
break;
case 'social_media':
$result = $this->publish_to_social_media($post);
break;
case 'newsletter':
$result = $this->add_to_newsletter($post);
break;
case 'third_party':
$result = $this->publish_to_third_party($post);
break;
default:
// 允许通过钩子添加自定义渠道
$result = apply_filters('fms_publish_to_channel', false, $post, $channel_id);
break;
}
// 记录发布状态
if ($result) {
$this->log_channel_publication($post_id, $channel_id, 'success');
} else {
$this->log_channel_publication($post_id, $channel_id, 'failed');
}
return $result;
}
/**
* 发布到社交媒体
* @param WP_Post $post 文章对象
* @return bool 成功与否
*/
private function publish_to_social_media($post) {
// 这里应集成社交媒体API
// 简化示例:模拟API调用
$message = $this->prepare_social_media_message($post);
// 模拟发布到不同平台
$platforms = array('twitter', 'facebook', 'linkedin');
$success_count = 0;
foreach ($platforms as $platform) {
// 这里应该是实际的API调用
// $api_result = $this->call_social_media_api($platform, $message);
$api_result = true; // 模拟成功
if ($api_result) {
$success_count++;
$this->log_social_media_post($post->ID, $platform, $message);
}
}
return $success_count > 0;
}
/**
* 准备社交媒体消息
* @param WP_Post $post 文章对象
* @return string 格式化消息
*/
private function prepare_social_media_message($post) {
$title = wp_strip_all_tags($post->post_title);
$excerpt = wp_trim_words(wp_strip_all_tags($post->post_excerpt), 20);
$url = get_permalink($post->ID);
// 根据不同平台调整消息格式
$message = sprintf(
__('新文章发布: %s - %s %s', 'flexible-media-supply'),
$title,
$excerpt,
$url
);
// 限制长度(针对Twitter等平台)
if (strlen($message) > 280) {
$message = substr($message, 0, 277) . '...';
}
return $message;
}
/**
* 添加到新闻邮件
* @param WP_Post $post 文章对象
* @return bool 成功与否
*/
private function add_to_newsletter($post) {
// 这里应集成邮件服务
// 简化示例:添加到待发送队列
$newsletter_queue = get_option('fms_newsletter_queue', array());
$newsletter_queue[] = array(
'post_id' => $post->ID,
'added_time' => current_time('mysql'),
'status' => 'pending'
);
update_option('fms_newsletter_queue', $newsletter_queue);
return true;
}
/**
* 发布到第三方平台
* @param WP_Post $post 文章对象
* @return bool 成功与否
*/
private function publish_to_third_party($post) {
// 这里应集成第三方平台API
// 简化示例:记录日志
error_log(sprintf(
__('文章 "%s" 已排队等待发布到第三方平台', 'flexible-media-supply'),
$post->post_title
));
return true;
}
/**
* 记录社交媒体发布
* @param int $post_id 文章ID
* @param string $platform 平台名称
* @param string $message 发布消息
*/
private function log_social_media_post($post_id, $platform, $message) {
$social_logs = get_post_meta($post_id, '_fms_social_media_logs', true);
if (!is_array($social_logs)) {
$social_logs = array();
}
$social_logs[] = array(
'platform' => $platform,
'message' => $message,
'time' => current


