Intereting Posts
Лучший способ уведомить пользователей WordPress о новых кандидатах на выпуск для бета-тестирования? Лучше ли создавать репозиторий Git на корневом уровне или в каталоге тем WordPress? Как получить и отредактировать настраиваемые поля, если в Quick Edit get_attached_media () на странице автора не работает Контактная форма JQuery для отправки почты администратору Как я могу выборочно вставлять заголовок для моей страницы магазина в woocommerce? WordPress wp-admin показывает белый экран без ошибок Как сделать субдомен и muti-сайт, но wordpress не в корне? Создайте новую таблицу в базе данных и сохраните параметры из контактной формы Используйте fetch_feed (); Полностью вне WordPress? как добавить пользовательский логотип в мой шаблон «Неопределенная переменная: массив» Ошибка при отображении тега Защитить мой перевод "add_settings_field"? API настроек извлекает информацию о параметрах базы данных вместе с информацией пользователя? Как использовать короткие коды внутри тегов HTML?

Выполнять действия по публикации или обновлению?

Есть ли способ сделать только часть кода в шаблоне, если сообщение только что было опубликовано или обновлено?

Что мне нужно обернуть вокруг этого кода?

ОБНОВИТЬ:

Мне нужно проверить, сохранен ли какой-либо из моих типов пользовательских сообщений, называемых «членами». Шаблон, который я использую для отображения сообщений, – single-members.php.

Если сообщение сохранено, то на моем шаблоне get_template_part('geocode'); мне нужно вызвать get_template_part('geocode');но только если сообщение сохранено .

Я НЕ ХОЧУ ЭТО ПРОИСХОДИТЬ В АДМИНСКОЙ ПЛОЩАДКЕ, ЭТО НЕОБХОДИМО ПРОЙДЕТ ПЕРЕДНЕГО КОНЕЧНОГО ВЕБ-САЙТА. ЧУВСТВИТЕЛЬНО ТОЛЬКО ВЕЩЬ, КОТОРЫЙ Я ХОЧУ СДЕЛАТЬ В АДМИНСКОЙ ОБЛАСТИ, НАЖМИТЕ ЩЕЛКНИТЬ ИЗДАТЕЛЬСТВО / ОБНОВЛЕНИЕ.

Вот что находится в файле geocode.php:

 <?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); } } ?> 

Solutions Collecting From Web of "Выполнять действия по публикации или обновлению?"

Почему бы вам не обернуть его в post save_post и post_publish?

У вас есть примеры здесь: http://codex.wordpress.org/Function_Reference/add_action

Как это сделать: добавьте это в свой файл functions.php:

 function my_data_update () { $company = get_field('company_name'); $address = get_field('address'); $city = get_field('city'); $post_code = get_field('post_code'); //etc etc... } add_action('publish_post', 'my_data_update'); add_action('save_post', 'my_data_update'); 

Недавно у меня был почти такой же случай использования:

  • При сохранении настраиваемого типа сообщения проверьте наличие некоторых метаданных.
  • Если он существует, геокодируйте его с помощью Google Geocode API.
  • Сохраните результат как новое мета-поле (это скрыто, чтобы пользователь не мог его испортить).
  • Примечание. Что я делаю с данными на переднем конце сайта, обрабатывается в файле шаблона с использованием javascript и API Карт Google.

Похоже, вы собираете несколько полей, чтобы получить адрес (я сохранил его в одном), и вы сохраняете результирующий формат по-разному, но, надеюсь, это служит хорошим примером, из которого вы можете взять кредит. Как я всегда старался, я использовал функции WordPress API для запросов и сохранения в базе данных. Это безопасно и перспективно.

Так же, как @OriginalEXE предлагает, я использовал save_post . Я не думаю, что вам нужно publish_post :

save_post – это действие, инициируемое при создании или обновлении почты или страницы, которая может быть получена из формы импорта, публикации / редактирования страницы, xmlrpc или сообщения по электронной почте.

Еще несколько примечаний:

  • Обратите внимание на более низкий приоритет действия. Я обнаружил, что оставить его в качестве приоритета по умолчанию, оставив его в поиске ранее сохраненных данных (которые сохраняются с помощью дополнительных настраиваемых полей, которые, по-видимому, вы используете).
  • Класс геокодирования не был моим и спас мне огромное количество времени. Я изменил то, что Sergiy опубликовал для использования функции wp_remote_get() которая имеет лучшую поддержку сервера, чем curl или file_get_contents . Он использует JSON (рекомендованный Google), а не XML.

Я поместил это в плагин функциональности, но он будет работать так же в functions.php :

 /* function wc_add_latlong() * take address from post, geocode it, and save as a custom meta field * @parameter $post_id, id of the post being saved, passed by save_post hook * @returns nothing **************************************/ function wc_add_latlong( $post_id ) { // get the address from ACF field $address = get_field( 'wc_map_address', $post_id ); // Check to see if the post type is right, it's not a revision, and there is an address to geocode if( get_post_type( $post_id ) == 'wc_biz' && !wp_is_post_revision( $post_id ) && $address ) { // call the geocoder class below $coords = geocoder::getLocation( $address ); // split latLngObject with a comma and space $lat_long_string = $coords['lat'] . ', ' . $coords['lng']; // either add that value as a new post meta field OR update the existing one add_post_meta( $post_id, '_wc_lat_long', $lat_long_string, true ) || update_post_meta( $post_id, '_wc_lat_long', $lat_long_string ); } } // This runs on the save_post hook add_action( 'save_post', 'wc_add_latlong', 11 ); // Thank you Sergiy! // http://erlycoder.com/45/php-server-side-geocoding-with-google-maps-api-v3 // a class to get the lat and long of an address _server-side_ class geocoder{ // The base URL for a non-sensor json Google Geocode API request static private $url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address="; static public function getLocation($address){ // append URL-friendly address to base URL $url = self::$url.urlencode($address); // request the Geocode JSON object from Google $resp_json = wp_remote_get($url); // decode the body of the response $resp = json_decode( wp_remote_retrieve_body($resp_json), true ); // make sure the remove_get was successful and it geocoded the address if( !is_wp_error( $resp_json ) && $resp['status']='OK' ) { // success! return the lat and long return $resp['results'][0]['geometry']['location']; }else{ // we failed, return false return false; } } } 

ОБНОВЛЕНИЕ: Я прокомментировал весь код, чтобы вы могли понять, что происходит. Вам придется адаптировать его оттуда.