web-dev-qa-db-ja.com

wp_insert_attachment()を使用すると、adminのメディアページでアップグレードしたときに、同じファイルとは異なるファイル名を持つguidが生成されます。

その作業の一環としてcsvファイルをwordpressインストールにアップロードするプラグインを作成しようとしています。可能な限りワードプレス機能を使用してできるだけ緊密に統合することを決定します(wp_upload_dir()関数を使用して)アップロードしたファイルを現在の正しいワードプレスフォルダに保存します。

次に、アップロードを添付ファイルとしてpostsテーブルに追加して、ユーザーがメディアページでそれを管理できるようにします。これは、組み込み関数wp_insert_attachment()で行われています。これは物事がうまくいかないようです。

基本的に私が関数を解析するファイル名はそれらの中にスペースを持っています、しかし私がpostsテーブルの中のGUID値を見るときスペースは取り除かれました。同じファイルをワードプレスのメディアページインターフェースで追加すると、スペースはハイフンに置き換えられます。スペースをうまく扱えない古いブラウザでは、ワードプレスがファイルのURLをより安全にするためにハイフンを追加する理由は理解できますが、wp_insert_attachmentを解析するとスペースが削除されるのはなぜですか?

そう確認するために。ワードプレスインターフェースを介して "Work Spreadsheet.csv"をアップロードすると、予想されるGUID ofが発生します。

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

しかし私のプラグインコードを介して

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

また、wp_postmetaテーブルでは、ワードプレスインターフェイス経由でアップロードされた場合のmeta_key "_wp_attached_file"の値にハイフンが追加され、相対フォルダーパスが2013/11/Work-Spreadsheet.csvになります。

私のコードでアップロードするのは、フォルダパスとファイル名なしで、私のオリジナルから変更されていない場合:Work Spreadsheet.csv

なぜこれが起きているのか、誰かが手助けできますか? wp_insert_attachment()を使用する直前のコードは、参考として以下に示しています。テキストファイルのアップロードと関係がある場合に備えて、画像など他の種類のファイルを試してみましたが、結果は同じです。

$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

だから私はこれを考え出した。

関数wp_insert_attachment()は、解析されたファイル名をサニタイズします。その過程で、ファイル名の中のスペースが削除されました。これを避けるために、私はファイル名を解析する前に私自身のサニタイズ(まだWP関数を使って)をしました。

私はsanitize_file_name()を使用して私のファイルの名前を変更し、これはハイフン(私が本当に望むもの)を名前のすべてのスペースに追加しました。それからコードの後半で詳細をwp_insert_attachment()に解析するとき、ファイル名の変更は行われず、ハイフンのままになります。

1
AdamJones