web-dev-qa-db-fra.com

Extraire une image du contenu et la définir comme image sélectionnée

Le problème:
Je publie à partir de l'application Wordpress pour iPhone. Lors de l'ajout d'une image, celle-ci apparaît dans la description, ce que je n'aime pas.

Ce que j'essaie de faire:
Supprimez l'image de la description et effectuez l'une des opérations suivantes (vous ne connaissez pas les avantages d'une option par rapport à l'autre):

  1. Obtenez la source de l'image à partir de l'image supprimée et ajoutez-la à un champ personnalisé. -OU-
  2. Définir l'image comme image sélectionnée

Je pense que l'une ou l'autre de ces options m'aiderait à isoler l'URL de l'image à utiliser dans mes modèles de publication.

Ce que j'ai essayé:
Littéralement tout sous le soleil En ce moment, j'ajoute du code à functions.php, mais j'aimerais éventuellement en faire un plugin.

Je pense que le code ci-dessous est très différent, mais je souhaite le poster pour montrer certaines de mes tentatives:

J'ai ajouté une action pour exécuter une fonction mpb_remove_post_image sur content_save_pre ...

add_action('content_save_pre', 'mpb_remove_post_image');

Le problème, c’est que je n’ai pas accès au post_id (dont j’ai besoin pour paramétrer l’image sélectionnée) avec content_save_pre. Je dois donc obtenir l’URL de l’image et rechercher un message dont le guid est égal à l’image src .. .

function mpb_remove_post_image( $content ){

    // strip slashes, I guess we need to readd slashes when we're done?
    $content = stripslashes($content);

    // get the first image src
    $image_src = get_first_image($content);

    // if there's an image src we can jam
    if(!is_null($image_src)){

        global $wpdb;

        // query the db for an attachment with this image
        //$thumb_id = $wpdb->get_var($wpdb->prepare("SELECT DISTINCT ID FROM $wpdb->posts WHERE guid='$image_src'"));
        $result = $wpdb->get_results("SELECT ID, post_parent FROM {$wpdb->posts} WHERE guid ='$image_src'");

        $thumb_id = $result[0]->ID;         
        $post_id = $result[0]->post_parent;

        // set the featured image
        mpb_set_featured_image($thumb_id,$post_id);
        // update_post_meta( $post_id, '_thumbnail_id', $thumb_id );

    }

    // remove any images in the content
    $content = preg_replace("/<img[^>]+\>/i", "", $content);

    $content = addslashes($content);

    return $content;
}

le code ci-dessus fait référence à cette fonction que j'ai écrite pour obtenir l'image ...

function get_first_image($html){

    require_once('simple_html_dom.php');

    $post_dom = str_get_dom($html);

    // get the first image
    $first_img = $post_dom->find('img', 0);   

    // if any images then return the src attribute
    if($first_img !== null) {
        return $first_img->src;
    }

    return null;
}

Et pour définir l'image sélectionnée ...

// set the featured image
function mpb_set_featured_image( $thumb_id, $post_id ){

    update_post_meta( $post_id, '_thumbnail_id', $thumb_id );

}

J'ai également essayé d'ajouter une action pour save_post, mais tout ce que je fais dans la fonction qui est exécutée semble déclencher un autre point d'ancrage qui exécute à nouveau save_post et se transforme en une boucle sans fin.

Est-ce que quelqu'un sait (même si c'est à un niveau élevé) quelles étapes je peux prendre pour accomplir ceci? Pour récapituler voici ce que je veux faire ...

Lors de l'insertion d'un message 1) obtenez la première image src 2) définissez-le comme champ personnalisé ou définissez-le comme image sélectionnée 3) supprimez l'image du message.

edit - Je devrais mentionner le code que j'ai posté ne fonctionne pas si vous ajoutez la publication via l'admin de wp. Mais pas si vous l'ajoutez via l'application mobile.

6
jyoseph

Pourquoi ne pas utiliser deux crochets, un avant post enregistré et un après post enregistré?

content_save_pre: La fonction attachée à ce hook supprimera l'image du contenu et la stockera dans la session / transitoire .

save_post: Avec ce hook, vous aurez l'identifiant du post. La fonction attachée à ce crochet définira l'image sélectionnée pour le message avec cet identifiant et supprimera la session / transitoire data.

Sinon, si vous voulez suivre votre approche, je pense que vous devriez utiliser post_name, au lieu de guid, pour récupérer le post id de la base de données.

1
Neerav

Pas sûr que ce soit utile dans votre scénario particulier, mais ça vaut peut-être la peine de jeter un œil au plugin get_the_image

http://wordpress.org/extend/plugins/get-the-image/

Il vérifie plusieurs sources pour essayer de trouver une image à afficher - conformément à la FAQ:

Comment ça tire les images?

  • Recherche une image par champ personnalisé (celui de votre choix).
  • Si aucune image n'est ajoutée par un champ personnalisé, recherchez une image à l'aide de the_post_thumbnail () (nouvelle fonctionnalité d'image de WP 2.9).
  • Si aucune image n'est trouvée, une image est jointe à votre message.
  • Si aucune image n'est jointe, il peut extraire une image de votre contenu de publication (désactivée par défaut).
  • Si aucune image n'est trouvée à ce stade, il s'agira par défaut d'une image que vous avez définie (non définie par défaut).
0
chrismou