永久删除帖子中的第一张图片

时间:2014-04-26 作者:user2803938

我在我的网站上有大约2500多篇帖子,我用传统的方法将图片插入帖子内容本身。

在升级到其他主题时,单个贴子页面现在会在标题(我想保留标题)之前显示特色图像,但我现在想从\\u内容中删除第一个图像,以防止出现重复图像。

我知道可以用这个过滤器来完成,但是除了手动浏览每一张图片之外,还有什么方法可以永久删除我以前帖子中的第一张图片吗?

function remove_first_image ($content) {
if (!is_page() && !is_feed() && !is_feed() && !is_home()) {
$content = preg_replace("/<img[^>]+\\>/i", "", $content, 1);
} return $content;
}
add_filter(\'the_content\', \'remove_first_image\');
我觉得这个过滤器可能是资源密集型的,对于我将来可能希望在帖子中做的事情来说非常不灵活。

另一个线程提到“将数据库表导出到桌面。然后,您可以使用任何文本编辑器(如记事本++)删除所有不需要的标记。”但我不知道怎么做。

非常感谢您的帮助。谢谢

2 个回复
最合适的回答,由SO网友:birgire 整理而成

正如@s\\u ha\\u dum所建议的那样,您可以循环浏览所有帖子并更新每个帖子的内容。

以下内容给出了您的想法,但未经测试:

$posts = get_posts( array( 
    \'post_type\'      => \'post\', 
    \'posts_per_page\' => 500, 
    \'offset\'         => 0, 
) );

foreach( $posts as $post ):
    // Update each post with your reg-ex content filter:
    $pid = wp_update_post( array( 
        \'ID\'           => $post->ID,
        \'post_content\' => preg_replace( "/<img[^>]+\\>/i", "", $post->post_content, 1 )
    ) );
    // Show the update process:
    printf( \'<p>Post with ID: %d was %s updated</p>\', 
        $post->ID, 
        ( 0 < $pid ) ? \'\' : \'NOT\' 
    );     
endforeach;
为了避免PHP超时,我添加了有限数量的帖子,以使用给定的偏移量进行更新。您可以根据需要进行调整。在测试时,最好先在单个帖子上尝试。

但是remember to backup your database before testing this!

演示插件-第一个图像移除器这里有一个带有自定义管理页面的演示插件:

Admin page

还有它自己的管理菜单项:

Admin menu

您可以创建插件文件/wp-content/plugins/first-image-remover/first-image-remover.php 使用以下代码:

<?php
/**
 * Plugin Name: First Image Remover
 * Description: Remove the first image from the post content
 * Plugin URI:  http://wordpress.stackexchange.com/a/142494/26350 
 * Version:     0.0.1
 */

/**
 * Create the \'First Image Remover\' admin menu
 */

function wpse_142494_create_menu()
{
    // Create new top-level menu:
    add_menu_page( 
        \'First Image Remover\', 
        \'First Image Remover\', 
        \'manage_options\', 
        \'wpse_142494_settings_page\', 
        \'wpse_142494_settings_page\'
    );
}

add_action(\'admin_menu\', \'wpse_142494_create_menu\');

/**
 * Create the \'Image Replacer\' settings pge
 */
function wpse_142494_settings_page()
{ 
?>
    <div class="wrap">
        <h2>First Image Remover</h2>
        <p>Remove the first image of each post in the selected loop.</p>


        <h3>Help:</h3>
        <p>Avialable GET parameters: 
        <pre>
wpse_ppp - Posts Per Page (int), 
wpse_offset - Offset (int),
wpse_update - Update mode (boolean) 

Update Example for 5 posts with offset 10:

/wp-admin/admin.php?page=wpse_142494_settings_page&wpse_offset=10&wpse_ppp=5&wpse_update=yes
        </pre>
        <h3>Loop:</h3>
        <?php wpse_142494_loop(); ?>
    </div>
<?php
}

/**
 * Fetch posts based on user input
 */
function wpse_142494_loop()
{
    // Only site admin can update posts:
    if( ! current_user_can( \'manage_options\' ) ) return;

    // Get user input:
    $params = filter_input_array( INPUT_GET, array( 
        \'wpse_offset\'  => FILTER_SANITIZE_NUMBER_INT,
        \'wpse_ppp\'     => FILTER_SANITIZE_NUMBER_INT, 
        \'wpse_update\'  => FILTER_VALIDATE_BOOLEAN, 
    ) );

    // Fetch posts to update:   
    $posts = get_posts( array( 
        \'post_type\'      => \'post\', 
        \'posts_per_page\' => ( ! empty( $params[\'wpse_ppp\'] ) )    ? $params[\'wpse_ppp\']    : 10 , 
        \'offset\'         => ( ! empty( $params[\'wpse_offset\'] ) ) ? $params[\'wpse_offset\'] : 0, 
    ) );

    // Loop through posts:
    $li = \'\';
    foreach( $posts as $post ):

        if( $params[\'wpse_update\'] ):           
            // Update each post with your reg-ex content filter:
            $pid = wp_update_post( array( 
                \'ID\'           => $post->ID,
                \'post_content\' => preg_replace( "/<img[^>]+\\>/i", "", $post->post_content, 1 )
            ) );

            // Show the update process:
            $li .= sprintf( \'<li>%d - <strong>%s</strong> - was %s updated</li>\', 
                $post->ID, 
                $post->post_title,
                ( 0 < $pid ) ? \'\' : \'NOT\' 
            );
        else:
            // Show the post list that will be updated
            $li .= sprintf( \'<li>%d - <strong>%s</strong> - will be updated</li>\', 
                $post->ID,
                $post->post_title
            );
        endif;

    endforeach;

    // Output:
    printf( \'<strong>Settings:</strong> Posts: %d - Offset: %d - Update: %s <ul>%s</ul>\', 
        $params[\'wpse_ppp\'], 
        $params[\'wpse_offset\'], 
        $params[\'wpse_update\'] ? \'ON\' : \'OFF\', 
        $li 
    );
}
您可以从以下位置访问它:

/wp-admin/admin.php?page=wpse_142494_settings_page
然后,您可以使用以下GET参数根据需要进行调整:

/wp-admin/admin.php?page=wpse_142494_settings_page&wpse_offset=10&wpse_ppp=5&wpse_update=no
在更新模式下运行时(wpse_update=yes) 您将得到如下结果:

Update mode

然后,您可以扩展此功能并根据需要进行调整。

SO网友:markratledge

Search RegEx 是一个很好的插件,可以搜索和替换(可以选择使用grep)并保存所有帖子、页面、摘录、评论、标题和元数据。

结束

相关推荐

使用Apply_Filters帮助输出POST类

我不熟悉脚本,这是一个插件,我想修改它来输出post类。当我尝试使用时:apply_filters( \'post_class\', $page->post_class ) it仅输出array=\" \". 我是否需要一个附加函数来连接到post类?在我的研究中,我无法判断我的语法是否错误,或者我在类中缺少了一个要“拉”的函数apply_filters 抓住。非常感谢你的帮助。 var $db_fields = array (\'parent\' => \'post_parent\',