wp_localize_script এ অবজেক্ট / JSON পাস করুন


15

আমি জাভাস্ক্রিপ্টের একটি কাজের টুকরা পেয়েছি যাতে একটি বস্তু আক্ষরিক থাকে। তবে আমাকে এটি স্থানীয়করণ করা দরকার, এবং আমি কীভাবে এটি পুনরায় লিখতে হবে তা নির্ধারণের জন্য চেষ্টা করছি যাতে আমি এটিতে অ্যাকসেটের জন্য wp_localize_script () পেতে পারি এবং সঠিক বিন্যাসটি আউটপুট পেতে পারি।

অ-স্থানীয়করণযুক্ত (অ ডায়নামিক) সংস্করণটি এর মতো দেখাচ্ছে:

var layoyt_config = {
    'header'        : 1 
,   'footer'        : 1
,   'ls'            : {'sb1':1}
,   'rs'            : {'sb1':1,'sb2':1}
,   'align'         : 'center'
};  

এখন, এই মানগুলি পিএইচপি দ্বারা উত্পাদিত করতে (কিছু ডাব্লুপি_সেটেটিংয়ের উপর ভিত্তি করে) আমি ডাব্লুপি_লোক্যালাইজ_স্ক্রিপ্ট ব্যবহার করতে চাই, তাই আমি সেখান থেকে নিতে পারি:

var layoyt_config = my_localized_data.layoyt_config;

এবং সেই অবজেক্ট প্রোপার্টিটিতে ডেটা পাওয়ার জন্য আমি ভেবেছিলাম 'আমি এটি করতে পারি, তবে স্পষ্টতই না:

$data = array(
    'layout_config' => {
        'header' : 1
    ,   'footer' : 1
    ,   'ls' : {'sb1': 1}
    ,    'rs' : {'sb1': 1,'sb2': 1}
    ,    'align' : 'center'
    }
);
wp_localize_script('my-script-handle', 'my_localized_data', $data);

যেহেতু এই পিএইচপি পার্স ত্রুটি ঘটবে আমি জেএসসনকে অ্যারে সিনট্যাক্সে পুনরায় লেখার চেষ্টা করেছি, যেহেতু ডাব্লুপি_লোক্যালাইজ_স্ক্রিপ্ট সেটিকে আবার বস্তুর স্বীকৃতিতে রূপান্তরিত করবে, তবে এটি আমার পক্ষেও কার্যকর হয় না:

$data = array(
    'layout_config' => array(
        'header' => 1
    ,   'footer' => 1
    ,   'ls' => array('sb1'=>1)
    ,    'rs' => array('sb1'=>1,'sb2'=>1)
    ,    'align' => 'center'
    )
);
wp_localize_script('my-script-handle', 'my_localized_data', $data);

এবং যখন এই পিএইচপি পার্সারটি সহজেই চলে, আমি আমার পৃষ্ঠার উত্সে প্রত্যাশিত আউটপুটটি পাই না, কারণ আমার_লোকালাইজড_ডাটা.লেআউট_কনফিগ একটি স্ট্রিং "অ্যারে" হয়ে যায়, এখানে আউটপুট:

<script type='text/javascript'>
    /* <![CDATA[ */
    var wpkit_localized_data = {
    layout_config: "Array"
    };
    /* ]]> */
</script>

সুতরাং .. আমি কীভাবে এটি করতে পারি (বা আমাকে কেবল এই বিষয়টি গ্রহণ করতে হবে যে আমাকে অবশ্যই আমার বস্তুটিকে আলাদা ভারসাম্যে পরিণত করতে হবে):

lc_header = '1';
ls_ls_sb1 = '1';
etc...

উত্তর:


15

প্রকৃতপক্ষে, wp_localize_script()সহজ , এটি মানগুলির আশেপাশে উদ্ধৃতি যুক্ত করে এবং সমস্তগুলি স্ট্রিংয়ের প্রত্যাশা করে সামগ্রীটি থেকে পালিয়ে যায়।

তবে l10n_print_afterঅ্যারের কী রয়েছে যা কোনও প্রকার হস্তক্ষেপ ছাড়াই মুদ্রিত হবে। স্ট্রিংগুলি পাস হওয়ার পরে এটি নির্বিচারে কোডটি কার্যকর করতে ব্যবহার করা যেতে পারে। আপনার অতিরিক্ত তথ্য পাস করার জন্য আপনি এটি ব্যবহার করতে পারেন।

$data = array(
    'layout_config' => {
      'ls' : {'sb1': 1}
    }
);
$reshuffled_data = array(
    'l10n_print_after' => 'my_localized_data = ' . json_encode( $data ) . ';'
);
wp_localize_script('my-script-handle', 'my_localized_data', $reshuffled_data);

আপনি এর মতো কোড দিয়ে শেষ করবেন:

var my_localized_data = {}; // What is left of your array
my_localized_data = {'layout_config': {'ls': {'sb1': 1}}}; // From l10n_print_after

খুব দরকারী, যদিও আমি মনে করি আপনি json_encode এর পরে একটি আধা-কোলন বোঝাতে চেয়েছিলেন, কমা নয়, আমি কি সঠিক?
কোভসেনিন

1
@ কোকশেনিন: ভাল ধরা! আমি এটিকে সংশোধন করেছি, তবে আপনি যদি এটি সম্পাদনা হিসাবে প্রস্তাব করেন তবে আপনি এটির জন্য +2 রেপ অর্জন করতে পারতেন।
জান ফ্যাব্রি

এই প্রশ্নটিকে হাইজ্যাক করার অর্থ নয়, তবে ওয়ার্ডপ্রেস.সটেকেক্সচেঞ্জ / সেকশনস / ৫৩৪৪২ (যদি কারও এখানে কোনও পয়েন্টার থাকে তবে) দেখার জন্য এই প্রশ্ন / উত্তরটি দেওয়া হয়েছিল । ধন্যবাদ!
জাচ

1

দাবি অস্বীকার - আমি এখানে জেএস সুরক্ষা সামগ্রীতে আমার গভীরতার বাইরে।

প্রথমে আপনার কাঙ্ক্ষিত আউটপুটটি মেলানোর জন্য আপনি নেস্টিং স্তরটি বন্ধ করে দিয়েছেন। স্থানীয়করণ কল (অ্যারির কী পরিবর্তে) বস্তুর নাম প্যারামিটার হিসাবে যায়:

$data = array(
        'header' => 1
    ,   'footer' => 1
    ,   'ls' => array('sb1'=>1)
    ,    'rs' => array('sb1'=>1,'sb2'=>1)
    ,    'align' => 'center'
);
wp_localize_script('my-script-handle', 'layout_config', $data);

কিন্তু lsএবং rsএখনও ভেঙে গেছে কারণ WP_Scripts->print_scripts_l10n()যখন ভেরিয়েবল অ্যারে হয় তখন পদ্ধতিটি কেস পরিচালনা করে না।

সেরাটি আমি ফিল্টার নিম্নলিখিতটি ঠিক করতে পেরেছি (উপরে হিসাবে - এটি উত্পাদনে ব্যবহার করা কতটা নিরাপদ হবে তা নিশ্চিত নয় তবে সাধারণ ধারণা দেওয়ার জন্য):

add_filter('js_escape','js_escape_nested', 10, 2);

function js_escape_nested($safe_text, $text) {

     if(is_array($text) )
         return str_replace( '"', "'", json_encode ($text) );

     return $safe_text;
}

আমি বুঝতে পারি যে মূল অবজেক্টের নাম ডাব্লুপি_লোক্যালাইজ_স্ক্রিপ্টে কল করার জন্য 2 ডিএন প্যারামিটার হিসাবে চলে যায়, তবে, আমি ইতিমধ্যে এটি করেছি যে, আমার স্থানীয়ীকৃত অবজেক্টের নামটি 'মাই_লোক্যালাইজড_ডাটা' বলে মনে করা হচ্ছে, সেই বস্তুর বেশিরভাগ বৈশিষ্ট্য রয়েছে সরল স্ট্রিংয়ের মানগুলি, তবে একটি বহুমাত্রিক বস্তু হওয়ার জন্য আমার এই বৈশিষ্ট্যগুলির একটি দরকার need
মিক্কেলব্রাম

এটি কোনও পরিবর্তন ছাড়াই wp_localize_script এর আওতার বাইরে বলে মনে হচ্ছে। এটি বহুমাত্রিক অ্যারেগুলি পরিচালনা করতে পারে না। আমি এখন অন্য একটি পদ্ধতি নিয়ে এসেছি, যেখানে আমি আমার স্থানীয়করণযুক্ত বহু-মাত্রিক অবজেক্টটি এইচটিএমএল ডেটা- * মান হিসাবে সঞ্চয় করি। এটি সূক্ষ্মভাবে কাজ করে, তবে অতিরিক্ত প্রশ্নগুলি ছেড়ে দিন: wordpress.stackexchange.com/questions/8684
মিকলব্র্যাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.