2012-06-20 5 views
1

Я создал веб-сайт с помощью Wordpress.Код ошибки при публикации/обновлении страницы Wordpress

У меня есть шаблон, который имеет следующий код, он геокодирует адрес и сохраняет результат в новой базе данных.

У меня есть еще один шаблон, который читает все лат/lng из новой базы данных и отображает сотни маркеров на карте 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

Выполните поиск Google, как "WordPress add_action". Wordpress позволяет «слушать» различные события, происходящие в Wordpress. В вашем случае я думаю, что вы можете использовать действие с именем «update_post».

+0

Хорошо спасибо. Так что-то вроде этого ' 'пойдет в моем файле 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) вы будете иметь somehting как:

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

Или, если вы хотите сохранить ваши файлы шаблонов очистки вы можете добавить действие «the_content» в файле functions.php Locat ed в каталоге темы (или в вашем файле плагина)

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'); 
    } 
    } 
}); 
Смежные вопросы