web-dev-qa-db-fra.com

Comment vérifier si l'image est déjà stockée dans la base de données de publication d'un site? (réseau)

J'ai actuellement configuré Wordpress pour qu'une publication puisse être copiée sur d'autres sites au sein d'un réseau Wordpress. Cependant, une publication peut être diffusée plus d'une fois et je souhaite vérifier si l'image est déjà publiée dans la table wp_posts de ce site.

Par exemple, supposons qu'une image ait le chemin de l'image:

/wp-content/uploads/2012/01/an_image.jpg

Toutes les images sont stockées par le réseau dans cette configuration de dossiers (plutôt que le /blogs.dir/files/ par défaut).

En d'autres termes, Wordpress peut-il interroger la base de données pour vérifier si elle se trouve déjà dans la table, ou doit-elle être écrite en tant que requête de base de données PHP?

6
Ollie

Oui, une requête de base de données est possible avec WordPress:

function is_image_in_network( $image_name )
{
    global $wpdb;
    $image = "uploads/2012/01/{$image_name}";
    $value = '%'.like_escape( $image ).'%';
    $blog_id = get_current_blog_id();
    $wpdb->set_blog_id( $blog_id );
    $image = $wpdb->get_var( 
        $wpdb->prepare( 
            "SELECT ID FROM {$wpdb->posts} 
            WHERE  post_status = 'publish' 
            AND post_content LIKE '%s'"
            , $value 
        ) 
    );
    return is_null( $image ) ? false : true;
}

Vous pouvez l'utiliser comme fonction dans vos modèles. Ajoutez simplement le nom de l'image que vous recherchez en argument. La nouvelle "balise de modèle" fonctionne comme chaque valeur par défaut WP "balise conditionnelle".

Est-ce que image.php dans la question est une faute de frappe?

Je laisse la chaîne de recherche %uploads/2012/01/an_image% sans extension afin de pouvoir capturer toutes les images (images originales et miniatures).

Documentation: Class_Reference/wpdb .

2
brasofilo

La manière la plus simpledevraitsoit d'utiliser wp_attachment_is_image() .

if ( ! wp_attachment_is_image( $post_ID ) )
{
    // process needed tasks
}

Notez que cela ne prend en compte que les fichiers dont l'en-tête est image/*ouune extension de 'jpg', 'jpeg', 'jpe', 'gif', 'png'.

Ceci n'est pas testé.

0
kaiser