2012-06-20 39 views
1

我已經使用Wordpress構建了一個網站。發佈/更新Wordpress頁面上的運行代碼

我有一個具有以下代碼的模板,它對地址進行地理編碼並將結果保存到新數據庫中。

然後我有另一個模板,從新數據庫中讀取所有緯度/經度,並在Google地圖上繪製數百個標記。

問題是僅當有人訪問該頁面時纔會發生地理編碼。這會產生一些問題 - 1)每當有人訪問該頁面時,都會對其進行地理編碼。 2)只有當有人訪問該頁面時才進行地理編碼!

當Wordpress發佈/更新頁面時,有沒有辦法一次運行這段代碼?

本節抓起從WordPress的公司信息,並將其插入到數據庫:

$company = get_field('company_name'); 
    $address = get_field('address'); 
    $city = get_field('city'); 
    $post_code = get_field('post_code'); 

    $sql = sprintf("select count('x') as cnt from markers where `name` = '%s'", mysql_real_escape_string($company)); 
    $row_dup = mysql_fetch_assoc(mysql_query($sql,$con)); 
    if ($row_dup['cnt'] == 0) { 
     mysql_query("INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('".$company."', '".$address.", ".$city.", ".$post_code."', '0.0', '0.0', '')"); 
} 
wp_reset_query(); 

下面是完整的代碼:

<?php 
    require("database.php"); 
    // Opens a connection to a MySQL server 
    $con = mysql_connect("localhost", $username, $password); 

    if (!$con) 
    { 
     die('Could not connect: ' . mysql_error()); 
    } 

    mysql_select_db("medicom_wp", $con); 


     $company = get_field('company_name'); 
     $address = get_field('address'); 
     $city = get_field('city'); 
     $post_code = get_field('post_code'); 

     $sql = sprintf("select count('x') as cnt from markers where `name` = '%s'", mysql_real_escape_string($company)); 
     $row_dup = mysql_fetch_assoc(mysql_query($sql,$con)); 
     if ($row_dup['cnt'] == 0) { 
      mysql_query("INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('".$company."', '".$address.", ".$city.", ".$post_code."', '0.0', '0.0', '')"); 
    } 
    wp_reset_query(); 


    define("MAPS_HOST", "maps.google.com"); 
    define("KEY", ""); 

    // Opens a connection to a MySQL server 
    $connection = mysql_connect("localhost", $username, $password); 
    if (!$connection) { 
     die("Not connected : " . mysql_error()); 
    } 

    // Set the active MySQL database 
    $db_selected = mysql_select_db($database, $connection); 
    if (!$db_selected) { 
     die("Can\'t use db : " . mysql_error()); 
    } 

    // Select all the rows in the markers table 
    $query = "SELECT * FROM markers WHERE 1"; 
    $result = mysql_query($query); 
    if (!$result) { 
     die("Invalid query: " . mysql_error()); 
    } 

    // Initialize delay in geocode speed 
    $delay = 0; 
    $base_url = "http://" . MAPS_HOST . "/maps/geo?output=xml" . "&key=" . KEY; 

    // Iterate through the rows, geocoding each address 
    while ($row = @mysql_fetch_assoc($result)) { 
     $geocode_pending = true; 

     while ($geocode_pending) { 
     $address = $row["address"]; 
     $id = $row["id"]; 
     $request_url = $base_url . "&q=" . urlencode($address); 
     $xml = simplexml_load_file($request_url) or die("url not loading"); 

     $status = $xml->Response->Status->code; 
     if (strcmp($status, "200") == 0) { 
      // Successful geocode 
      $geocode_pending = false; 
      $coordinates = $xml->Response->Placemark->Point->coordinates; 
      $coordinatesSplit = split(",", $coordinates); 
      // Format: Longitude, Latitude, Altitude 
      $lat = $coordinatesSplit[1]; 
      $lng = $coordinatesSplit[0]; 

      $query = sprintf("UPDATE markers " . 
       " SET lat = '%s', lng = '%s' " . 
       " WHERE id = '%s' LIMIT 1;", 
       mysql_real_escape_string($lat), 
       mysql_real_escape_string($lng), 
       mysql_real_escape_string($id)); 
      $update_result = mysql_query($query); 
      if (!$update_result) { 
      die("Invalid query: " . mysql_error()); 
      } 
     } else if (strcmp($status, "620") == 0) { 
      // sent geocodes too fast 
      $delay += 1000; 
     } else { 
      // failure to geocode 
      $geocode_pending = false; 
      echo "Address " . $address . " failed to geocoded. "; 
      echo "Received status " . $status . " 
    \n"; 
     } 
     usleep($delay); 
     } 
    } 
    ?>  

回答

0

做谷歌搜索像 「WordPress的ADD_ACTION」。 WordPress的讓你「聽」在WordPress內發生的不同事件。在你的情況下,我認爲你可以使用名爲「update_post」的動作。

+0

好的謝謝。所以像這樣'<?php add_action('publish_post','my_custom_function'); ?>會在我的functions.php文件中去觸發我想要的腳本? – Rob

+0

就是這樣的。第二個參數是觸發動作「publish_post」時將調用的函數的名稱。 – xCander

+0

要清楚,我想要發生管理區域的唯一事情是點擊發布/更新。然後在模板上,我想檢查帖子是否已保存,如果是,那麼我想用'get_template_part('geocode'); – Rob

3

一般:

在一個插件(或位於您的主題文件的functions.php)你有下面的代碼:

add_action('publish_post', function($post_id) { 
    // Here you have some code that finds out the geocode data 
    // then you attach it to this post as a meta value 
    update_post_meta($post_id, 'my_geocode', $geo_data); 
}); 
在模板文件

然後(single.php中)你將不得不服用點,如:

$geo_data = get_post_meta($post->ID, 'my_geocode', true); 
if($geo_data) { 
    get_template_part('geocode'); 
} 

或者,如果你想保持你的模板文件清理,你可以在文件的functions.php LOCAT添加行動「the_content」 編輯在主題目錄(或在您的插件文件)

add_action('the_content', function() { 
    if(is_singular()) { 
    global $post; 
    $geo_data = get_post_meta($post->ID, 'my_geocode', true); 
    if($geo_data) { 
     get_template_part('geocode'); 
    } 
    } 
});