サポート » 使い方全般 » メディアアップロード先を取得する関数について

  • 解決済 annchan

    (@annchan)


    二つのレンタルサーバーを借りて、Wordpressをインストールするサーバー(サーバーA)と、画像などのメディアをアップロードするサーバー(サーバーB)を分けたいと思い、https://github.com/pontusab/wp-ftp-media-libraryのプラグインを使用したのですが、問題が発生してしまいました。

    メディアをアップロードする先をサーバーBに変更することはできましたが、サイトのヘッダーに表示されているユーザーのアバターのパスもサーバーB(serverB.com/avatar/)に代わってしまい、サーバーA(serverA.con/wp/wp-content/uploads/avatar/)に保存してある各ユーザーのアバターが表示されなくなってしまいました。(テーマのPHPのせいか、ユーザーとして新たにアバターをアップロードページからアップロードすると現在もサーバーAに保存されます。サーバーBへは投稿用の画像のみアップロードする予定でしたので、これはこのままでいいと考えています。)

    そこで、Header.phpにあるアバターを表示する部分を確認してみると、get_avatar_urlの関数が使用されていました。wp-content/link-template.phpにあるget_avatar_urlの中身を消したりしてみると、確かに出力されるURLが消えたりしたので、ここを編集するとうまくアバターのパスがサーバーB(serverB.com/avatar/〇〇)からサーバーA(serverA.com/wp/wp-content/uploads/avatar/〇〇)に変更できるのではないかと考えているのですが、このような事例は無いのか、どこをどういじればいいのかわかりません。解決できそうな方法を教えていただけないでしょうか。

    アップロード先を変える、サーバーBにPiwigoやZenPhotoなどをインストールしてプラグインで連携させる、サーバーBにFTPでアップロードして手動でURLを張り付けるなど、いろんな方法をここ一週間くらい調べてみましたが、全部うまくいかずお手上げの状態です。なにか手掛かりがみつかればいいなと思っています。よろしくお願いいたします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • gblsm

    (@gblsm)

    そのプラグイン wp-ftp-media-library は、アップロード先を強制的に変更するための WordPress のオプション upload_url_path を書き換えています(このオプションは普通、管理画面では設定できない)。ですから、アバター画像ファイルのアップロード先もサーバーBに変わるのが自然だと思います。

    でもそうならないのは、アバターをアップロードするテーマ(それともプラグイン?)が、アップロードするときにオプション upload_url_path を無視しているみたいですね。
    WordPress標準では、Gravatarのアバター画像を使うので、テーマ(それともプラグイン)におそらく独自の「アバター画像を表示するコード」が組み込まれているのでは…と思います。(そのコードは upload_url_path を参照しているっぽい。)
    その場合は、そのコードを調べるのが近道な気がします。

    gblsm

    (@gblsm)

    追記します。
    関数 get_avatar_url は普通は Gravatar サーバーの画像URLを返します。
    独自にアップロードしたアバター画像のurlが(サーバーBになってしまっているのはともかく)返されているのは、推測ですが、関数が返す値を変更できるフィルター get_avatar_url に、テーマ(もしくはプラグイン)が独自のコードをフックしているのではないかと思います。

    トピック投稿者 annchan

    (@annchan)

    gblsm様

    ご返信いただき、ありがとうございます。
    未設定の場合はGravatarのURLで、自分でアバター画像をアップロードすると、サーバーAのURLに代わるので、テーマのどこかにアバターのアップロードに関するコードがありそうですね。

    (テーマのheader.php)
    <img src=”<?= theme_cache::get_avatar_url(theme_cache::get_current_user_id());?>”

    ヘッダーのアバター表示部分のPHPはこのようなコードになっていて、強引ですが、src=””の部分をserverA.com/wp/wp-content/uploads/avatar/theme_cache::get_current_user_id().jpgのようにしてみたら画像が表示されたので、get_current_user_idでユーザーのIDを取得して、それをget_avatar_urlでそのURLを取得しているのかなと思ったのですが、get_avatar_url関数で出力されるURLは、upload_url_pathのURLをもとにされているんでしょうか。

    できることならget_avatar_url(get_avatar_data)だけupload_url_pathをサーバーAのパスに変えたいですが、無理やり変えてしまっている以上どうやらそれはできそうになさそうですね。(;;)

    • この返信は6年前にannchanが編集しました。
    トピック投稿者 annchan

    (@annchan)

    gblsm様

    ご返信ありがとうございます。
    get_avatar_urlはGravatarのみの関数なんですね。そういわれてみると確かに、テーマと関係のないWPの関数にそのような記述があるわけないですよね。気が付きませんでした。

    数日前、コアファイルに手を出す前に、テーマに入っているPHPでavatarと検索したりして、アバター関連の記述を探して、テーマのほうにget_avatar_urlという記述があり、それをいじったり丸ごと消したりして挙動を見てみたのですが、特に変化がなかったのでよくわからず放置していました。

    gblsm

    (@gblsm)

    お使いのテーマとプラグイン、それからアバター画像をアップロードする手順、表示させる手順がわかれば、もう少しアドバイスが得られるかもしれませんよ。(テーマやプラグインが有料のものだと無理ですが。)

    トピック投稿者 annchan

    (@annchan)

    gblsm様

    親切にしていただき本当にありがとうございます。(;;)

    テーマを調べていたところ、このphpファイルがアバターURL取得に関係しているのではないかと考えています。
    https://wandbox.org/permlink/nlwB2zHXGbLQw7Pc

    アバターをアップロードする手順は、アップロードページにて、ボタンを押したらエクスプローラーが開いて、画像を選ぶといった手順です。アップロードするボタンは、デベロッパーツールではこのように記述されています。

    プラグインは特に何も使用していない状態です。

    何かヒントをいただけたら嬉しいです。

    gblsm

    (@gblsm)

    「デベロッパーツールではこのように記述されています。」から後の部分がおかしくなっています。フォーラムへコードを掲載するときは、貼り付けたコード部分を範囲選択した状態で code ボタンを押しましょう。するとコード部分が逆シングルクォートで囲まれて、おかしくならずに投稿できます。

    さて「このphpファイルが」というコードを拝見しましたが、これは公開して大丈夫なものなのですよね?
    大丈夫なら(ライセンスが例えばGPLならOK)テーマの入手先を教えてください。

    phpファイルの最後の部分に関数 get_avatar_from_meta があります。
    その中で下記のコード:

    if(strpos($meta,'http') === false || strpos($meta,'//') === false){
    	static $baseurl;
    	if(!$baseurl)
    		$baseurl = wp_upload_dir()['baseurl'];
    	
    	$caches[$user_id] = $baseurl . $meta;
    }else{
    	$caches[$user_id] = $meta;
    }
    return $caches[$user_id];
    

    が、アバター画像のURLの先頭に wp_upload_dir() の baseurl 要素を付けています。
    これが、普通のWordPressなら自分(サーバーA)の http何々 を示しますが
    プラグイン wp-ftp-media-library を入れるとサーバーBの http何々 に変わってしまいます。

    トピック投稿者 annchan

    (@annchan)

    gblsm 様

    投稿後確認しなかったので、気が付きませんでした。申し訳ございません。
    wp-upload_dir調べて、サーバーAのパスと置き換えることで問題を解決することができました。大きなヒントを与えていただき本当にありがとうございます。

    恥ずかしながらこの問題に5日くらい躓いていたので、本当に助かりました。PHPはほとんど知識が無かったので、これから知識を付けていきたいと思います。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「メディアアップロード先を取得する関数について」には新たに返信することはできません。