web-dev-qa-db-fra.com

Supprimer définitivement la première image des publications

J'ai environ 2 500 articles ou plus sur mon site où j'ai inséré des images à l'aide de la méthode traditionnelle dans le contenu de l'article lui-même.

Lors de la mise à niveau vers un thème différent, la page de publication unique affiche désormais l'image sélectionnée avant le titre (que je souhaite conserver), mais je souhaite maintenant supprimer la première image de the_content afin d'éviter que des images en double ne s'affichent.

Je sais que cela peut être fait avec ce filtre, mais existe-t-il un moyen de manière permanente de supprimer les premières images de mes anciens messages autres que de les parcourir manuellement?

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

J'ai l'impression que ce filtre pourrait utiliser beaucoup de ressources et ne pas être très flexible pour les tâches que je souhaiterais peut-être faire à l'avenir dans les messages.

Un autre thread a mentionné "Exportez vos tables de base de données sur votre desktop.than, vous pouvez supprimer toutes les balises indésirables en utilisant n’importe quel éditeur de texte tel que notepad ++." mais je ne sais pas comment faire cela.

Toute aide est appréciée. Merci

2
user2803938

Comme @s_ha_dum le suggère, vous pouvez parcourir tous vos messages et mettre à jour le contenu de chacun d'eux.

Ce qui suit vous donne l’idée mais n’a pas été testé:

$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;

Pour éviter le délai d'attente de PHP, j'ai ajouté un nombre fini de publications à mettre à jour avec un décalage donné. Vous pouvez adapter cela à vos besoins. Il est préférable d'essayer d'abord sur un seul post pendant que vous le testez.

Mais pensez à sauvegarder votre base de données avant de tester ceci !

Plugin de démonstration - First Image Remover

Voici un plugin de démonstration avec une page d’administrateur personnalisée:

Admin page

et c'est son propre élément de menu admin:

Admin menu

Vous pouvez créer un fichier plugin /wp-content/plugins/first-image-remover/first-image-remover.php avec le code suivant:

<?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 
    );
}

depuis lequel vous pouvez y accéder:

/wp-admin/admin.php?page=wpse_142494_settings_page

Vous pouvez ensuite l'adapter à vos besoins avec les paramètres GET suivants:

/wp-admin/admin.php?page=wpse_142494_settings_page&wpse_offset=10&wpse_ppp=5&wpse_update=no

Lorsque vous l'exécutez en mode de mise à jour (wpse_update=yes), vous obtenez quelque chose comme:

Update mode

Vous pouvez ensuite, si tout va bien, étendre cela et vous adapter à vos besoins.

4
birgire

Search RegEx est un bon plugin pour pouvoir rechercher et remplacer (éventuellement avec grep) et sauvegarder à travers tous les articles, pages, extraits, commentaires, titres et méta.

0
markratledge