WordPress 开发知识

以下是一篇详细的 WordPress 入门到精通指南,旨在帮助新手从零开始,逐步理解和掌握 WordPress 的使用和开发。

目录

  1. 简介
  2. 初步设置
    • 购买域名和托管
    • 安装 WordPress
  3. 基本操作
    • 登录和仪表盘简介
    • 创建和管理内容
  4. 主题和外观
    • 选择和安装主题
    • 自定义主题
  5. 插件
    • 安装和管理插件
    • 推荐插件
  6. 用户管理和角色
  7. 安全性和备份
  8. 性能优化
  9. 高级开发
    • 创建自定义主题
    • 开发插件
  10. 部署和维护

简介

WordPress 是一个开源的内容管理系统 (CMS),广泛用于创建博客、企业网站、电子商务网站等。它以其易用性和灵活性著称,支持丰富的主题和插件扩展,能够满足各种网站需求。

初步设置

购买域名和托管

  1. 选择域名:选择一个简短易记的域名,并在域名注册商(如 GoDaddy、Namecheap)购买。
  2. 选择托管服务:选择一个可靠的托管服务提供商(如 Bluehost、SiteGround、WP Engine),并购买适合你需求的托管计划。

安装 WordPress

  1. 通过托管服务一键安装:大多数托管服务提供商提供一键安装 WordPress 的选项。
  2. 手动安装
    • 下载 WordPress 安装包:WordPress.org
    • 使用 FTP 客户端(如 FileZilla)上传文件到服务器。
    • 创建数据库和用户。
    • 运行安装脚本,完成设置。

基本操作

登录和仪表盘简介

  • 通过 http://yourdomain.com/wp-admin 访问登录页面。
  • 登录后,进入仪表盘(Dashboard),这里是管理网站的中心。

创建和管理内容

  • 文章 (Posts):适合博客内容。
    • 创建新文章:文章 -> 写文章
    • 分类和标签管理:文章 -> 分类 和 标签
  • 页面 (Pages):适合静态内容,如“关于我们”、“联系我们”。
    • 创建新页面:页面 -> 新建页面

主题和外观

选择和安装主题

  • 安装免费主题
    • 外观 -> 主题 -> 添加
    • 浏览并安装喜欢的主题
  • 安装付费主题
    • 从第三方市场(如 ThemeForest)购买并下载主题包。
    • 上传主题包:外观 -> 主题 -> 添加 -> 上传主题

自定义主题

  • 使用 WordPress 自带的自定义工具:外观 -> 自定义
  • 调整站点标题、颜色、菜单、部件等。

插件

安装和管理插件

  • 安装插件
    • 插件 -> 安装插件
    • 搜索、安装并激活所需插件
  • 管理插件
    • 插件 -> 已安装的插件
    • 激活、停用或删除插件

推荐插件

  1. Yoast SEO:优化网站 SEO。
  2. WooCommerce:创建电子商务网站。
  3. Contact Form 7:创建联系表单。
  4. Akismet:防止垃圾评论。
  5. WP Super Cache:提高网站速度。

用户管理和角色

  • 添加新用户用户 -> 新建用户
  • 用户角色
    • 管理员 (Administrator)
    • 编辑 (Editor)
    • 作者 (Author)
    • 投稿者 (Contributor)
    • 订阅者 (Subscriber)

安全性和备份

  • 安全插件
    • Wordfence Security
    • iThemes Security

一些常见的wordpress技术处理:

一.  在开发 WordPress 插件时,如何有效地使用 WordPress 钩子(Actions 和 Filters)来扩展功能?

在开发 WordPress 插件时,熟练使用 WordPress 钩子(Actions 和 Filters)是扩展功能的关键。钩子允许你在特定的点上插入自定义代码,而不需要修改核心文件。以下是如何有效使用这些钩子的方法:

1. 理解 WordPress 钩子的基本概念

  • Actions:允许你在 WordPress 执行一个特定操作时运行你的代码。例如,在页面加载完成后、文章发布时等。
  • Filters:允许你在 WordPress 数据输出之前对数据进行修改。例如,修改文章内容、标题等。

2. 使用 Actions 扩展功能

Actions 通过 add_action 函数来定义。以下是一个基本示例:

// 在 WordPress 初始化时执行自定义函数
add_action('init', 'my_custom_init_function');

function my_custom_init_function() {
    // 你的自定义代码
    // 例如,注册一个自定义文章类型
    register_post_type('my_custom_post_type', [
        'label' => 'My Custom Post Type',
        'public' => true,
        'supports' => ['title', 'editor', 'thumbnail'],
    ]);
}

3. 使用 Filters 修改数据

Filters 通过 add_filter 函数来定义。以下是一个基本示例:

// 修改文章标题
add_filter('the_title', 'my_custom_title_filter');

function my_custom_title_filter($title) {
    // 你的自定义代码
    // 例如,添加前缀到文章标题
    return 'Prefix: ' . $title;
}

4. 查找适合的钩子

WordPress 提供了大量的钩子,基本上覆盖了所有可能的操作和数据处理。你可以在 WordPress Codex 或者 WordPress Developer Handbook 中查找你需要的钩子。

5. 创建自定义钩子

在你的插件中创建自定义钩子,可以让其他开发者扩展你的插件功能。例如:

// 定义一个自定义 action
do_action('my_custom_action');

// 在其他地方钩住这个自定义 action
add_action('my_custom_action', 'my_custom_action_handler');

function my_custom_action_handler() {
    // 处理函数逻辑
}

6. 优化钩子的使用

  • 避免重复代码:将钩子的处理逻辑封装在函数中,并在适当的地方调用。
  • 优先级add_action 和 add_filter 有一个可选的优先级参数,默认为 10。通过调整优先级,可以控制钩子执行的顺序。
// 优先级为 15 的 action
add_action('init', 'my_custom_init_function', 15);

7. 实战示例

假设你要在每篇文章的内容后添加一个广告代码,可以使用 the_content 过滤器:

add_filter('the_content', 'add_ad_to_content');

function add_ad_to_content($content) {
    if (is_single()) {
        // 你的广告代码
        $ad_code = '<div class="my-ad">This is an ad.</div>';
        $content .= $ad_code;
    }
    return $content;
}

结论

通过有效地使用 WordPress 钩子,可以在不修改核心代码的情况下扩展 WordPress 的功能。关键在于理解 Actions 和 Filters 的机制,找到合适的钩子,并编写简洁且有效的处理函数。持续学习和实践能够帮助你更好地掌握和应用这些技术。

二. 开发 WordPress 插件时的常见最佳实践

        遵循这些可以确保你的插件代码质量高、性能好、易于维护和扩展。以下是一些常见的最佳实践:

1. 遵循编码标准

  • WordPress Coding Standards:遵循 WordPress PHP Coding Standards。这包括文件组织、命名约定、代码格式等。
  • 代码注释:使用清晰的注释和文档,使代码易于理解和维护。

2. 避免命名冲突

  • 前缀:为函数、类、变量等添加唯一前缀,避免与其他插件或主题冲突。例如,使用 myplugin_ 作为前缀。
  • 命名空间:在 PHP 5.3 及以上版本中使用命名空间来组织代码,进一步减少冲突的可能。

3. 使用适当的文件结构

  • 文件组织:将不同功能的代码分离到不同的文件中。例如,将短代码、钩子、设置页面等各自放在独立的文件中。
  • 主文件:在插件的主文件中包含插件的元数据,并引导其他文件。
/*
Plugin Name: My Custom Plugin
Description: This is a custom plugin.
Version: 1.0
Author: Your Name
*/

// 包含其他文件
include_once plugin_dir_path(__FILE__) . 'includes/my-custom-functions.php';
include_once plugin_dir_path(__FILE__) . 'includes/my-custom-hooks.php';

4. 使用钩子

  • Actions 和 Filters:尽量使用 WordPress 提供的 Actions 和 Filters 来扩展功能,而不是直接修改 WordPress 核心。
  • 自定义钩子:为你的插件添加自定义钩子,使其更具可扩展性。

5. 安全性

  • 数据验证和消毒:对所有输入数据进行验证和消毒,防止 XSS 和 SQL 注入攻击。
// 验证和消毒示例
$sanitized_input = sanitize_text_field($_POST['user_input']);
  • 权限检查:在执行敏感操作前检查用户权限。
// 权限检查示例
if (current_user_can('manage_options')) {
    // 执行管理员操作
}

6. 使用 WordPress 提供的 API

  • Settings API:使用 Settings API 创建和管理插件的设置页面。
  • Options API:使用 Options API 存储和检索插件设置。
  • Shortcode API:使用 Shortcode API 创建短代码。

7. 本地化和国际化

  • 翻译准备:确保插件的所有文本都可以被翻译。使用 __() 和 _e() 函数包裹字符串。
// 本地化示例
_e('Hello, World!', 'my-plugin-textdomain');
  • 加载文本域:在插件初始化时加载文本域。

// 加载文本域
function myplugin_load_textdomain() {
    load_plugin_textdomain('my-plugin-textdomain', false, basename(dirname(__FILE__)) . '/languages');
}
add_action('plugins_loaded', 'myplugin_load_textdomain');

8. 优化性能

  • 尽量减少数据库查询:缓存结果,减少不必要的数据库查询。
  • 使用合适的数据结构:选择最适合的数据库表和数据存储方式,提高查询效率。

9. 提供卸载功能

  • 清理数据:在插件卸载时清理所有设置和数据,保持数据库干净。

// 插件卸载钩子
register_uninstall_hook(__FILE__, 'myplugin_uninstall');

function myplugin_uninstall() {
    // 删除插件设置
    delete_option('myplugin_settings');
}

10. 测试和调试

  • 测试环境:在开发和测试插件时,使用本地或测试服务器,而不是直接在生产环境中进行。
  • 调试工具:使用调试工具,如 WP_DEBUGQuery Monitor 插件等,帮助发现和解决问题。

三.分享一些在 WordPress 插件开发过程中遇到的常见挑战及解决方案

开发 WordPress 插件时可能会遇到各种挑战。以下是一些常见挑战及其解决方案:

1. 命名冲突

挑战:插件中的函数、类或变量名称可能与其他插件或主题中的名称冲突,导致功能异常或崩溃。

解决方案

  • 使用前缀:为所有函数、类和变量添加唯一前缀。
function myplugin_custom_function() {
    // Function code here
}
  • 使用命名空间(适用于 PHP 5.3 及以上版本):
namespace MyPlugin;

class CustomClass {
    // Class code here
}

2. 数据验证和安全

挑战:处理用户输入时,可能会引入安全漏洞,如 XSS、SQL 注入等。

解决方案

  • 验证和消毒:对所有用户输入的数据进行验证和消毒。
$sanitized_input = sanitize_text_field($_POST['user_input']);
  • 使用准备好的语句:使用 WordPress 提供的数据库接口(如 $wpdb)防止 SQL 注入。
global $wpdb;
$wpdb->insert(
    $wpdb->prefix . 'my_table',
    array(
        'column_name' => sanitize_text_field($_POST['column_value']),
    )
);

3. 权限管理

挑战:确保只有具备适当权限的用户可以执行某些操作。

解决方案

  • 检查用户权限:在执行敏感操作前检查用户权限。
if (current_user_can('manage_options')) {
    // Perform admin-specific task
}

4. 兼容性问题

挑战:插件可能与其他插件、主题或 WordPress 版本不兼容。

解决方案

  • 版本检测:在插件激活时检测 WordPress 版本和其他依赖项。
function myplugin_activate() {
    global $wp_version;
    if (version_compare($wp_version, '5.0', '<')) {
        deactivate_plugins(plugin_basename(__FILE__));
        wp_die('This plugin requires WordPress version 5.0 or higher.');
    }
}
register_activation_hook(__FILE__, 'myplugin_activate');
  • 使用钩子和过滤器:尽量通过钩子和过滤器与其他代码交互,而不是直接修改核心文件。

5. 性能优化

挑战:插件可能会导致网站加载变慢或消耗过多服务器资源。

解决方案

  • 缓存:缓存频繁使用的结果,减少数据库查询次数。
$cached_data = get_transient('myplugin_cached_data');
if (false === $cached_data) {
    // Perform database query or other time-consuming operation
    $cached_data = 'Expensive Data';
    set_transient('myplugin_cached_data', $cached_data, 12 * HOUR_IN_SECONDS);
}
  • 优化查询:确保数据库查询高效,使用适当的索引和查询优化技术。

6. 本地化和国际化

挑战:确保插件支持多语言,便于国际化。

解决方案

  • 使用翻译函数:所有输出到用户界面的文本都应使用 __() 或 _e() 函数。
_e('Hello, World!', 'my-plugin-textdomain');
  • 加载文本域:在插件初始化时加载文本域。
function myplugin_load_textdomain() {
    load_plugin_textdomain('my-plugin-textdomain', false, basename(dirname(__FILE__)) . '/languages');
}
add_action('plugins_loaded', 'myplugin_load_textdomain');

7. 提供良好的用户界面

挑战:确保插件的管理界面用户友好且易于使用。

解决方案

  • 使用 WordPress UI 元素:利用 WordPress 提供的 UI 元素和样式,使界面和 WordPress 后台一致。
function myplugin_settings_page() {
    ?>
    <div class="wrap">
        <h1><?php _e('My Plugin Settings', 'my-plugin-textdomain'); ?></h1>
        <form method="post" action="options.php">
            <?php
                settings_fields('myplugin_options_group');
                do_settings_sections('myplugin');
                submit_button();
            ?>
        </form>
    </div>
    <?php
}
  • 使用 Settings API:创建和管理设置页面。
function myplugin_register_settings() {
    register_setting('myplugin_options_group', 'myplugin_option

四.插件开发过程中遇到任何性能问题的经验?如何优化插件性能?

优化插件性能不仅能提高用户体验,还能减少服务器负载。

以下是一些遇到的性能问题及其优化方案:

1. 高频数据库查询

问题:频繁且不必要的数据库查询会导致页面加载变慢,增加服务器负载。

解决方案

  • 数据库查询优化:优化 SQL 查询,确保只查询必要的数据,并使用适当的索引。

global $wpdb;
$results = $wpdb->get_results("
    SELECT id, name
    FROM {$wpdb->prefix}my_table
    WHERE status = 'active'
    ORDER BY created_at DESC
    LIMIT 10
");
  • 缓存:使用 WordPress 内置的缓存机制(如 transients)或外部缓存插件减少数据库查询次数。

function myplugin_get_cached_data() {
    $cached_data = get_transient('myplugin_cached_data');
    if (false === $cached_data) {
        // Expensive operation
        global $wpdb;
        $cached_data = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}my_table");
        set_transient('myplugin_cached_data', $cached_data, 12 * HOUR_IN_SECONDS);
    }
    return $cached_data;
}

2. 大量数据处理

问题:在短时间内处理大量数据会导致服务器负载过高,甚至导致超时。

解决方案

  • 分页和分段处理:将大数据处理任务分成小段批量处理。

function myplugin_process_data_in_batches($batch_size = 100) {
    global $wpdb;
    $offset = 0;
    $total = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}my_table");
    
    while ($offset < $total) {
        $results = $wpdb->get_results($wpdb->prepare("
            SELECT * FROM {$wpdb->prefix}my_table
            LIMIT %d OFFSET %d
        ", $batch_size, $offset));

        foreach ($results as $row) {
            // Process each row
        }

        $offset += $batch_size;
    }
}

3. 不必要的资源加载

问题:在前端页面加载不必要的脚本和样式会增加页面加载时间。

解决方案

  • 条件加载资源:只在必要时加载插件的资源文件。

function myplugin_enqueue_scripts() {
    if (is_page('special-page')) {
        wp_enqueue_style('myplugin-style', plugins_url('css/style.css', __FILE__));
        wp_enqueue_script('myplugin-script', plugins_url('js/script.js', __FILE__), array('jquery'), null, true);
    }
}
add_action('wp_enqueue_scripts', 'myplugin_enqueue_scripts');

4. 后台任务处理

问题:在前端页面请求中处理耗时任务会导致页面加载缓慢。

解决方案

  • 使用 WP Cron:将耗时任务移至后台处理,避免影响前端性能。

// Schedule a cron event
if (!wp_next_scheduled('myplugin_cron_event')) {
    wp_schedule_event(time(), 'hourly', 'myplugin_cron_event');
}

// Hook into the cron event
add_action('myplugin_cron_event', 'myplugin_cron_task');

function myplugin_cron_task() {
    // Perform the task
}

5. 高效使用 WordPress API

问题:忽略或错误使用 WordPress API 可能导致性能问题。

解决方案

  • 使用适当的 API:利用 WordPress 提供的 API,如 Transients API、Options API、WP REST API 等,确保高效和安全的操作。

// 使用 Transients API 缓存数据
function myplugin_get_data() {
    $data = get_transient('myplugin_data');
    if (false === $data) {
        // Fetch fresh data
        $data = 'Expensive Data';
        set_transient('myplugin_data', $data, 12 * HOUR_IN_SECONDS);
    }
    return $data;
}

6. 减少插件冲突

问题:多个插件同时运行可能会引起性能问题和冲突。

解决方案

  • 前缀和命名空间:为插件的所有函数、类、变量添加唯一前缀或使用命名空间,避免冲突。
  • 避免全局变量:尽量避免使用全局变量,改用类属性或函数参数。

7. 监控

8. 使用对象缓存

问题:每次请求都重新计算数据或查询数据库会影响性能。

解决方案

  • 对象缓存:利用 WordPress 的对象缓存机制,确保数据在同一个请求中不会被重复计算或查询。

function myplugin_get_expensive_data() {
    global $wpdb;

    $cache_key = 'myplugin_expensive_data';
    $data = wp_cache_get($cache_key);

    if (false === $data) {
        // Perform the expensive operation
        $data = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}my_table");
        wp_cache_set($cache_key, $data);
    }

    return $data;
}

9. 选择合适的数据存储方式

问题:不正确的数据存储方式可能导致性能问题。

解决方案

  • 选择合适的数据存储方式:根据需求选择合适的数据存储方式。例如,使用 WordPress 的 Options API 存储简单设置,使用自定义数据库表存储大量或复杂的数据。

// 使用 Options API 存储简单设置
update_option('myplugin_option', $value);

// 使用自定义数据库表存储复杂数据
global $wpdb;
$wpdb->insert(
    $wpdb->prefix . 'my_custom_table',
    array(
        'column1' => $value1,
        'column2' => $value2,
    )
);

10. 高效处理 AJAX 请求

问题:过多的 AJAX 请求会影响服务器性能。

解决方案

  • 优化 AJAX 请求:减少不必要的 AJAX 请求,合并请求,确保服务器能高效处理。

// 注册 AJAX 处理函数
add_action('wp_ajax_myplugin_action', 'myplugin_ajax_handler');
add_action('wp_ajax_nopriv_myplugin_action', 'myplugin_ajax_handler');

function myplugin_ajax_handler() {
    // 检查权限和验证
    check_ajax_referer('myplugin_nonce', 'nonce');

    // 处理请求
    $response = array('message' => 'Success');
    wp_send_json_success($response);
}

11. 避免全局变量和函数

问题:全局变量和函数可能导致命名冲突和性能问题。

解决方案

  • 使用类和命名空间:将代码组织到类和命名空间中,避免全局命名空间污染。

namespace MyPlugin;

class Main {
    public function __construct() {
        // 初始化代码
    }

    public function run() {
        // 运行插件
    }
}

$plugin = new Main();
$plugin->run();

12. 使用异步任务处理

问题:长时间运行的任务会导致页面加载缓慢或超时。

解决方案

  • 异步处理:使用后台或异步处理任务,避免影响用户体验。

// 使用 WP Background Processing 库
require_once 'path/to/wp-background-processing.php';

class MyPlugin_Process extends WP_Background_Process {
    protected $action = 'myplugin_process';

    protected function task($item) {
        // 执行单个任务
        return false; // Return false to indicate the task is complete
    }
}

$process = new MyPlugin_Process();
$process->push_to_queue($item)->save()->dispatch();

13. 减少 HTTP 请求

过多的 HTTP 请求会增加页面加载时间。

解决方案

  • 合并和最小化资源:合并和最小化 CSS 和 JavaScript 文件,减少 HTTP 请求数量。

function myplugin_enqueue_scripts() {
    wp_enqueue_style('myplugin-style', plugins_url('css/style.min.css', __FILE__));
    wp_enqueue_script('myplugin-script', plugins_url('js/script.min.js', __FILE__), array('jquery'), null, true);
}
add_action('wp_enqueue_scripts', 'myplugin_enqueue_scripts');

14. 使用高效的加载机制

    加载不必要的资源会影响性能。

    解决方案

  • 延迟加载和条件加载:只在需要时加载资源,提高页面加载速度。

function myplugin_enqueue_scripts() {
    if (is_page('specific-page')) {
        wp_enqueue_style('myplugin-style', plugins_url('css/style.css', __FILE__));
        wp_enqueue_script('myplugin-script', plugins_url('js/script.js', __FILE__), array('jquery'), null, true);
    }
}
add


 

WordPress 插件的版本更新和发布流程

1. 使用版本控制系统

建议:使用 Git 等版本控制系统来管理代码。

  • 版本控制系统:使用 Git 来管理代码的不同版本,跟踪更改和协作开发。
  • 远程仓库:使用 GitHub、GitLab 或 Bitbucket 来存储代码,并便于协作和代码审查。

# 初始化 Git 仓库
git init
# 添加远程仓库
git remote add origin https://github.com/yourusername/your-plugin.git
# 提交更改
git add .
git commit -m "Initial commit"
# 推送到远程仓库
git push origin master

2. 遵循语义化版本号

        遵循语义化版本号(Semantic Versioning),以便清晰地传达版本变化的影响。

  • 语义化版本号
    • 主版本号 (Major): 重大变更,可能不向后兼容。
    • 次版本号 (Minor): 新功能,向后兼容。
    • 修订号 (Patch): 小修复,向后兼容。

MAJOR.MINOR.PATCH

3. 自动化构建和测试

        使用自动化工具来构建和测试插件。

  • 构建工具:使用 Grunt、Gulp 或 Webpack 自动化构建任务,如代码压缩、CSS 预处理等。
  • 持续集成:使用 Travis CI、GitHub Actions 或 GitLab CI 自动化测试和部署流程。

# GitHub Actions 示例
name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '7.4'
    - name: Install dependencies
      run: composer install
    - name: Run tests
      run: vendor/bin/phpunit

4. 更新日志和发布说明

        维护详细的更新日志(Changelog),记录每个版本的更改内容。

  • Changelog 文件:在项目根目录下创建 CHANGELOG.md 文件,记录每次发布的更改内容。

# Changelog

## [1.2.0] - 2024-06-11
### Added
- 新增了一个功能

### Fixed
- 修复了一个 bug

## [1.1.1] - 2024-05-01
### Fixed
- 修复了一个重大安全漏洞

5. 版本发布流程

        定义清晰的版本发布流程,确保每次发布的质量。

  • 开发分支和发布分支:使用 Git 分支策略,如 main 分支用于发布,develop 分支用于开发。
  • 发布标签:在每次发布时创建 Git 标签。
# 创建发布标签
git tag -a v1.2.0 -m "Release version 1.2.0"
git push origin v1.2.0

6. 管理插件目录

        利用 WordPress 插件目录发布和更新插件。

  • SVN 仓库:如果你在 WordPress 插件目录发布插件,需要使用 SVN 来管理。
# 检出 SVN 仓库
svn co https://plugins.svn.wordpress.org/your-plugin-name/
# 添加新版本
svn add trunk/* --force
# 提交更改
svn commit -m "Release version 1.2.0"

7. 用户反馈和支持

        收集用户反馈,及时修复问题和发布更新。

  • 支持渠道:提供明确的支持渠道,如支持论坛、电子邮件或 GitHub Issues。
  • 反馈机制:利用插件内的反馈机制,收集用户的意见和建议。

8. 文档和教程

        提供详细的文档和教程,帮助用户理解和使用插件。

  • README 文件:在项目根目录下创建 README.md 文件,提供安装、使用
  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值