web-dev-qa-db-ja.com

投稿の画像のURLをcdnの画像のURLに変更する方法は?

何らかの理由で私のホスティング会社が私のサイトのSQL使用率がピークに達し続けるためにW3トータルキャッシュまたはW3スーパーキャッシュを使用すると修正できない....そして急増するサーバーでは時々遅れて取得します。

そのために私はそれが完璧に働くのでキャッシュのためにハイパーキャッシュプラグインを使わなければなりません、しかしこのプラグインはcdnをサポートしません..私はmaxcdnからcdnサービスを買いましたがそのために私はw3合計キャッシュかスーパーキャッシュを使わなければなりません.. 。

だから私は自動的に例えばから投稿画像のURLを変更する方法を探しています: http://www.sitename.com/wp-content/uploads .....から http:// cdn .sitename.com/wp-content /アップロード ...

出来ますか ?もしそうなら助けてください。前もって感謝します

1
Ayaz Malik

the_contentの中の画像は正規表現で解析できます。しかし、常に負荷がありゆっくりしています。データベース内のpost_saveの後に画像のURLを変更するか、データベース内の現在の投稿を変更してカスタムCDNを作成するかもしれません。その速い方法とすべてのキャッシングプラグインは、彼女がコンテンツを解析しなければならないという点で、破綻しています。 WPのカスタムCDNの背景については、 この回答を参照してください

1
bueltge

画像が同じ場所にあり、サブドメインだけを変更したい場合は、.htaccess RewriteRuleが最も簡単です。

ルールが画像にのみ適用される場合、

RewriteCond   %{HTTP_Host}   =www.sitename.com
RewriteRule   ^.+\.(jpe?g|png|other|img|ext)$   http://cdn.sitename.com/$0   [nocase,redirect=temp,last]

画像にRewriteCondテストを追加することもできますが、RewriteCondで行われるテストは、RewriteRuleで1回行うのと同じリソースを使用します。

uploadsディレクトリ内のすべてをリダイレクトすることもできます。 cdn.sitename.comが同じ.htaccessルールセットを通過する場合は、RewriteCondステートメントを含めます。

RewriteCond   %{HTTP_Host}   =www.sitename.com
RewriteRule    ^wp-content/uploads/.+$   http://cdn.sitename.com/$0   [nocase,redirect=temp,last]

[リダイレクト=一時]または[リダイレクト=永久]。よく[R = 302]や[R = 301]と書かれています。

Apache mod_rewriteのドキュメント

(自動構文ハイライト/フォーマットは.htaccessを念頭に置いて設計されていません:-)

乾杯、
グレゴリー

3
Gregory

このプラグインを見ましたか? http://wordpress.org/extend/plugins/cdn-rewrites/ /

プラグインの説明から:

基本的に、このプラグインはWordPressユーザーが2つの重要な変数を指定することを可能にします:orgin Host(あなたのサイト)と "destination host"(cdn Host)。それはそれからその起源ホストからのすべての静的コンテンツを見つけ、それらがそこから配達されるように目的地にそれらを書き換えるでしょう。

これはあなたが必要なもののようですか?

------------------------------ EDIT

プラグインの使用を避けようとしているなら、ここでそれについての素晴らしい記事があります: http://www.cyberciti.biz/tips/wordpress-cdn-content-delivery-network-configuration.html

しかし、私はこの方法を試したことがありません。しかし、それはきれいな解決策のように見えます。

3
Starfs

img srcの変更をハードコードしたいのなら、これがあなたのための関数になるでしょう。 wp_update_post($ post) ;影響を受けたいすべてのpostとpost_typeを通過するループと組み合わせて、 preg_replace を使用してsrcのURLを置き換えます。

テンプレートをページに割り当て、ソースURLを更新するときはいつでもページをロードし、他の人がコードを実行するのを許可したくないときはいつでもページを削除します。

grep_replace()の検索/置換パターンは次のようになります。

検索:(<img [^>]*?src=['"]https?://)www\.sitename\.com
を置き換える:$1cdn.sitename.com

より具体的には:

検索:(<img [^>]*?src=['"]https?://)www(\.sitename\.com/wp-content/uploads/)
を置き換える:$1cdn$2

変更を元に戻す必要がある場合は、wp_update_post()が自動的にリビジョンを作成しますが、ページをロードする前にデータベースをバックアップしてください。

私は最初にループのwp_update_post()とpreg_replace()の組み合わせを、限られた発見された投稿のセットでテストし、おそらくは対象の投稿のIDを配列で指定してその配列をたどっていきます。

追加のオプションとして、新しい一時カテゴリ「CDN Updated」を作成し、更新しながら各投稿に新しいカテゴリを割り当てることができます。その後、このカテゴリ用語を含む投稿を今後の更新クエリから除外することができます。これの1つの小さな不利な点は、後でそのカテゴリを削除しても、値はデータベース内の各投稿に対して保存されることです(私が間違っている場合は修正してください)。

乾杯、
グレゴリー

1
Gregory

pre_post_updateアクションにフックすることもできます。

これの利点はあなたのサーバーが一度だけURLを交換する必要があるということです - それであなたは配送時に書いたstr_replaceスクリプトをいつも使うのではなく保存時に使います。

私はあなたが自分自身を置き換えることに慣れていると思いますので、この関数にあなたの関数を入れてください。

add_action('pre_post_update', 'change_image_urls', 10 );

function change_image_urls( $post_id ) {

    // your function here...

    // $post = get_post( $post_id );

}
0
fischi