web-dev-qa-db-ja.com

Wordpress:the_contentセクションのURLを自動的に変更する

here の解決策は、問題を解決していません。私はすでに、テーマのフィールドフォームのすべてのリンクを変更するソリューションを持っています。 $example_network_1$example_network_2のように、すべてのネットワークで異なる配列を使用しています。アフィリエイトネットワークごとにPHP foreachを指定しています。

WordPress投稿のコンテンツにこれと同じ配列を使用するソリューションが必要です。

このソリューションは1つのネットワークで機能しますが、YouTube動画で404eエラーが発生しました。 YouTube動画からURLを入力し、WordPressは自動的に埋め込み動画を生成します。次のコードを使用すると、404エラーiframeまたはこのようなもの。

複数のネットワークに対するソリューションが必要です。

私はすべての助けにとても感謝しています!

    $example_network_1 = array(
            array('shop'=>'shop1.com','id'=>'11111'),   
            array('shop'=>'shop2.co.uk','id'=>'11112'),
        );
    $example_network_2 = array(
            array('shop'=>'shop-x1.com','id'=>'11413'), 
            array('shop'=>'shop-x2.net','id'=>'11212'),
        );

    add_filter( 'the_content', 'wpso_change_urls' ) ;
    function wpso_found_urls( $matches ) { 
    global $example_network_1,$example_network_2;   
        foreach( $example_network_1 as $rule ) {
            if (strpos($matches[0], $rule['shop']) !== false) {
                $raw_url = trim( $matches[0], '"' ) ;
                return '"https://www.network-x.com/click/'. $rule['id'].'lorem_lorem='.rawurlencode($raw_url ) . '"';   
             }  

/*
      foreach( $example_network_2 as $rule ) {
            if (strpos($matches[0], $rule['shop']) !== false) {
                $raw_url = trim( $matches[0], '"' ) ;
                return '"https://www.network-y.com/click/'. $rule['id'].'lorem='.rawurlencode($raw_url ) . '"';     
             }  
*/
        }
    }
    function wpso_change_urls( $content ) {
        global $example_network_1,example_network_2;    
           return preg_replace_callback( '/"+(http|https)(\:\/\/\S*'. $example_network_1 ['shop'] .'\S*")/', 'wpso_found_urls', $content ) ;
    //     return preg_replace_callback( '/"+(http|https)(\:\/\/\S*'. $example_network_2 ['shop'] .'\S*")/', 'wpso_found_urls', $content ) ;
        }
4
Grischa

テストなしでソリューションを作成しました。あなたのコードはあなたのサイトなしでテストするのは難しいですが、問題は正規表現にあると思います。コールバックはデバッグが困難です。以下の私のバージョン。

まず、構造を変更します。ドメインはユニークだと思います。 1次元配列の方が便利です。

$domains =  array(
            'shop1.com'=>'11111',   
            'shop2.co.uk'=>'11112',
            'shop-x1.com'=>'11413', 
            'shop-x2.net'=>'11212',
        );

次:

$dangerouschars  = array(
  '.'=>'\.',

);
function wpso_change_urls( $content ) {
   global $domains,$dangerouschars;
   foreach($domains as $domain=>$id){
      $escapedDomain = str_replace(array_keys($dangerouschars),array_values($dangerouschars), $domain);

     if (preg_match_all('/=\s*"(\s*https?:\/\/(www\.)?'.$escapedDomain.'[^"]+)\s*"\s+/mi', $content, $matches)){
        // $matches[0] - ="https://example.com"
        // $matches[1] - https://example.com
        for($i = 0; $i<count($matches[0]); $i++){
                $matchedUrl = $matches[1][$i];
                $url = rawurlencode($matchedUrl);
                //is very important to replace with ="..."
                $content = str_replace($matches[0][$i], "=\"https://www.network-x.com/click/{$id}lorem_lorem={$url}\" ", $content);
        }
     }
   }
   return $content;
}

スクリプト例

0
writ3it

Wpの自動埋め込みが機能しない場合は、この行をテーマに追加してくださいfunctions.php

remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );
0
kaize