Wordpress カスタマイズ

WordPressで日本語のファイル名をアップロードする方法

Wordpressにおける日本語ファイル名の変換

WordPressを使ってCMSを構築し、納品した後、メディアファイルでエクセルや、PDFファイルをアップロードした際、「文字化けする!」といわれる事がありました。

英数字で名前を付けてアップロードしてください。というのは簡単ですが、サイトを利用するユーザーからするとダウンロードしたファイルは日本語の方が扱い易いというユーザーも一定数いるはずです。
そういった場合、なんとか対処できないか調査した結果です。

WP Multibyte Patchで日本語ファイル名が文字化け

見だしに文字化けと書きましたが、実は、文字化けしている訳ではなく、「WP Multibyte Patch」プラグインを有効化していると日本語ファイル名をmd5ハッシュ値に変換し、サニタイズ化しているからだそうです。

このサニタイズ化を無効にし、日本語ファイル名をそのまま利用するには以下のように設定します。

  1. /wp-content/plugins/wp-multibyte-patch/wpmp-config-sample-ja.php を/wp-content/ 直下にコピー
  2. コピーした、wpmp-config-sample-ja.phpを wpmp-config.phpというファイル名に変更
  3. wpmp-config.php を編集し、$wpmp_conf[‘patch_sanitize_file_name’] の値をtrueからfalseに変更
/* 機能を個別に有効化、無効化できます。有効化するには true を、無効化するには false を指定してください。 */
$wpmp_conf['patch_wp_mail'] = true;
$wpmp_conf['patch_incoming_trackback'] = true;
$wpmp_conf['patch_incoming_pingback'] = true;
$wpmp_conf['patch_wp_trim_excerpt'] = true;
$wpmp_conf['patch_wp_trim_words'] = true;
$wpmp_conf['patch_get_comment_excerpt'] = true;
$wpmp_conf['patch_dashboard_recent_drafts'] = true;
$wpmp_conf['patch_process_search_terms'] = true;
$wpmp_conf['patch_admin_custom_css'] = true;
$wpmp_conf['patch_wplink_js'] = true;
$wpmp_conf['patch_word_count_js'] = true;
$wpmp_conf['patch_force_character_count'] = true;
$wpmp_conf['patch_force_twentytwelve_open_sans_off'] = true;
$wpmp_conf['patch_force_twentythirteen_google_fonts_off'] = false;
$wpmp_conf['patch_force_twentyfourteen_google_fonts_off'] = false;
$wpmp_conf['patch_force_twentyfifteen_google_fonts_off'] = false;
$wpmp_conf['patch_sanitize_file_name'] = false; //ここをTrueからfalseに変更
$wpmp_conf['patch_bp_create_excerpt'] = false;

これで日本語ファイル名をアップロードした際に、Wordpress上でも日本語で表示されます。

[参考記時]
[WordPress] WordPressで日本語名のファイルをアップロードする

サーバー移行時に日本語ファイル名の画像がリンク切れになる

私がWordpressのサーバー移行作業を受け持った案件で、なぜか日本語ファイル名だけが404エラーになるという現象がありました。

この場合、Filezillaでの転送設定を「UTF-8強制」にするときちんと表示出きるようになりました。

推測ですが、移行元のサーバーは文字コードがUTF-8で、私はWindowsで作業をしているので、FTPでダウンロードした際、Shift-jisに変換され、新サーバーにはShift-jisの文字コードのファイル名でアップロードされた事が原因だと思います。

Filezillaでファイル名の文字コードをUTF-8に強制する

Filezillaでファイル名の文字コードをUTF-8に強制する

WordPressのマルチサイトで子サイトのフィードを取得する

Wordpressのマルチサイト環境下で子サイトのフィードを取得

WordPressはマルチサイト環境下だと、フィード配信をすべてのブログが独立して行います。

マルチサイトを利用する際、親サイトのフィードに子ブログのフィードも含めたいという事もあるでしょうが、通常の方法ではできないようです。

そこで、ちょっと力業ですが、株式会社DOE様の投稿にあった、WordPressで複数ブログの投稿・カスタム投稿を一覧表示するを元に設定してみました。

フィード用のテンプレートをカスタマイズする準備

まずは、フィード用テンプレートを独自にカスタマイズできるように、functions.phpでテンプレートファイルの場所を指定し直します。

if($blog_id =="1"){

remove_filter('do_feed_rss2', 'do_feed_rss2', 10);

function custom_feed_rss2(){
  $template_file = '/feed-rss2.php';
  load_template(get_stylesheet_directory() . $template_file);
}

add_action('do_feed_rss2', 'custom_feed_rss2', 10);
}

dogmap.jp様の各種フィード用テンプレートの変更を元に書き換えました。

最初の$blog_id ==”1″で親ブログの場合のみ、独自テンプレートを読み込むように指定します。
load_template(get_stylesheet_directory() . $template_file);としているのは、私が子テーマを利用しているためです。

フィードを読み込むマルチサイトのブログIDを記入

次にfunctions.phpに以下の関数を貼り付けます。

function blog_id_arr() {
  $arr = array(1,3);//IDを配列で指定
  return $arr;
}

IDを指定して返すだけのコードですが、後述するfeed-rss2.phpを修正する必要を減らしたいとうだけで分離させました。

array()の中にフィードを取得したいブログのIDをカンマ区切りで指定して下さい。

次に/wp-includes/feed-rss2.phpを利用しているテンプレートディレクトリにコピーし、編集します。

feed-rss2.phpを編集する

while文の削除と、コードの挿入

81行目にあるwhile( have_posts()) : the_post();を削除します。

以下のようになっているので、do_action( ‘rss2_head’);が目印です。

do_action( 'rss2_head');

while( have_posts()) : the_post();

削除した場所に以下のコードを代わりに挿入します。

$sql = '';
$blog_id_arr = blog_id_arr();//取得するブログIDを取得
$tmp = $blog_id_arr;
foreach($blog_id_arr as $b_id){
    next($tmp);
    switch_to_blog($b_id);
    $sql .= <<posts
WHERE (post_type = 'post')
AND post_status = 'publish')
HERE;

    if(current($tmp) !== false){
        $sql .= "UNION\n";
    }
    restore_current_blog();
}
$sql .= "ORDER BY post_date DESC LIMIT ".get_option('posts_per_rss')."\n";
$posts = $wpdb->get_results($sql);//記事のセットを取得

foreach ($posts as $post):
    switch_to_blog($post->blog_id);
    setup_postdata($post);

そして、feed-rss2.phpの末尾にある endwhileを以下のように書き換えます。

<?php endforeach; //endwhile; ?>

フィード配信のテスト

http://example.com/feed/ と http://example.com/child/feed/ にアクセスし、親ブログの投稿に子ブログのフィードの内容が追加されているか確認してください。