我已经使用Advanced Custom Fields插件在Wordpress中创建了一个新的“自定义字段”。我现在的目标是将所有下载链接从“ the_content”移动到新创建的自定义字段“ the_field('download_link')”。问题是我有10,000多个帖子需要修改。我想知道是否有一种快速的方法,而不是手动移动每个帖子的下载链接?

请查看下面的图片,以了解我要实现的目标。

Before | After

一个障碍是所有内容都保存在“ wp_posts”表中,而自定义字段内容保存在“ wp_postmeta”表中。

保存在“ download_link”自定义字段中的内容在“ wp_postmeta”表中如下所示:

(8214, 2282, 'download_link', '<div class=\"source\"><a href=\"https://www.google.com/\" target=\"_blank\"><img src=\"https://www.google.com/image.png\"></a></div>'),
(8215, 2282, '_download_link', 'field_5cffd35335ce3'),
(8220, 2280, 'download_link', '<div class=\"source\"><a href=\"https://www.google.com/\" target=\"_blank\"><img src=\"https://www.google.com/image.png\"></a></div>'),
(8221, 2280, '_download_link', 'field_5cffd35335ce3'),
(8226, 2278, 'download_link', '<div class=\"source\"><a href=\"https://www.google.com/\" target=\"_blank\"><img src=\"https://www.google.com/image.png\"></a></div>'),
(8227, 2278, '_download_link', 'field_5cffd35335ce3'),


可以做到吗?还是实现此目标的唯一真正方法是手动移动下载链接?

在此先感谢您的帮助。

最佳答案

如果您的下载链接的格式始终相同,则可以自动完成。


备份数据库
创建一个名为my-cleanup.php的php文件。
循环浏览所有产品,获取描述中的链接并将其移至post_meta。
WP-CLI启动文件:
wp eval-file my-cleanup.php


样例代码

// Select the posts you want
$args = array(
    'post_type'      => 'post',
    'post_status'    => 'any',

    // -1 means all posts
    // For debug, set this to a small number
    'posts_per_page' => 3,
);

// Retrieve posts
$query = new WP_Query( $args );
$posts = $query->posts;

// Pattern to match
// [wpdm_package id='90228']
$pattern = "/(\[wpdm_package id='\d+'\])/";

// Process posts one by one
foreach ( $posts as $post ) {
    echo "Processing " . $post->post_title . "\n";
    $post_args['ID'] = $post->ID;

    // Get the shortcode from the post content
    preg_match( $pattern, $post->post_content, $matches );

    // Do we have a match?
    if ( count( $matches) > 0 ) {

        // Retrieve shortcode
        $shortcode = $matches[0];

        // Convert shortcode, maybe add some HTML
        $link = do_shortcode( $shortcode );

        // remove shortcode from description
        $post_args['post_content'] = preg_replace( $pattern, '', $post->post_content );

        // Update post
        wp_update_post( $post_args );

        // Create the post_metas
        add_post_meta( $post->ID, '_download_link', 'field_5cffd35335ce3', true );
        add_post_meta( $post->ID, 'download_link',  $link, true );
    }
}


笔记


备份数据库
测试几篇文章,以使您对代码充满信心。您可以在编辑器中还原以前的修订。
然后试穿100,然后试穿1000。您通常会发现帖子输入的方式略有不同。
要在10.000个帖子上运行可能要花费几个小时,这就是为什么需要WP-CLI命令的原因。

10-07 15:01