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 ?
Oui, vous pouvez le faire! Est-ce simple/facile? En quelque sorte ... Est-ce rapide et évolutif? Oh mon dieu non ????.
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)
Quelques facteurs pourraient réduire le coût de cette fonction:
url_to_postid
. De plus, cela ne fonctionne qu'avec les GUID, d’où le compromis précisionInterrogez 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:
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.
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.
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.
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.