WordPress wp_insert_post se déclenche plusieurs fois sur les appareils mobiles

Publié par Jean-Michel le

J’ai créé un formulaire de don multipage personnalisé sur WordPress, en sauvegardant les données via des variables de session sur les pages. J’utilise ensuite le crochet save_post pour exécuter une fonction permettant de rediriger l’utilisateur, après avoir soumis le formulaire, vers un portail de paiement en ligne. Le problème est que lorsque les utilisateurs accèdent au formulaire via mobile, la fonction wp_insert_post se déclenche plusieurs fois.

C’est le code que j’ai sur la page php utilisée pour traiter les données du formulaire.

<?php
header('Cache-Control: no cache'); //no cache
session_cache_limiter('private_no_expire'); // works
//session_cache_limiter('public'); // works too
//let's start the session
session_start();

require_once 'library/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);


//LISTING ALL VARIABLES AVAILABLE FROM FRONTEND FORM
$negara = $_SESSION['negara'];
$binatang = $_SESSION['binatang'];

if($_SESSION['ekor']) {
    $ekorBahagian = $_SESSION['ekor'];
} else {
    $ekorBahagian = $_SESSION['bahagian'];
}

$nama1 = $_SESSION['nama'];
$kp1 = $_SESSION['kp'];
$telefon1 = $_SESSION['telefon'];
$emel1 = $_SESSION['emel'];
$alamat11 = $_SESSION['alamat1'];
$alamat21 = $_SESSION['alamat2'];
$poskod1 = $_SESSION['poskod'];
$bandar1 = $_SESSION['bandar'];
$negeri1 = $_SESSION['negeri'];
$peserta1 = $_SESSION['peserta'];
$kempen = $_POST['kempen'];
$bank = $_POST['bank'];

if($telefon1) {
    $mobile = preg_replace("/[^0-9]/", "", $telefon1);
    $custTel = $mobile;
    $custTel2 = substr($mobile, 0, 1);
    if ($custTel2 == '+') {
        $custTel3 = substr($mobile, 1, 1);
        if ($custTel3 != '6') {
            $custTel = "+6" . $mobile;
        }
    } elseif ($custTel2 == '6') {
    } else {
        if ($custTel != '') {
            $custTel = "+6" . $mobile;
        }
    }
}


//purifying the texts
$nama = $purifier->purify($nama1);
$kp = $purifier->purify($kp1);
$telefon = $purifier->purify($custTel);
$emel = $purifier->purify($emel1);
$alamat1 = $purifier->purify($alamat11);
$alamat2 = $purifier->purify($alamat21);
$poskod = $purifier->purify($poskod1);
$bandar = $purifier->purify($bandar1);
$negeri = $purifier->purify($negeri1);
$peserta = $purifier->purify($peserta1);

if($_SESSION['ekor'])   { 
    $bil = $_SESSION['ekor']; //capturing bilangan ekor into a var
    switch ($_SESSION['negara']){
    case 'Malaysia':
        $jumlahHarga = $bil*(650*7);
        break;
    case 'ASEAN':
        $jumlahHarga = $bil*(450*7);
        break;
    case 'Timur Tengah':
        $jumlahHarga = $bil*(1300*7);
        break;
    case 'Afrika':
        $jumlahHarga = $bil*(350*7);
        break;
    default:
    } 
} else { 
    $bil = $_SESSION['bahagian']; //capturing bilangan bahagian into a var
    switch ($_SESSION['negara']){
    case 'Malaysia':
        $jumlahHarga = $bil*650;
        break;
    case 'ASEAN':
        $jumlahHarga = $bil*450;
        break;
    case 'Timur Tengah':
        $jumlahHarga = $bil*1300;
        break;
    case 'Afrika':
        $jumlahHarga = $bil*350;
        break;
    default:
    } 
}



$post = array(
    'post_title' => wp_strip_all_tags( $nama ),
    'post_status' => 'publish', 
    'post_type' => 'qurban',
    'meta_input' => array(
        'pilihan_negara' => $negara,
        'pilihan_lembu' => $binatang,
        'bilangan_ekorbahagian' => $ekorBahagian,
        'jumlah_bayaran' => $jumlahHarga,
        'nama_penuh' => $nama,
        'nombor_kad_pengenalan' => $kp,
        'nombor_telefon' => $telefon,
        'emel' => $emel,
        'alamat_rumah_1' => $alamat1,
        'alamat_rumah_2' => $alamat2,
        'poskod' => $poskod,
        'bandar' => $bandar,
        'negeri' => $negeri,
        'senarai_nama_peserta' => $peserta,
        'bank' => $bank,
        'kempen' => $kempen

    )
);
$post_id = wp_insert_post($post);

get_header(); 
?>



<?php 
get_footer();

?>

Ci-dessous le code qui utilise save_post pour rediriger l’utilisateur vers un site de paiement externe :

?php 

require_once "Mobile_Detect.php"; 

 ////////////////////////////
 //// PAYMENT REDIRECTION FUNCTION
 ////////////////////////////


function my_save_post_iq( $post_id ) {

    debug_to_console( "save post function fired" );

    $billplzApi = get_field('iq_secret_key', 'option');
    $billplzId = get_field('iq_collection_id', 'option');

    // bail early if not a donation post
    if( get_post_type($post_id) !== 'qurban' ) {
        return;
    }
    // bail early if editing in admin
    if( is_admin() ) {  
        return;
    }

    $post = get_post( $post_id);

    $jumlah_bayaran_iq = get_field('jumlah_bayaran', $post_id);

    //check & update user device type
    $detect = new Mobile_Detect;
      if($detect->isMobile()){
          update_field('devices', 'mobile' , $post);
      } else {
          update_field('devices', 'desktop', $post);
      }

    $name = get_field('nama_penuh', $post);
    $email = get_field('emel', $post);
    $mobile = get_field('nombor_telefon', $post);
    $bank = get_field('bank', $post);


    $billplz_data = array(
      'amount' => $jumlah_bayaran_iq * 100,
      'name' => $name,
      'mobile' => $mobile,
      'email' => $email,
      'collection_id' => $billplzId,
      'deliver' => false,
      'reference_1_label' => 'Bank Code',
      'reference_1' => $bank,
      'reference_2_label' => 'Post ID',
      'reference_2' => $post_id,
      'description' => 'xxx',
      'redirect_url' => home_url('qurbanv2/paymentredirectv2'),
      'callback_url' => home_url('paymentcallback')
    );

      $process = curl_init('https://www.billplz.com/api/v3/bills/');
      curl_setopt($process, CURLOPT_HEADER, 0);
      curl_setopt($process, CURLOPT_USERPWD, $billplzApi . ":");
      curl_setopt($process, CURLOPT_TIMEOUT, 30);
      curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE);
      curl_setopt($process, CURLOPT_POSTFIELDS, http_build_query($billplz_data));
      $return = curl_exec($process);
      curl_close($process);
      $arr = json_decode($return, true);
      $billplz_url = $arr['url'];
      $billplz_id = $arr['id'];

      //update payment status
      update_field('billplz_iq', $billplz_id , $post);

      //$hzpost_name = array(
      //      'ID'          = $post,
      //      'post_name'   = $billplz_url
      //);
      //
      //wp_update_post($hzpost_name);

      header('Location: '. $billplz_url . '?auto_submit=true');


      exit();   

}
add_action('save_post', 'my_save_post_iq', 10, 1);

Je suis nouveau dans le développement WordPress, alors aidez-moi s’il vous plaît.

Solution n°1 trouvée

Trouvé le bogue. Cela a à voir avec la façon dont la passerelle de paiement traite le numéro de téléphone mobile. J’ai ajouté une ligne pour ajouter ‘+’ devant les chiffres, et la duplication s’arrête.

if($telefon1) {
    $mobile = preg_replace("/[^0-9]/", "", $telefon1);
    $custTel = $mobile;
    $custTel2 = substr($mobile, 0, 1);
    if ($custTel2 == '+') {
        $custTel3 = substr($mobile, 1, 1);
        if ($custTel3 != '6') {
            $custTel = "+6" . $mobile;
        }
    } elseif ($custTel2 == '6') {
        $custTel = "+" . $mobile;        //added this line.
    } else {
        if ($custTel != '') {
            $custTel = "+6" . $mobile;
        }
    }
}

Solution n°2 trouvée

Trouvé le bogue. Cela a à voir avec la façon dont la passerelle de paiement traite le numéro de téléphone mobile. J’ai ajouté une ligne pour ajouter ‘+’ devant les chiffres, et la duplication s’arrête.

if($telefon1) {
    $mobile = preg_replace("/[^0-9]/", "", $telefon1);
    $custTel = $mobile;
    $custTel2 = substr($mobile, 0, 1);
    if ($custTel2 == '+') {
        $custTel3 = substr($mobile, 1, 1);
        if ($custTel3 != '6') {
            $custTel = "+6" . $mobile;
        }
    } elseif ($custTel2 == '6') {
        $custTel = "+" . $mobile;        //added this line.
    } else {
        if ($custTel != '') {
            $custTel = "+6" . $mobile;
        }
    }
}

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *