অ্যাডমিন- ajax.php এ 400 ডাবল অনুরোধ কেবলমাত্র wp_enqueue_scripts অ্যাকশন হুক ব্যবহার করে


16

আমি ইদানীং এজ্যাক্সে কাজ করছি। নেটটিতে আপনি যে টিউটোরিয়ালগুলি সন্ধান করেন সেগুলি খুব একই রকম এবং কার্যকর করা খুব সহজ। তবে আমি সবসময় আমার ফাইলে একটি খারাপ অনুরোধ পাই ajax-admin.php

দীর্ঘ এবং নিবিড় অনুসন্ধানের পরে, আমি এখন এটি আবিষ্কারের ইন্টিগ্রেশনের কারণেই খুঁজে পেয়েছি।

আমি যদি initস্ক্রিপ্টটি আরম্ভ করার জন্য অ্যাকশন হুক ব্যবহার করি এবং wp_localize_script, সবকিছু ঠিকঠাক কাজ করে। সুতরাং কোড নিজেই সঠিক হতে হবে।

আমার পৃষ্ঠার-পরীক্ষা থিমের functions.php

function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

তবে আমি যদি উদাহরণস্বরূপ wp_enqeue_scriptsঅ্যাকশন হুক ব্যবহার করি তবে আমি সর্বদা খারাপ অনুরোধটি পাই।

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

এটির সাথে সমস্যাটি হ'ল:

আমি একটি অতিরিক্ত পিএইচপি ফাইলে ফাংশন রাখতে চাই এবং সেগুলি কেবলমাত্র কোনও নির্দিষ্ট পৃষ্ঠায় প্রয়োজন হলে লোড করুন। এর জন্য আমার উদাহরণস্বরূপ দরকার is_page()। তবে is_page()প্রথম দিকে কাজ করে যখন আমি ক্রিয়াকলাপটি হুকের সাথে অন্তর্ভুক্ত করে parse_queryহুক করি:

থিমের functions.php

function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

সুতরাং তারপরে ফাইলটিতে initকড়া ফাংশনগুলি my-page-test-functions.phpট্রিগার হয় না, আমি মনে করি, কারণ এটি initআগে আসে parse_query

এটি সংগঠিত করার জন্য কি কোনও সেরা অনুশীলন রয়েছে, তাই এটি কার্যকর হয়? বা অ্যাকশন হুক admin-ajax.phpব্যবহার করার সময় আমি কীভাবে খারাপ অনুরোধটি ঠিক করতে পারি wp_enqeue_scripts?

উত্তর:


13

আমি মনে করি যে এখানে কেবলমাত্র অনুপস্থিত তা হ'ল আপনাকে add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');বাইরে চলে যেতে হবে ajax_login_init

এই কোডটি আপনার অ্যাজাক্স হ্যান্ডলারটিকে নিবন্ধভুক্ত করে, তবে আপনি যখন কেবল এটি চালান wp_enqueue_scripts, এটি ইতিমধ্যে অনেক দেরি হয়ে গেছে এবং wp_ajax_nopriv_ইতিমধ্যে হুকগুলি চালানো হয়েছে।

সুতরাং, আপনি কি এরকম কিছু চেষ্টা করেছেন:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

সম্পাদনা:

এখন এটি আরও স্পষ্ট যে আপনি কেবল সেই নির্দিষ্ট পৃষ্ঠায় জাভাস্ক্রিপ্ট লোড করতে চান। এর অর্থ আপনার নিজের is_page()ভিতরে রাখা দরকার ajax_login_init()। আমি সেই অনুযায়ী কোড আপডেট করেছি।

এখন, আপনার সমাধান কাজ করে না কেন?

is_page()চেক বোঝানো যে আপনার ফাংশন ফাইল শুধু তাই নির্দিষ্ট পৃষ্ঠা লোড করা হয়। ajax_login_init()কল হয়ে যায় এবং আপনার স্ক্রিপ্টগুলি সারিবদ্ধ হয়। এ পর্যন্ত সব ঠিকই.

এখন আপনার স্ক্রিপ্টটি এজ্যাক্স কল করে। মন্তব্যে উল্লিখিত হিসাবে, আজেক্স কলগুলি আপনি যে বর্তমান পৃষ্ঠায় রয়েছেন সে সম্পর্কে সচেতন নয়। ফাইলটি বসার একটি কারণ রয়েছে wp-admin/admin-ajax.php। এজ্যাক্স অনুরোধ চলাকালীন সেখানে নেই WP_Queryএবং এইভাবে is_page()কাজ করে না।

যেহেতু এটি কাজ করে না, sw18_page_specific_functions()এজ্যাক প্রসঙ্গে কিছু করবে না। এর অর্থ আপনার ফাংশন ফাইল লোড করা হয়নি এবং আপনার এজাক্স হ্যান্ডলারটি বিদ্যমান নেই।

এজন্য আপনাকে সর্বদা সেই ফাংশন ফাইল অন্তর্ভুক্ত করতে হবে এবং সেই is_page()চেকটি ভিতরে move োকাতে হবে ajax_login_init()

সুতরাং সরাসরি সরাসরি sw18_page_specific_functions() { … }চালানোর পরিবর্তে include_once dirname(__FILE__).'/includes/my-page-test-functions.php';। কোনও add_action( 'parse_query' )কল ছাড়াই ।


ভাল পরামর্শ। আমি এটি পরিবর্তন করেছি (এখনও একই ত্রুটি), তবে সমস্যাটি এখনও এটি হ'ল ফাংশনযুক্ত ফাইলটি খুব দেরিতে লোড হবে। তবে কোন পৃষ্ঠাটি ব্যবহৃত হয়েছে তা আলাদা করার জন্য আমার একটি উপায় দরকার। - বর্তমানে আমি উপরের বর্ণিত হিসাবে is_page () দিয়ে এটি চেষ্টা করছি।
পাপ

আপনি কি is_page()ভিতরে ajax_login()বা ভিতরে থেকে চালানোর চেষ্টা করছেন ajax_login_init()? প্রাক্তনটি কাজ করতে পারে না কারণ এটি একটি অ্যাজাক্স প্রসঙ্গে।
swissspidy

উপরের বর্ণনামূলক পাঠ্য হিসাবে আমি ফাংশনগুলিতে ফাইলগুলি গণনা করেছি। Is_page () ফাংশন.এফপি ব্যবহার করা হয় এবং যখন প্রয়োজন হয় তখনই এজাক্স ফাংশনগুলির সাথে ফাইলটি অন্তর্ভুক্ত করতে পরিবেশন করা হয়।
পাপ

@ সিন আবার, is_page()কোনও আজাক্স প্রসঙ্গে কাজ করে না। আমি আমার উত্তর অনুসারে আপডেট করেছি।
swissspidy

0

মনে রাখবেন যে 'ক্রিয়া' ফাংশনটির নাম wp_ajax_ট্যাগ এ যুক্ত করা আছে ।

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);

-3

শুধু লিখুন ডাই; নীচের মত শেষে ...এখানে চিত্র বর্ণনা লিখুন


8
হাই জি Xhan। সাইটে স্বাগতম। আপনার উত্তরের কিছু সংশোধন দরকার। প্রথমত, যদি আপনার উত্তর কোড হয় তবে স্ক্রিনশট পোস্ট করবেন না। পরিবর্তে, কোডটি স্নিপেট হিসাবে পোস্ট করুন এবং এটিকে কোড হিসাবে ফর্ম্যাট করুন (}} বোতামটি ব্যবহার করুন)। সম্ভবত আপনার উত্তরটি হ্রাস করা এবং গ্রহণযোগ্য না হওয়ার কারণ সম্ভবত। এছাড়াও, আরও কিছুটা ব্যাখ্যা সহায়ক হবে - যেমন "কেন" কেবল ডাই () লিখুন এবং এটি ওপিতে কোডের সাথে (মূল পোস্ট) ঠিক কোথায় যায়?
butlerblog
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.