Плагины — Различные Вызовы Функций В Зависимости От Шорткода?

  • Автор темы Sass02
  • Обновлено
  • 21, Oct 2024
  • #1

Поэтому я изменил фрагмент кода, который включает вызов API Google Distance Matrix.

Я хотел, чтобы он определял расстояние только до определенного адреса. Но теперь я также хочу использовать его на другой странице, чем предполагалось изначально.

Я создал второй короткий код, который создает вторую форму с другим почтовым индексом в скрытом поле, но хотя первая форма работает нормально, вторая ничего не делает.

Кто-нибудь может помочь?

Код ниже с удаленными адресами и ключами API

 
 jQuery("#calculate").click( function(){ 

// This does the ajax request

var from = jQuery('#from').val();

var to = jQuery('#to').val();

jQuery.ajax({

url : ajaxurl,

type : 'POST',

data: {

'action':'distancewpcalculator',

'from' : from,

'to' : to            

},

success:function(data) {

// This outputs the result of the ajax request

jQuery('#result').html(data);

},

error: function(errorThrown){

console.log(errorThrown);

}
});
});
 

JS

jQuery(документ).ready(function() {

<?php /** * Plugin Name: WP Distance Calculator * Plugin URI: http://phpcodingschool.blogspot.com/ * Description: This plugin claculates distance between two near by locations. * Version: 1.0.0 * Author: Monika Yadav * Author URI: http://phpcodingschool.blogspot.com/ * License: GPL2 */ class DistanceWPCalculator { public function __construct() { //action definations add_shortcode( 'distance_calculator', array( &$this, 'distanceWPfrontend' ) ); add_shortcode( 'distance_calculator_LC', array( &$this, 'distanceWPfrontendLC' ) ); add_action( 'wp_ajax_nopriv_distancewpcalculator', array( &$this, 'distancewpcalculator_calculate' ) ); add_action( 'wp_ajax_distancewpcalculator', array( &$this, 'distancewpcalculator_calculate' ) ); add_action( 'init', array( &$this, 'init' ) ); } public function init() { wp_enqueue_script( 'distancewpcalculator', plugin_dir_url( __FILE__ ) . 'js/calculatedistance.js', array( 'jquery' ) ); wp_localize_script( 'distancewpcalculator', 'DistanceCalculator', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ); ?> <script> var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>"; </script> <?php wp_enqueue_style( 'DistanceWPCalculator-Style', plugin_dir_url( __FILE__ ) . 'css/style.css', array(), '0.1', 'screen' ); } public function distancewpcalculator_calculate() { // The $_POST contains all the data sent via ajax if ( isset($_POST) ) { $from = urlencode($_POST['from']); $to = urlencode($_POST['to']); $data = file_get_contents("https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=$from&destinations=$to&key="); $data = json_decode($data); $time = 0; $distance = 0; foreach($data->rows[0]->elements as $road) { $time += $road->duration->value; $distance += $road->distance->value; } $time =$time/60; $distance =round($distance/1000); //Output if($distance!=0){ echo "<div id='result_generated'>"; echo "From: ".$data->origin_addresses[0]; echo "<br/>"; echo "To:".$data->destination_addresses[0]; echo "<br/>"; echo "Time: ".gmdate("H:i", ($time * 60))." hour(s)"; echo "<br/>"; echo "Distance: ".$distance." miles"; echo "</div>"; }else{ echo "Sorry only nearby distance can be calculated."; } } die(); } //Function to display form on front-end public function distanceWPfrontend( $atts ) { ?> <form method = "post" id="calculator" > <div class="DC_title">Distance Calculator</div> <input type="hidden" id="to" name="to" value="Postcode 1"> <input type="text" id="from" name="from" placeholder="От.."></br> <input type="button" id="calculate" name="calculate" value="Calculate" class="wpcf7-form-control wpcf7-submit btn btn-accent btn-lg"> </form></br> <div id="result"></div> <?php } public function distanceWPfrontendLC( $atts ) { ?> <form method = "post" id="calculator" > <div class="DC_title">Distance Calculator</div> <input type="hidden" id="to" name="to" value="Postcode2"> <input type="text" id="from" name="from" placeholder="От.."></br> <input type="button" id="calculate" name="calculate" value="CalculateLC" class="wpcf7-form-control wpcf7-submit btn btn-accent btn-lg"> </form></br> <div id="result"></div> <?php } } $distancewpcalculator = new DistanceWPCalculator(); ?>

});

#плагины #api #google

Sass02


Рег
16 Apr, 2006

Тем
74

Постов
196

Баллов
596
  • 25, Oct 2024
  • #2

Проблема в том, что если ваш JavaScript ссылается на идентификаторы форм и входных данных, то если они оба находятся на одной странице, скрипт будет работать только со значениями первой формы.

Самым простым решением было бы использовать разные идентификаторы для элементов в каждом коротком коде, но лучшим постоянным решением было бы заставить ваш скрипт работать на основе класса и использовать значения из отправленной формы, а не глобальные идентификаторы.

Так что измените свою форму, чтобы просто провести урок на

 
 $_POST 
element:

$_GET

Для ясности я удалил все, что не имеет отношения к вопросу. я тоже удалил GET since POST is not appropriate for получающий ценность. Я также изменил div результата, чтобы использовать класс.

Затем обновите свой JavaScript, чтобы настроить целевую отправку POST form, and use the POST и GET value only from the submitted form. Then use only the POST после формы.

jQuery( '.distance-calculator' ).on( 'submit', function( event ) { event.preventDefault(); var form = this; var from = form.from.value; var to = form.to.value; jQuery.ajax( { url : ajaxurl, type : 'GET', data: { 'action' : 'distancewpcalculator', 'from' : from, 'to' : to }, success: function( data ) { jQuery.next( '.result' ).html( data ); }, error: function( errorThrown ) { console.log(errorThrown); } } ); } );

Я также изменил .result to to здесь. Как я уже упоминал ранее from is not appropriate for this type of request. .distance-calculator следует использовать только для создания или обновления ресурса, в то время как method="post" should be used for retrieving data. It just means you'll need to update your PHP to use <form class="distance-calculator"> <input type="hidden" name="to" value="Postcode2"> <input type="text" name="from"> <input type="submit" value="Calculate"> </form> <div class="result"></div> вместо form .

 

Spvk


Рег
08 Nov, 2006

Тем
91

Постов
197

Баллов
702
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно