webentwicklung-frage-antwort-db.com.de

So werden alle Dateien in einen Beitrag eingefügt (aber nicht angehängt)

Wie rufe ich die IDs nicht angehängter Medien in meinem Beitrag ab?

Ich habe zwei Posts: POST A und POST B und eine PDF Datei mit dem Namen Datei. pdf .

Ich habe file.pdf nach POST A hochgeladen, aber dann auch in POST B eingefügt.

Jetzt ist die Datei file.pdf noch an POST A angehängt, sodass ich ihre ID nicht mit get_attached_media( '', $post_B_id ) ermitteln kann.

Wie kann ich die Liste aller in POST B verwendeten Medien abrufen, einschließlich Dateien wie meine Datei.pdf - nicht angehängt, indem ich sie in POSTeinfüge? _ B ?

3
Levi Dulstein

Ja, das kannst du! Ist es einfach/leicht? Art von ... Ist es schnell und skalierbar? Oh lieber Gott, nein ????.

Die super teure Lösung

Die Lösung hier ist diese Funktion:

$post_id = url_to_postid( $url );

Das Problem ist, dass dies eine sehr langsame Funktion ist, deren Aufruf teuer ist. Wenn Sie dies beim Anzeigen jedes Beitrags aufrufen, ist Ihr DB-Server extrem belastet und kann umfallen, wenn Sie ihn nicht richtig konfigurieren und auf einem dedizierten Computer ablegen.

Hinweis: Sie können diese Funktion nicht vorzeitig aufrufen, sie muss sich am Hook setup_theme oder später befinden, sonst tritt ein schwerwiegender Fehler auf.

Mit dieser Funktion können wir jede URL im Inhalt des Posts herausholen und testen, ob sie mit der URL unserer Site beginnt. Wenn dies der Fall ist, können wir überprüfen, ob es mit einem der Anhänge übereinstimmt. Wenn dies nicht der Fall ist, wissen wir, dass es nicht verbunden ist, und können diese Funktion verwenden, um eine Kopie abzurufen.

Das Abrufen aller URLs in einem Beitragsinhalt ist jedoch ein Thema oder eine andere Frage. Das Testen, ob eine URL für einen angehängten Anhang bestimmt ist, ist ein einfacher Vergleich von if-Anweisungen in einer Schleife (prüfen Sie für jedes angehängte Element, ob die URL mit der URL übereinstimmt, die wir testen).

Dinge beschleunigen

Es gibt einige Dinge, die die Kosten dieser Funktion verringern könnten:

  • Führen Sie den Vorgang für den Haken zum Speichern und Aktualisieren von Posts aus und speichern Sie das Ergebnis in Post-Meta
  • Binden Sie die Funktion in eine Caching-Ebene ein, um die Arbeit zu beschleunigen (nur wirksam, wenn eine Objekt-Caching-Lösung wie memcached vorhanden ist, die nicht so effektiv ist wie der vorherige Mechanismus). Dies umgeht Caches und ist immer noch teuer, aber nicht so teuer wie url_to_postid. Es funktioniert auch nur mit GUIDs, daher muss die Genauigkeit abgewogen werden

Eine noch teurere Lösung

Fragen Sie alle Anhänge über WP_Query ab und laden Sie sie alle in den Speicher. Überprüfen Sie dann alle Anhänge 1 für 1, um festzustellen, ob sie in Ihrem Beitrag enthalten sind.

Dies ist bei weitem der langsamste und teuerste Weg, dies zu tun:

  • Wenn Sie mehr Medien hochladen, müssen Sie beim Ausführen der Abfrage mehr laden. Bei Websites mit mehr als 30 oder 40 Anhängen werden schwerwiegende Speicherfehler auftreten
  • Es ist eine schwere Datenbankoperation, Ihre Datenbank muss alle Anhänge senden, und wenn mehrere Benutzer gleichzeitig surfen, wird dies sehr problematisch
  • Es wird nie mehr als 5-10 gleichzeitige Benutzer skalieren, und das ist, wenn Sie Glück haben
  • Es ist langsam, es braucht Zeit, jeden Anhang zu überprüfen
3
Tom J Nowell

Sie können eine Funktion wie diese ausführen, um Ihre Medien in einem Beitrag zu suchen und zu extrahieren

add_action('the_content', function($content) {
    $mediaRegex = "/(src|href)=\"(.+?).(jpg|png|pdf)\"/i";
    $mediaFind = preg_match_all($mediaRegex, $content, $media);
    if (isset($media[2]) && count($media[2]) > 0)
        $content = "<pre>MEDIA WITHIN THIS PAGE: \n".print_r($media[2],true)."</pre>".$content;
    return $content;
});

Sie können das Regex-Muster ändern, um es besser an Ihr Setup anzupassen. Sie können die Regex veranlassen, Klassennamen von eingelegten Medien (anstelle von URLs) zu übernehmen und die Anhangs-IDs auf diese Weise abzurufen.

Und/oder wenn Sie die gefundenen Medien weiter verfeinern möchten, um sicherzustellen, dass sie sich in Ihrer Medienbibliothek befinden, können Sie die Medienelement-URLs aus Ihrer Bibliothek in einem Array ablegen:

// get the media library for comparison
$library = array();
$args = array(      
    'post_type' => 'attachment',
    //'post_mime_type' => 'image', // if theres only one
    'numberposts' => -1,
    'post_status' => null,
    'post_parent' => null,
);
$attachments = get_posts($args);
foreach ($attachments as $post)
    $library[] = wp_get_attachment_url($post->ID);

Schreiben Sie dann einen Code, um mit in_array() für einzelne $media[2] Übereinstimmungen mit $library zu argumentieren. Abhängig von der Verwendung möchten Sie möglicherweise Wordpress Transients hinzufügen und das Bibliotheks-Snippet umbrechen.

2
David Sword

es ist nicht einfach, einen kurzen Hinweis oder Quellcode zu erhalten, um alle Verwendungen einer Mediendatei zu finden. WordPress erstellt eine Beziehung für eine Verwendung zu einem Beitragstyp. Sie haben aber auch die Möglichkeit, eine Mediendatei in einer Galerie, Plugins, Themen, benutzerdefiniertem Code und vielem mehr zu verwenden.

Kern, inneres hinteres Ende

Die Standardeinstellungen des WordPress-Kerns haben eine Option im Back-End im Medienbereich. Wählen Sie alle nicht angehängten Dateien aus und Sie erhalten eine Liste.  enter image description here 

Alternatives Plugin

Sie sollten jedoch die obige Kernlösung verwenden oder über die Verwendung eines Plugins nachdenken, das alle diese Abhängigkeiten überprüft, wie z. B. Media Cleaner . Ich habe dieses Plugin nicht verwendet, aber es überprüft die mehrfache Verwendung einer Mediendatei und gibt Ihnen einen Überblick über Ihre Mediendateien.

0
bueltge