如何更改WordPress附件URL并对其进行保护?

时间:2015-01-19 作者:rainysia

我被一件事弄糊涂了,因为WordPress附件URL是直接查看和下载的,我想隐藏它并通过一个文件进行传输,这样我就可以为这个文件添加一些控件。如果我使用名为用户访问管理器(UAM)的插件来控制所有页面/帖子访问。

e、 g:

http://wordpressxxx.com/private-one/wp-content/uploads/sites/6/2015/01/GCC-manual.pdf
转移至

http://wordpressxxx.com/private-one/download.php?id=xxx
(private one是wordpress network多站点之一。)

我查询手册,似乎我应该在文件数据插入数据库时更改附件数据。因为页面/帖子是直接插入附件数据库的。当一个页面具有已发布的附件时,无法再次更改附件URL,因为它已写入数据库。

我使用add_filter 在我的插件中wp_insert_attachmentwp_insert_attachment_data, 但我无法获取附件帖子数据,因此无法修改它。

以下是我假定的步骤:

添加新媒体时更改附件发布数据值,key是attachment\\u id,value是可以在中使用的唯一idhttp://wordpressxxx.com/private-one/download.php?id=您对此有何想法?

1 个回复
SO网友:rainysia

我已经想出了一个解决办法,这是我的答案

1、我们不能修改Wordpress原始数据输入,但可以修改和重写输出。因此,我们可以使用\\u内容wp\\u get\\u attachment\\u url来更改此内容。

将此代码片段添加到插件中

    if (function_exists(\'add_filter\')) {

        add_filter(\'the_content\', array($scplugin, \'AttachmentRewrite\'), 10, 1);
        add_filter(\'wp_get_attachment_url\', array($scplugin, \'AttachmentUrlRewrite\'), 10, 1);
    }
“$scplugin”是我的插件类\\u content“过滤器将把“the content”字符串传递到“AttachmentrWrite”函数中。“wp\\u get\\u attachment\\u url”也是如此,但它将传递url字符串。

然后我们可以通过regex修改和重写内容url链接。

以下是AttachmentrWrite函数代码片段:

/**
 * Rewrite the content attachment links.
 *
 * @param string $content theContent.
 *
 * @return mix.
 */
public function AttachmentRewrite($content)
{
    $pattern = "/<a href=\\"(\\S+)(\\/wp-content\\/uploads\\/sites\\/)([0-9]+)(\\S+)\\">/";
    preg_match_all($pattern, $content, $match);

    // $match[0]  all links
    // $match[1] link head  http://xxx/network site subpath
    // $match[2] replace content /wp-content/uploads/sites/
    // $match[3] site num
    // $match[4] file meta_value
    if (isset($match) && is_array($match)) {
        $post_id = get_the_ID();
        $old_links = array();
        $new_links = array();
        foreach ($match[1] as $k => $v) {
            $old_links[$k] = $v.$match[2][$k].$match[3][$k].$match[4][$k];
            $checkMedia = $this->QueryMediaMeta($match[3][$k], $match[4][$k]);

            if (!$checkMedia) {
                $new_links[$k] = $old_links[$k];
            } else {
                if (isset($checkMedia[\'post_type\']) && $checkMedia[\'post_type\'] == \'attachment\' && isset($checkMedia[\'post_mime_type\']) ) {
                    $checkApp = strpos($checkMedia[\'post_mime_type\'], \'application\');

                    if ($checkApp === false) {
                        $new_links[$k] = $old_links[$k];
                    } else {
                        $_snx_id = $this->UpdateAttachUrl($match[3][$k], $match[4][$k]);
                        $rand_string = $this->RandString(10);
                        // s=site no, id=snx attachment_id, aid=post type attachment type id
                        $param = $rand_string.base64_encode(\'s=\'.$match[3][$k].\'&id=\'.$_snx_id.\'&p=\'.$post_id);
                        // return $match[1].\'/download.php?s=\'.$match[3][$k].\'&id=\'.$_snx_id;
                        $new_links[$k] = $v.\'/download.php?fid=\'.$param;
                    }
                } else {
                    $new_links[$k] = $old_links[$k];
                }
            }
            //$new_links[$k] = array_walk($_head_link, array($this, \'_array_walks\')).\'?download.php?s=\'.$match[3][$k].\'&id=\'.$match[4][$k];
        }
        array_walk($old_links, array($this, \'snxArrayWalks\'));
        $content = preg_replace($old_links, $new_links, $content);
    }

    return $content;
}
我使用preg\\u match\\u all来匹配所有附件url,包括媒体(mp3、jpeg、gif)。然后我们对匹配数据进行wget,但我们会再次对其进行mp3、jpeg、gif等的过滤,因此QueryMediaMeta函数将根据文件名和站点编号查询wp\\u posts和wp\\u post\\u meta以获取此信息。

然后我使用RandString和base64\\u编码来翻译原始url。并返回新的内容数据。

在下载中。php,可以控制访问权限,定义禁止页面。等

结束

相关推荐

how to edit attachments?

在将例如文件附加到帖子时,如何在事后编辑/删除它们?在帖子编辑器中找不到任何内容。谢谢