web-dev-qa-db-fra.com

l'utilisation de wp_insert_attachment () permet d'obtenir des guides avec des noms de fichiers différents du même fichier lorsqu'ils sont téléchargés via la page multimédia dans admin.

J'essaie de créer un plugin qui, dans le cadre de sa tâche, télécharge des fichiers CSV sur l'installation WordPress. Décidant d'intégrer le plus étroitement possible en utilisant les fonctions wordpress autant que possible, j'enregistre le fichier téléchargé dans le bon dossier wordpress actuel (à l'aide de la fonction wp_upload_dir ()).

Je suis ensuite ajouter le téléchargement dans la table des messages en tant que pièce jointe afin que les utilisateurs puissent le gérer via la page multimédia. Ceci est fait avec la fonction de construction wp_insert_attachment (). C'est là que les choses semblent aller mal.

Fondamentalement, les noms de fichiers que j’analyse dans la fonction contiennent des espaces, mais lorsque je regarde les valeurs GUID dans la table des publications, les espaces ont été supprimés. Si j'ajoute le même fichier via l'interface de la page wordpress media, les espaces sont remplacés par des traits d'union. Je comprends pourquoi wordpress ajoute des traits d'union pour rendre l'url du fichier plus sûr dans les anciens navigateurs qui ne géraient pas bien les espaces. Cependant, pourquoi cet espace est-il supprimé lorsque j'analyse wp_insert_attachment?

Donc pour confirmer; le téléchargement de "Work Spreadsheet.csv" via l’interface wordpress entraîne l’attente d'un GUID sur

http://domain.com/wordpress/wp-content/uploads/2013/11/Work-Spreadsheet.csv

Cependant via mon code plugin

http://domain.com/wordpress/wp-content/uploads/2013/11/WorkSpreadsheet.csv

La table wp_postmeta contient également des traits d'union et le chemin du dossier relatif: 2013/11/Work-Spreadsheet.csv

Où que pour les envois via mon code son sans le chemin du dossier et le nom du fichier n'est pas modifié de mon original: Work Spreadsheet.csv

Quelqu'un peut-il aider à expliquer pourquoi cela pourrait se produire? Le code juste avant d'utiliser wp_insert_attachment () est ci-dessous à titre de référence .. Juste pour dire; J'ai essayé avec d'autres types de fichiers, tels que des images, au cas où il s'agirait de télécharger des fichiers texte, mais les résultats sont les mêmes.

$attachment = array(
'guid' => $upload_dir_array['url'] . '/' . basename( $destination_name ), 
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($destination_name)),
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $destination_name );
// for the function wp_generate_attachment_metadata() to work
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id,$upload_dir.$destination_name );
wp_update_attachment_metadata( $attach_id, $attach_data );
1
AdamJones

Alors j'ai compris cela.

La fonction wp_insert_attachment () nettoie les noms de fichiers analysés. Au cours du processus, il supprimait des espaces dans les noms de fichiers. Pour éviter cela, j'ai fait ma propre désinfection (en utilisant toujours les fonctions WP) avant d'analyser les noms de fichiers.

J'ai renommé mes fichiers avec sanitize_file_name () et cela a ajouté des traits d'union (ce que je désirais vraiment) dans tous les espaces des noms. Puis, plus tard dans le code, lorsque j'analyserai les détails dans wp_insert_attachment (), les noms de fichiers ne seront pas modifiés et ils resteront avec les traits d'union.

1
AdamJones