こんにちは、
自分の作っているテーマで、PDFの表示テストを行ってみたんですが、「だくてん付きのファイル.pdf」というファイル名でアップロードしてみました。
おかげで、スタイルのバグは発見できたのですが、表示は特に問題ないようでした。
よろしければ、私のテーマを使って同じような状況になるかどうか テストしてみていただけませんか? おかしなところがあれば教えてください。
https://wordpress.org/themes/raindrops/
スタイルのバグがあるので、
style.cssの 5426行
.safari .pdf-preview, /* この一行を追加してください */
.ie8 .pdf-preview{
height:600px;
}
WordPressの言語設定は、日本語でお願いします。(言語別で処理が異なるので)
$wpmp_conf[‘patch_sanitize_file_name’] = false
は、デフォルトに戻してみてください
トピック投稿者
miya
(@linkstory)
ご連絡ありがとうございます。
いただいた、テーマが同じ環境でいれてみたところ、エラーが出て表示できなかったため、
確認できませんでした。
よろしくお願いします。
-
この返信は7年、 10ヶ月前にmiyaが編集しました。
トピック投稿者
miya
(@linkstory)
試験的に、違うサーバーで、複数のテーマで試してみましたが、同じ状況でsafariのみ表示されない状況です。
日本語 PDF ファイルをアップロードした場合、ファイル名がURLエンコードされないため、safariなどで表示されなくなっているのだと思います。
PHPが書けるようでしたら、以下のフィルターを functions.php に追加してみてください
以下のフィルターは、アップロードしたファイルが日本語の場合、ファイル名を md5 に変更変更します。
md5でなくても、urlencode()
でも大丈夫だとは思いますが、以前のワードプレスでは、マルチバイト文字列の場合md5に変換していた記憶がありますので、とりあえずmd5にしてあります。
function make_filename_hash( $filename ) {
$info = pathinfo($filename);
if( isset( $info['extension'] ) && 'pdf' == $info['extension'] ){
$ext = '.' . $info['extension'];
if( mb_strlen( $filename ) !== strlen( $filename ) ) {
return md5($name) . $ext;
} else {
return $filename;
}
}
return $filename;
}
add_filter('sanitize_file_name', 'make_filename_hash', 11);
いただいた、テーマが同じ環境でいれてみたところ、エラーが出て表示できなかったため、
確認できませんでした。
差し支えなければ、エラーの内容を教えていただけるとうれしいです。
トピック投稿者
miya
(@linkstory)
ご丁寧にご返信ありがとうございます。
いただいた内容をfunction.phpに記述いたしました。
メディアライブラリのファイルが
d41d8cd98f00b204e9800998ecf8427e.pdf
のようになってしまうため、日本語ファイルでの表示をしたいのですが、
そのようなことは可能でしょうか?
よろしくお願い致します。
safariでの表示は、出来るようになったという事でいいですか?
md5でなくても、urlencode()でも、多分大丈夫だと思いますので、メディアライブラリーのファイル名表示する部分で(未テスト)urldecodeしてファイル名を表示する処理を検討してみてください。
トピック投稿者
miya
(@linkstory)
お世話になります。
d41d8cd98f00b204e9800998ecf8427e.pdf
になってしまえば、safariも半角英数字なので問題なく表示されます。
もし、可能であれば教えていただきたいのですが、
md5でなくても、urlencode()でも、多分大丈夫だと思いますので、メディアライブラリーのファイル名表示する部分で(未テスト)urldecodeしてファイル名を表示する処理
はどのようにすればもし教えていただけると嬉しいです。
トピック投稿者
miya
(@linkstory)
テーマの方は、再度インストールしてみたら、問題なくできました。
こちらのミスだったようです。
よろしくお願い致します。
Raindropsテーマが動作するという事なので、
<?php
//追加 start
function raindrops_pdf_send_to_editor( $html, $attachment_id, $attachment ) {
$post = get_post( $attachment_id );
if ( substr( $post->post_mime_type, 0, 15 ) == 'application/pdf' ) {
$check_encoded = get_url_in_content( $html );
if( mb_strlen( $check_encoded ) !== strlen( $check_encoded ) && ! preg_match('!%[0-9A-Z][0-9A-Z]+!', $check_encoded ) ) {
$encoded_url = esc_url( $check_encoded );
$html = str_replace( $check_encoded, $encoded_url, $html );
}
return str_replace( '<a', '<a class="rd-pdf"', $html );
}
return $html;
}
//追加 end
/**
*
*
* @package Raindrops
* @since Raindrops 0.1
*/
if ( !defined( 'ABSPATH' ) ) {
exit;
}
追加 start から 追加 end まで追加していただいて、リンクが動作するかどうか 確認していただけますか?
以前のコードは削除してくださいね
捕捉
PDFへのリンクは、アタッチメントページを前提にしていますが、直接リンクだと上記のコード反映しませんので、良い結果にならないと思いますが、 アタッチメントページでの表示結果をお知らせください。
トピック投稿者
miya
(@linkstory)
ご連絡遅くなりまして申し訳ございませんでした。
恥ずかしながらまだ知識不足のため、アタッチメントページとはどういうことか教えていただいてもよろしいでしょうか。
メディア投稿後、添付ファイルのページを表示の先のページのことでしょうか?
よろしくお願い致します。
アタッチメントページ == 添付ファイルのページ
同じ意味でした。( 英語版だとアッタチメントページ )
リンク先が「メディアファイル」になっていると コードが有効にならないので、やり方をちょっと変える必要があるという意味です。
添付ファイルのページでPDFが表示されるかどうかを確認してください。
トピック投稿者
miya
(@linkstory)
ありがとうございます。
試したところ、1回直接PDFをみてしまうと、その後は何をやってもダメでしたが、先にアタッチメントページででリンクを読み込むとその後は表示されるようになりました。
1回直接PDFをみてしまうと、その後は何をやってもダメでしたが、
URLエンコードされていないPDFを閲覧した時点でキャッシュされてしまうからかなぁ、、、と楽観的に考えると
エンコードする事で何とかなりそうですね。 Raindropsのコードを一般的なコードに置き換えると、
add_filter( 'media_send_to_editor', 'raindrops_pdf_send_to_editor', 10, 3 );
function raindrops_pdf_send_to_editor( $html, $attachment_id, $attachment ) {
$post = get_post( $attachment_id );
if ( substr( $post->post_mime_type, 0, 15 ) == 'application/pdf' ) {//ファイルがPDFの場合
$check_encoded = get_url_in_content( $html );//URLを取得して
if( mb_strlen( $check_encoded ) !== strlen( $check_encoded ) && ! preg_match('!%[0-9A-Z][0-9A-Z]+!', $check_encoded ) ) {
//mb_strlen( $check_encoded ) !== strlen( $check_encoded )は、日本語を簡易判定
//preg_match('!%[0-9A-Z][0-9A-Z]+!', $check_encoded ) 既にエンコードされていないかを確認
$encoded_url = esc_url( $check_encoded );
$html = str_replace( $check_encoded, $encoded_url, $html );//URLを置換
}
return $html;
}
return $html;
}
といった形で対応できると思います。
日本語判定とか、URLエンコードのチェックは、今後PDFファイルのリンクがURLエンコードされた場合に、2重にエンコードされないようにしています。
(esc_url()が2重に使われた時の影響等はちょっと調べていませんが、)
投稿から、メディアファイルへのリンクは、ごくたまに使う程度であれば、
http://www.encodemaniax.com/
等で、ファイル名の部分だけURLエンコードしてしのぐとか、
数が多くなって来たら、the_contentフィルターなどで、日本語PDFのリンクを抽出して、エンコード処理をするフィルタを書くといいと思います。
(暇な時にでも調べてください)
添付ファイルの表示には、Raindropsでは、pdf.php テンプレートを使っています。
テンプレート側では、ファイル名のデコードの処理も出てくると思いますので(リンクのテキスト)それはそれで、頑張ってみてください。
media_send_to_editor というフィルターは、投稿からPDFのリンクを挿入するボタンを押したときに作成されるリンクを改変するフィルターです。
トピック投稿者
miya
(@linkstory)
いろいろとありがとうございます。
いただいた記述は
Parse error: syntax error, unexpected '$encoded_url' (T_VARIABLE) in
と出てうまくできませんでしたが、いただいた内容でもっと勉強して対策しています。