将 IPFS 分布式文件系统集成到 WordPress

下面给出的插件代码,帮助你实现将 IPFS 分布式文件系统集成到 WordPress,并实现文件分享和图床功能。该插件实现的核心功能包括:

  1. 在文章编辑页面添加侧边栏元数据输入框
    允许用户输入 IPFS 的 CID(例如 QmNvT9MEHZCvLcJGHc763Jw5unKVNb7b1FHRHrD7uwNVfT)和文件名(例如 xxxx.pdf)。
  2. 保存输入的元数据
    使用 save_post 钩子保存用户输入的 CID 和文件名。
  3. 前端展示文件链接
    当文章中包含了 IPFS 配置元数据时,自动在文章内容或指定位置输出分享链接,链接的格式为: https://www.dreamlink.cloud/explorer?cid=CID值&name=文件名

你可以根据下面的代码自定义和扩展更多功能。


插件代码示例

将下面代码保存为 ipfs-integration.php 并放在 WordPress 的插件目录 wp-content/plugins/ipfs-integration/ 下,然后在后台激活即可使用。

<?php
/*
Plugin Name: IPFS分布式文件分享与图床插件
Description: 将IPFS分布式文件系统集成到WordPress,并提供分布式文件分享和图床功能。在文章编辑时,可输入IPFS的CID和文件名,生成对应的分享链接。
Version: 1.0
Author: Steper
*/

// 防止直接访问
if ( ! defined( 'ABSPATH' ) ) exit;

/**
 * 在文章编辑页面添加一个侧边栏元数据框,用于输入IPFS CID和文件名
 */
function ipfs_add_meta_box() {
    add_meta_box(
        'ipfs_meta_box',           // Unique ID
        'IPFS 配置',               // Title
        'ipfs_meta_box_callback',  // Callback function
        'post',                    // Screen: 这里设置为 post 类型,如果需要支持其他类型,请调整
        'side',                    // Context
        'default'                  // Priority
    );
}
add_action( 'add_meta_boxes', 'ipfs_add_meta_box' );

/**
 * 渲染元数据框内容
 *
 * @param WP_Post $post 当前文章对象
 */
function ipfs_meta_box_callback( $post ) {
    // 添加安全字段,防止CSRF攻击
    wp_nonce_field( 'ipfs_save_meta_box_data', 'ipfs_meta_box_nonce' );

    // 获取现有值(如果有的话)
    $ipfs_cid       = get_post_meta( $post->ID, '_ipfs_cid', true );
    $ipfs_filename  = get_post_meta( $post->ID, '_ipfs_filename', true );
    ?>
    <p>
        <label for="ipfs_cid"><strong>IPFS CID地址</strong></label><br>
        <input type="text" id="ipfs_cid" name="ipfs_cid" value="<?php echo esc_attr( $ipfs_cid ); ?>" style="width: 100%;" placeholder="例如:QmNvT9MEHZCvLcJGHc763Jw5unKVNb7b1FHRHrD7uwNVfT">
    </p>
    <p>
        <label for="ipfs_filename"><strong>文件名</strong></label><br>
        <input type="text" id="ipfs_filename" name="ipfs_filename" value="<?php echo esc_attr( $ipfs_filename ); ?>" style="width: 100%;" placeholder="例如:xxxx.pdf">
    </p>
    <?php
}

/**
 * 保存元数据框中输入的数据
 *
 * @param int $post_id 文章ID
 */
function ipfs_save_meta_box_data( $post_id ) {

    // 检查 nonce 是否设置
    if ( ! isset( $_POST['ipfs_meta_box_nonce'] ) ) {
        return;
    }
    // 校验 nonce 有效性
    if ( ! wp_verify_nonce( $_POST['ipfs_meta_box_nonce'], 'ipfs_save_meta_box_data' ) ) {
        return;
    }
    // 如果是自动保存,直接返回
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }
    // 检查用户权限
    if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {
        if ( ! current_user_can( 'edit_page', $post_id ) ) {
            return;
        }
    } else {
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return;
        }
    }

    // 存储或更新IPFS CID
    if ( isset( $_POST['ipfs_cid'] ) ) {
        $ipfs_cid = sanitize_text_field( $_POST['ipfs_cid'] );
        update_post_meta( $post_id, '_ipfs_cid', $ipfs_cid );
    }

    // 存储或更新文件名
    if ( isset( $_POST['ipfs_filename'] ) ) {
        $ipfs_filename = sanitize_text_field( $_POST['ipfs_filename'] );
        update_post_meta( $post_id, '_ipfs_filename', $ipfs_filename );
    }
}
add_action( 'save_post', 'ipfs_save_meta_box_data' );

/**
 * 在文章内容前/后追加生成的IPFS分享链接
 *
 * 这里我们通过过滤器输出IPFS链接,你也可以灵活调整位置和展示方式或者使用短代码
 */
function ipfs_append_share_link( $content ) {
    if ( is_singular( 'post' ) ) {
        global $post;
        $ipfs_cid      = get_post_meta( $post->ID, '_ipfs_cid', true );
        $ipfs_filename = get_post_meta( $post->ID, '_ipfs_filename', true );

        if ( ! empty( $ipfs_cid ) && ! empty( $ipfs_filename ) ) {
            $url  = "https://www.dreamlink.cloud/explorer?cid=" . urlencode( $ipfs_cid ) . "&name=" . urlencode( $ipfs_filename );
            $link_html = '<div class="ipfs-share-link" style="margin-top:20px; padding:10px; border:1px solid #ddd;">';
            $link_html .= '<strong>IPFS文件分享链接: </strong><a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $url ) . '</a>';
            $link_html .= '</div>';
            // 这里我们选择将分享链接追加到文章末尾
            $content .= $link_html;
        }
    }
    return $content;
}
add_filter( 'the_content', 'ipfs_append_share_link' );

/**
 * 添加短代码,用于在文章任意位置显示IPFS分享链接
 *
 * 使用方式: [ipfs_share_link]
 */
function ipfs_share_link_shortcode() {
    global $post;
    $ipfs_cid      = get_post_meta( $post->ID, '_ipfs_cid', true );
    $ipfs_filename = get_post_meta( $post->ID, '_ipfs_filename', true );
    if ( ! empty( $ipfs_cid ) && ! empty( $ipfs_filename ) ) {
        $url  = "https://www.dreamlink.cloud/explorer?cid=" . urlencode( $ipfs_cid ) . "&name=" . urlencode( $ipfs_filename );
        return '<div class="ipfs-share-link" style="padding:10px; border:1px solid #ddd;"><strong>IPFS文件分享链接: </strong><a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $url ) . '</a></div>';
    }
    return '';
}
add_shortcode( 'ipfs_share_link', 'ipfs_share_link_shortcode' );

使用说明

  1. 安装和激活插件
    • 将上述代码保存为 ipfs-integration.php,放入 wp-content/plugins/ipfs-integration 文件夹中。
    • 进入 WordPress 后台 → 插件菜单,启用 IPFS分布式文件分享与图床插件
  2. 配置文章中的IPFS链接
    • 打开或创建一个文章,在右侧边栏会看到 「IPFS 配置」 元数据框。
    • 在输入框中填入 IPFS 的 CID(例如 QmNvT9MEHZCvLcJGHc763Jw5unKVNb7b1FHRHrD7uwNVfT)和对应的文件名(例如 xxxx.pdf)。
    • 保存或更新文章。
  3. 前端效果展示
    • 每当展示文章内容时,页面会在文章底部自动追加一个分享链接,链接形如: https://www.dreamlink.cloud/explorer?cid=QmNvT9MEHZCvLcJGHc763Jw5unKVNb7b1FHRHrD7uwNVfT&name=xxxx.pdf
    • 你也可以在文章中任意位置使用 [ipfs_share_link] 短代码来显示该链接。
  4. 扩展和自定义
    • 可根据需要调整展示位置、样式或增加其他功能;
    • 如需要在媒体库中显示分布式图片效果,可进一步扩展。

这个示例插件提供了一个基本实现,你可以根据业务需求进一步扩展功能和样式。

发表评论

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网 🐾 DeepracticeX 社区 🐾 老薛主机 🐾