WordPressの都市(地域、国)による地域ターゲティング

作成する理由



最近、ワードプレスのサイトの都市ごとにジオターゲティングを行うように依頼されました。 既存のジオターゲティングプラグイン(有料プラグインを含む)を確認したところ、都市(国のみ)で動作するものは1つも見つかりませんでした。 そのため、IPアドレスで場所を特定するために既存のベースを使用して、独自に作成することにしました。 最初はテンプレートの関数を開発することから始めましたが、プラグインを作成してgithubに置くことにしました。他の人にとっては便利だと思うからです。



ベース選択



最初のステップは、ベースを選択することでした。 そして、これはおそらく最も難しい問題の1つです。 開発プロセスでは、多くのオプションを試し、IPで場所を特定するサイトにCURLリクエストを行い、それらを解析しました。 しかし、それらはすべて不正確でした。たとえば、1つのモスクワIPはモスクワと定義され、もう1つは単にロシアでした。 また、プラグインがロシアだけでなく、ベラルーシやウクライナでも機能する必要がありました。 多数のデータベースを試した後、Sypex Geoに決めました。 彼らはデータベースのシェアウェアと無料版を持っています。 シェアウェアはREST APIを使用し、xml、json、jsonpの形式でデータを返します。 無料はファイルとしてダウンロードできます。また、クラスをダウンロードして操作することもできます。 シェアウェアのバージョンはより正確ですが、無料でリクエストできるのは10,000件のみです。 無料版も十分正確で、サイトで更新されます。



機能的



すでに書いたように、私はプラグインではなく、テンプレート内の関数から始めました。 最初は、データベースのシェアウェアバージョンについてだけ考えましたが、無料リクエストの数は1〜2日で終了しました。 そのため、データベースファイルを操作するための既製のクラスを使用して、無料のものに切り替えました。



プラグインを開発するとき、ローカルデータベースとREST APIのどちらかを選択することにしました。 将来、データベースを自動的に更新するボタンを作成する予定です。



また、データベースから、都市(国、地域)のロシア語と英語の名前を返すことができます。 この点で、彼は言語の選択をしました。

また、いくつかの都市のリストを含める必要がある、またはその逆にいくつかの都市を除外する必要があるという事実に遭遇しました。





管理パネルでプラグインを構成する



実装



私はWordpressで作業することはほとんどなく(すべてのCMSと同じように)、プラグインの作成に取り組んだことがないため、それらの作成方法を読み、既存のプラグインがどのように機能するかを確認しました。 既存の地理プラグインから実装のアイデアを取り入れました。 長い間、私は機能的またはオブジェクト指向で書くことを考えていました。 プラグインは大きくないため、機能的に決定しました。



彼の作品について簡単に説明します。



プラグインをアクティブにするときに、データベースのタイプと名前を入力する言語の2つのオプションを開始します。



register_activation_hook(__FILE__, 'wp_sypexgeo_activation'); function wp_sypexgeo_activation() { update_option('sgeo_language', 'en'); update_option('sgeo_dbase', 'loc'); }
      
      





次へ
  add_filter('the_content', 'geotargeting_filter'); add_filter('the_content_rss', 'geotargeting_filter'); add_filter('the_excerpt', 'geotargeting_filter'); add_filter('the_excerpt_rss', 'geotargeting_filter');
      
      



関数を呼び出す
geotargeting_filter
 function geotargeting_filter($s) { //parse Country preg_match_all("#\[" . GEOTARGETING_COUNTY . "\s*(in|out)=([^\]]+)\](.*?)\[/" . GEOTARGETING_COUNTY . "\]#isu", $s, $country); //parse Country preg_match_all("#\[" . GEOTARGETING_REGION . "\s*(in|out)=([^\]]+)\](.*?)\[/" . GEOTARGETING_REGION . "\]#isu", $s, $region); //parse Country preg_match_all("#\[" . GEOTARGETING_CITY . "\s*(in|out)=([^\]]+)\](.*?)\[/" . GEOTARGETING_CITY . "\]#isu", $s, $city); if (empty($country) && empty($region) && empty($city)) { return $s; } $base_type = get_option('sgeo_dbase'); if ($base_type == 'loc') { $ipdata = getLocInfo(); } elseif ($base_type == 'rm') { $ipdata = getRemInfo(); } if (!empty($country)) { foreach ($country[0] as $i => $raw) { $type = strtolower($country[1][$i]); $countries = strtolower(trim(str_replace(array("\"", "'", "\n", "\r", "\t", " "), "", $country[2][$i]))); $content = $country[3][$i]; $countries = explode(",", $countries); $replacement = ""; if ((($type == "in") && in_array($ipdata['country'], $countries)) || (($type == "out") && !in_array($ipdata['country'], $countries))) { $replacement = $content; } $s = str_replace($raw, $replacement, $s); } } if (!empty($region)) { foreach ($region[0] as $i => $raw) { $type = strtolower($region[1][$i]); $regions = strtolower(trim(str_replace(array("\"", "'", "\n", "\r", "\t"), "", $region[2][$i]))); $content = $region[3][$i]; $regions = explode(",", $regions); $replacement = ""; if ((($type == "in") && in_array($ipdata['region'], $regions)) || (($type == "out") && !in_array($ipdata['region'], $regions))) { $replacement = $content; } $s = str_replace($raw, $replacement, $s); } } if (!empty($city)) { foreach ($city[0] as $i => $raw) { $type = strtolower($city[1][$i]); $cities = strtolower(trim(str_replace(array("\"", "'", "\n", "\r", "\t", " "), "", $city[2][$i]))); $content = $city[3][$i]; $cities = explode(",", $cities); $replacement = ""; if ((($type == "in") && in_array($ipdata['city'], $cities)) || (($type == "out") && !in_array($ipdata['city'], $cities))) { $replacement = $content; } $s = str_replace($raw, $replacement, $s); } } return $s; }
      
      



現在のコンテンツの提供先。 データベースのタイプに応じて、データを取得するための関数が呼び出されます。 次に、テンプレート内の特別なタグを検索し、それらを位置データと一致させます。 データが一致する場合、デザインはタグのコンテンツに置き換えられ、一致しない場合は削除されます。



使用する



国のリストを指定するには:
 [GeoCountry in=Belarus,Russia] Belarus,Russia![/GeoCountry]
      
      





地域のリストを指定するには:
 [GeoRegion in=Moscow] Moscow Region![/GeoRegion]
      
      





都市のリストを指定するには:
 [GeoCity in=,] ,![/GeoCity]
      
      





表示されている国以外の国(地域、都市)を選択する場合は、「out」を使用します。
 [GeoRegion out=Minsk,Brest] ,  Minsk,Brest![/GeoRegion]
      
      







テンプレートでの使用例:



WordPressへようこそ。 これが最初の投稿です。 編集または削除して、書いてください! 連絡先:[GeoCity in = Minsk] +375295552255 [/ GeoCity] [GeoCity out = Minsk] +375475552255 [/ GeoCity]



おわりに



私のプラグインが誰かに役立つことを願っています。 質問や提案があれば-書いてください。 また、誰かが別のベース(ジオサービスなど)を使用する必要があると考えている場合は、追加するか、自分で追加することを提案します。



プラグインへのリンク: wp-sypexgeo



All Articles