web-dev-qa-db-de.com

Extrahieren Sie das Bild aus dem Inhalt und legen Sie es als das vorgestellte Bild fest

Das Problem:
Ich poste über die Wordpress iPhone App. Wenn Sie ein Bild hinzufügen, wird das Bild in der Beschreibung selbst angezeigt, was mir nicht gefällt.

Was ich versuche zu tun:
Entfernen Sie das Bild aus der Beschreibung und führen Sie einen der folgenden Schritte aus (Sie kennen die Vorteile einer Option gegenüber der anderen nicht):

  1. Rufen Sie die Bildquelle aus dem entfernten Bild ab und fügen Sie sie einem benutzerdefinierten Feld hinzu. -ODER-
  2. Stellen Sie das Bild als das vorgestellte Bild ein

Ich nehme an, eine dieser Optionen würde mir helfen, die Bild-URL für die Verwendung in meinen Post-Vorlagen zu isolieren.

Was ich versucht habe:
Buchstäblich alles unter der Sonne. Im Moment füge ich Code zu functions.php hinzu, möchte dies aber eventuell zu einem Plugin machen.

Ich denke, der folgende Code ist weit entfernt, aber ich möchte ihn posten, um einige der Versuche zu zeigen, die ich unternommen habe:

Ich habe eine Aktion hinzugefügt, um eine Funktion mpb_remove_post_image auf content_save_pre auszuführen ...

add_action('content_save_pre', 'mpb_remove_post_image');

Das Problem dabei ist, dass ich über content_save_pre keinen Zugriff auf die post_id habe (die ich zum Festlegen des empfohlenen Bildes benötige). Daher muss ich die Bild-URL abrufen und nach einem Beitrag suchen, dessen Guid dem Bild-Quellcode entspricht. .

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

der obige Code verweist auf diese Funktion, die ich geschrieben habe, um das Bild zu erhalten ...

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

Und um das vorgestellte Bild einzustellen ...

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

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

}

Ich habe auch versucht, eine Aktion für save_post hinzuzufügen, aber alles, was ich in der ausgeführten Funktion tue, scheint einen weiteren Hook auszulösen, der save_post erneut ausführt, sodass es sich in eine Endlosschleife verwandelt.

Weiß jemand (auch wenn es auf hohem Niveau ist), welche Schritte ich unternehmen kann, um dies zu erreichen? Um es noch einmal zusammenzufassen:.

Beim Einfügen eines Posts 1) Erhalte das erste Bild als Quellcode 2) Setze es als benutzerdefiniertes Feld oder setze es als ausgewähltes Bild 3) Entferne das Bild vom Post.

edit - Ich sollte erwähnen, dass der Code, den ich gepostet habe, funktioniert, wenn Sie den Beitrag über den WP-Administrator hinzufügen. Aber nicht, wenn Sie es über die mobile App hinzufügen.

6
jyoseph

Warum nicht zwei Haken verwenden, einen vor und einen nach dem Speichern des Posts?

content_save_pre: Die mit diesem Hook verbundene Funktion entfernt das Bild aus dem Inhalt und speichert es in der Sitzung / transient .

save_post: Mit diesem Haken haben Sie die ID des Posts. Die mit diesem Hook verbundene Funktion setzt das ausgewählte Bild für den Beitrag mit dieser ID und löscht die / transienten Sitzungsdaten.

Wenn Sie Ihren Ansatz verfolgen möchten, sollten Sie alternativ post_name anstelle von guid verwenden, um die Beitrags-ID aus der Datenbank abzurufen.

1
Neerav

Sie sind sich nicht sicher, ob dies in Ihrem speziellen Szenario von Nutzen ist, sollten sich jedoch das Plugin get_the_image ansehen

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

Es werden mehrere Quellen überprüft, um zu versuchen, ein anzuzeigendes Bild zu finden - gemäß der FAQ:

Wie zieht es Bilder?

  • Sucht ein Bild nach benutzerdefiniertem Feld (eines Ihrer Wahl).
  • Wenn in einem benutzerdefinierten Feld kein Bild hinzugefügt wird, suchen Sie mit the_post_thumbnail () nach einem Bild (neue Bildfunktion von WP 2.9).
  • Wenn kein Bild gefunden wird, wird ein an Ihren Beitrag angefügtes Bild abgerufen.
  • Wenn kein Bild angehängt ist, kann es ein Bild aus Ihrem Beitragsinhalt extrahieren (standardmäßig deaktiviert).
  • Wenn zu diesem Zeitpunkt kein Bild gefunden wird, wird standardmäßig ein von Ihnen festgelegtes Bild verwendet (nicht standardmäßig festgelegt).
0
chrismou