寻找一个SQL查询,在WordPress中更新从附件页面到图像文件的所有图像链接。
答案 0 :(得分:2)
WordPress附件页面即时生成。对于任何附件(上传的文件),始终存在可通过http://wordpress.lo/?attachment_id= $ ID检索的附件页面,其中$ID
是wp_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 ) );
}
} );
在我当地的环境中进行了一些快速测试,结果很有希望。有些事情需要注意: