将图像链接从附件页面更改为图像URL

时间:2015-01-19 13:49:48

标签: wordpress

寻找一个SQL查询,在WordPress中更新从附件页面到图像文件的所有图像链接。

1 个答案:

答案 0 :(得分:2)

WordPress附件页面即时生成。对于任何附件(上传的文件),始终存在可通过http://wordpress.lo/?attachment_id= $ ID检索的附件页面,其中$IDwp_posts数据库中post_type的附件ID设置为attachment。它的guid字段总是设置为可以通过的直接网址,例如http://wordpress.lo/wp-content/uploads/2015/01/my-upload.png

但是,根据附加到媒体发布的帖子以及启用了网址的固定链接的帖子总是变为漂亮的帖子,例如http://wordpress.lo/2015/01/mypost/attachment-slug

我必须假设您遇到的问题是,帖子和网页中的所有附件都包含在通向附件页而不是直接路径的锚链接中。这是帖子内容以及图像首先如何插入帖子的问题,与数据库中数据的结构无关。

wp_posts.post_content字段包含这些附件网址。可以直接将这些转换为直接URL,但这是一项非常棘手的任务,因为您无法知道生成了哪种附件URL。一种肮脏的方法是解析每个帖子/页面的内容,寻找包裹<a>标签的图像并更改其URL。幸运的是,所有附件链接都有rel属性,其中包含&#34;附件&#34;。

我不会推荐the Cthulhu way of partsing HTML所以使用DOMDocument API就可以了。

例如,您可以在主题的functions.php中运行代码草图。事先备份你的数据库,我不能保证这不会在我们脸上爆炸。

<?php
add_action( 'init', function() {
    $posts = get_posts( array(
        'posts_per_page' => -1, // Get all posts with
        'post_type' => array( 'any' ), // any post type
        's' => 'rel="attachment' // with our target pages
    ) );

    foreach ( $posts as $post ) {
        $dom = new DOMDocument();
        $dom->loadHTML( $post->post_content ); // Parse the content
        foreach ( $dom->getElementsByTagName( 'a' ) as $a ) {
            if ( $a->getAttribute( 'rel' ) && strpos( $a->getAttribute( 'rel' ), 'attachment' ) !== false ) {
                // Good candidate, replace rel and href by those in image
                $src = $a->getElementsByTagName( 'img' )->item( 0 )->getAttribute( 'src' ); // get the src
                $a->setAttribute( 'href', $src ); // set the href to the src
                $a->removeAttribute( 'rel' ); // Cleanup rel
            }
        }
        // Strip the extras
        $content = preg_replace( '#<!DOCTYPE.*?>\n#', '', str_replace( array( '<html><body>', '</body></html>' ), '', $dom->saveHTML() ) );

        // Save the post back
        wp_update_post( array( 'ID' => $post->ID, 'post_content' => $content ) );
    }
} );

在我当地的环境中进行了一些快速测试,结果很有希望。有些事情需要注意:

  1. 这很脏,可能不适用于某些边缘情况,尤其是在人类修改了URL的情况下。代码依赖于WordPress 4.1生成的附件代码,所以要小心,不知道可能存在什么怪癖。
  2. 在运行代码之前备份数据库,并在运行之前了解代码的作用。
  3. 如果你有很多帖子,页面可能会超时,请确保有足够的时间不这样做。然而,多次运行是安全的,因为我们摆脱了&#34; rel&#34;标记,他们再次跑步时不会被带进来。
  4. 备份数据库。严重。