web-dev-qa-db-fra.com

Comment obtenir tous les fichiers insérés (mais non attachés) dans un message

Comment récupérer les identifiants des médias non attachés dans mon message?

J'ai deux messages: POST A et POST B et un fichier PDF appelé fichier.pdf .

J'ai téléchargé fichier.pdf dans POST A , mais je l'ai également inséré dans POST B .

Maintenant, le fichier fichier.pdf est toujours attaché à POST A et je ne peux donc pas obtenir son ID en utilisant get_attached_media( '', $post_B_id ).

Comment puis-je récupérer la liste de tous les supports utilisés dans POST B , y compris des fichiers tels que mon fichier.pdf - non attaché, en les insérant dans POST B ?

3
Levi Dulstein

Oui, vous pouvez le faire! Est-ce simple/facile? En quelque sorte ... Est-ce rapide et évolutif? Oh mon dieu non ????.

La solution super chère

La solution ici est cette fonction:

$post_id = url_to_postid( $url );

Le problème est qu’il s’agit d’une fonction très lente et coûteuse à appeler. Si vous appelez cela en affichant chaque publication, votre serveur de base de données sera soumis à une très forte contrainte et risque de basculer si vous ne le configurez pas correctement et que vous ne le placez pas sur une machine dédiée.

Remarque: vous ne pouvez pas appeler cette fonction avant, elle doit être connectée au hook setup_theme ou plus tard, sinon une erreur fatale se produira.

Avec cette fonction, nous pouvons extraire chaque URL du contenu des publications et faire un test pour voir si elle commence par l'URL de notre site. Si c'est le cas, nous pouvons vérifier si elle correspond à l'une des pièces jointes. Sinon, nous savons qu'elle n'est pas attachée et nous pouvons utiliser cette fonction pour récupérer une copie.

Comment récupérer toutes les URL dans un contenu de publication est cependant un sujet ou une autre question. Tester si une URL est une pièce jointe attachée est une simple comparaison d'instructions if dans une boucle (pour chaque chose attachée, vérifiez si son URL correspond à l'URL que nous testons)

Accélérer les choses

Quelques facteurs pourraient réduire le coût de cette fonction:

  • Exécutez le processus sur le crochet d’enregistrement et de mise à jour et stockez le résultat dans le méta-post
  • Enveloppez la fonction dans une couche de mise en cache pour accélérer les opérations (efficace uniquement si une solution de mise en cache des objets, telle que memcached, est moins efficace que le mécanisme précédent) -Utilisez une méthode moins précise écrite par les plugins Pippins qui utilise une requête de base de données. Cela contournera les caches et reste cher, mais pas aussi cher que url_to_postid. De plus, cela ne fonctionne qu'avec les GUID, d’où le compromis précision

Une solution encore plus chère

Interrogez toutes les pièces jointes via WP_Query et chargez-les toutes en mémoire, puis vérifiez chaque pièce jointe une par une pour voir si elles apparaissent dans votre message.

C'est de loin le moyen le plus lent et le plus coûteux de le faire:

  • Au fur et à mesure que vous chargez plus de médias, vous devez en charger davantage lorsque vous effectuez la requête. Pour tout site contenant plus de 30 ou 40 pièces jointes, vous obtiendrez des erreurs fatales en mémoire.
  • C'est une opération lourde de base de données, votre base de données doit envoyer toutes les pièces jointes, et si plusieurs personnes parcourent en même temps, cela deviendra très problématique
  • Il ne dépassera jamais 5 à 10 utilisateurs simultanés, et c'est si vous êtes chanceux
  • C'est lent, vérifier chaque pièce jointe prend du temps
3
Tom J Nowell

Vous pouvez exécuter une fonction comme celle-ci pour trouver et extraire votre média dans un message.

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

Vous pouvez modifier le motif de regex pour l'adapter à votre configuration. Vous pouvez faire en sorte que l'expression rationnelle prenne les noms de classe du média inséré (au lieu d'URL) et récupère l'ID de pièce jointe de cette façon.

Et/ou si vous souhaitez affiner le support trouvé, en vous assurant qu'il se trouve dans votre bibliothèque multimédia, vous pouvez placer les URL des éléments multimédias de votre bibliothèque dans un tableau:

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

Ensuite, écrivez un code à argumenter avec quelque chose comme in_array() pour des correspondances individuelles avec $media[2] vs $library. Selon l'utilisation, vous souhaiterez peut-être ajouter Wordpress Transients et envelopper le fragment de bibliothèque.

2
David Sword

il n'est pas facile d'obtenir un indice court, le code source permettant de trouver toutes les utilisations d'un fichier multimédia. WordPress crée une relation pour un usage vers un type de publication. Mais vous avez également la possibilité d'utiliser un fichier multimédia dans une galerie, des plugins, des thèmes, du code personnalisé, etc.

Noyau intérieur

Les valeurs par défaut du noyau WordPress ont une option dans le back-end, dans la zone Media. Sélectionnez tous les fichiers "non attachés" et vous obtenez une liste.  enter image description here 

Plugin alternatif

Cependant, vous devriez utiliser la solution principale ci-dessus ou penser à utiliser un plugin, qui vérifie toutes ces dépendances, comme Media Cleaner . Je n'ai pas utilisé ce plugin, mais il vérifie plusieurs utilisations d'un fichier multimédia et vous donne un aperçu de vos fichiers multimédia.

0
bueltge