web-dev-qa-db-ja.com

投稿から最初の画像を完全に削除する

私は自分のサイトに約2,500を超える投稿があり、そこでは私は伝統的な方法を使って画像を投稿コンテンツ自体に挿入しました。

別のテーマにアップグレードする際に、単一の投稿ページにはタイトルの前におすすめの画像が表示されるようになりました(ただし、残しておきます)。

私はそれがこのフィルタを使って行うことができることを知っています、しかし手動でそれぞれを通過する以外に 永久に 私の古い投稿から最初の画像を削除する方法はありますか?

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');

私はこのフィルターがリソース集約的であり、私がポストの中で私が将来したいと思うかもしれない事のために非常に融通がきかないかもしれないように私は感じます。

別のスレッドは、「データベーステーブルをデスクトップにエクスポートします。notepad ++などのテキストエディタを使用して、不要なタグをすべて削除できるようにしました」と述べました。しかし、私はそのやり方に慣れていません。

任意の助けは大歓迎です。ありがとう

2
user2803938

@s_ha_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のタイムアウトを回避するために、特定のオフセットで更新する有限個の投稿を追加しました。あなたはあなたのニーズに合わせてこれを調整することができます。テストしている間、最初の投稿で最初に試すことをお勧めします。

しかし これをテストする前にデータベースをバックアップすることを忘れないでください

デモプラグイン - ファーストイメージリムーバー

これは、カスタム管理ページを含むデモプラグインです。

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

うまくいけばこれを拡張し、あなたのニーズに適応することができます。

5
birgire

Search RegEx は検索と置換(オプションでgrepを使用)を可能にし、すべての投稿、ページ、抜粋、コメント、タイトル、メタを保存できる優れたプラグインです。

0
markratledge