গতিশীল জাভাস্ক্রিপ্ট / সিএসএস উত্পন্ন করার সমাধান


15

আসুন বলুন যে আপনাকে জাভাস্ক্রিপ্ট বা সিএসএস কোড তৈরি করতে হবে যা বর্তমান প্রসঙ্গে নির্ভর করে।

উদাহরণস্বরূপ আপনার হোমপৃষ্ঠায় একটি ফর্ম রয়েছে যা জমা দেওয়ার জন্য একটি এজাক্স অনুরোধ এবং একক পৃষ্ঠায় একটি আলাদা ফর্ম জমা দেয়। অথবা সিএসএসের ক্ষেত্রে আপনি এমন একটি থিম তৈরি করতে চান যা এর ব্যবহারকারীদের নিজস্ব বিন্যাস তৈরি করতে, রঙ পরিবর্তন করতে দেয় allows

আমি এখন অবধি সমাধানগুলি দেখতে পাচ্ছি:

  1. নথির প্রধান বিভাগে কোডটি অন্তর্ভুক্ত করুন (বা জেএসের ক্ষেত্রে শেষে)

  2. কোড ডেকে আনে এমন একটি বিশেষ অনুরোধ করুন যেমন সাইট ডটকম ? get_assets । এটি ধীর কারণ ডাব্লুপিপি দুটিবার লোড হয়ে যায়।

  3. নির্দিষ্ট সময়ের জন্য এটি অস্থায়ী ফাইলগুলিতে সঞ্চয় করুন এবং সেখান থেকে লোড করুন। পাবলিক থিম বা প্লাগইনগুলির জন্য খুব নির্ভরযোগ্য নয়।

  4. কেবল জাভাস্ক্রিপ্ট - এটি প্রতিবার লোড হয়ে যাওয়া কোনও সাধারণ ফাইলের মধ্যে রেখে এটি স্থির করুন। এই ক্ষেত্রে আপনাকে আপনার কোডকে যে কোনও পরিস্থিতিতে পরিচালনা করতে হবে

আপনি কি অন্যকে চেনেন? আপনি কোন পথে যাবেন?


সমাধান 1 এর সাথে আমি যে সমস্যার মুখোমুখি হয়েছি তা ব্রাউজার দ্বারা ক্যাশে হচ্ছে, কোডটি পৃষ্ঠা পুনরায় লোডে রিফ্রেশ হয় না।
অরব্রত

উত্তর:


9

আপনাকে যে ধরণের প্যারামিটারগুলি প্রবেশ করতে হবে তার উপর নির্ভর করে একটি অতিরিক্ত বিকল্প Let's আসুন এটি কল করুন (2 এ)। আপনি পিএইচপি স্ক্রিপ্টগুলি তৈরি করতে পারেন যা গতিশীলভাবে উত্পন্ন text/cssবা text/javascriptপরিবর্তে আউটপুট দেয় text/htmlএবং তাদের ওয়ার্ডপ্রেস লোড না করে GET পরামিতিগুলি ব্যবহার করার জন্য প্রয়োজনীয় ডেটা সরবরাহ করে। অবশ্যই এটি কেবল তখনই কাজ করে যদি আপনার অপেক্ষাকৃত কমপ্যাক্ট প্যারামিটারের তুলনামূলকভাবে অল্প সংখ্যক পাস করতে হয়। সুতরাং, উদাহরণস্বরূপ, বলুন যে আপনাকে কেবল কোনও পোস্টের URL বা কোনও ফাইলের ডিরেক্টরি বা এর অনুরূপ পাস করতে হবে, আপনি এর মতো কিছু করতে পারেন:

Header.php এ:

 <script type="text/javascript" src="<?php print get_stylesheet_directory_uri(); 
 ?>/fancy-js.php?foo=bar&amp;url=<?php print urlencode(get_permalink($post->ID)); ?>"></script>

অভিনব-js.php এ:

 <?php
 header("Content-type: text/javascript");
 ?>
 foo = <?php print json_encode($_GET['foo']); ?>;
 url = <?php print json_encode($_GET['url']); ?>;

প্রভৃতি

তবে এটি কেবল আপনাকে জিইটি পরামিতিগুলিতে সরাসরি পাস করা ডেটা অ্যাক্সেসের অনুমতি দেয়; এবং এটি কেবল তখনই কাজ করবে যখন আপনার যে জিনিসগুলির মধ্যে পাস করতে হবে তা সংখ্যা তুলনামূলকভাবে কম এবং সেই জিনিসগুলির উপস্থাপনা তুলনামূলকভাবে কমপ্যাক্ট। (মূলত মুষ্টিমেয় স্ট্রিং বা সংখ্যাসূচক মান - একটি ব্যবহারকারীর নাম, বলুন, বা একটি ডিরেক্টরি; ব্যবহারকারীর সমস্ত সাম্প্রতিক পোস্টের তালিকা বা তেমন কিছু নয়))

এই বিকল্পগুলির মধ্যে কোনটি সবচেয়ে ভাল - আমি জানি না; এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। অপশন (1) এর সরল হওয়ার যোগ্যতা রয়েছে এবং স্পষ্টভাবে আপনাকে দু'বার ওয়ার্ডপ্রেস লোড করার পারফরম্যান্সের আঘাত ছাড়াই আপনার প্রয়োজন মতো কোনও ওয়ার্ডপ্রেস ডেটা অ্যাক্সেসের অনুমতি দেয়। এটি অবশ্যই আপনার কী করা উচিত যদি না আপনার শক্তিশালী কারণ না থাকে (যেমন স্টাইলশীট বা স্ক্রিপ্ট যা আপনার ব্যবহারের প্রয়োজন সেই আকারের কারণে)।

আকারটি যদি আপনার এক পৃষ্ঠার ওজনের নিরিখে সমস্যা তৈরি করতে পর্যাপ্ত পরিমাণে হয়ে যায় তবে আপনি (2) বা (2 এ) চেষ্টা করে দেখতে পারেন।

অন্যথায় - এটি সম্ভবত আরও ভাল ধারণা - আপনি স্ক্রিপ্টের অংশগুলি বা স্টাইলশীটগুলি পৃথক করে আলাদাভাবে চেষ্টা করতে পারেন যা স্থিরভাবে নির্দিষ্ট করা যায় এমন অংশগুলি থেকে গতিশীল ডেটা ব্যবহার করে। এসে আপনার কাছে একটি স্টাইলশীট রয়েছে যা # আমার-অভিনব উপাদানটির জন্য একটি পটভূমি প্যারামিটার সেট করার জন্য ওয়ার্ডপ্রেস থেকে একটি ডিরেক্টরি পাস করতে হবে। আপনি এই সমস্তগুলি প্রধান উপাদানটিতে রাখতে পারেন:

 <style type="text/css">
 #my-fancy-element {
      background-image: url(<?php print get_stylesheet_directory_uri(); ?>images/fancy.png);
      padding: 20px;
      margin: 20px;
      font-weight: bold;
      text-transform: uppercase;
      font-size: 12pt;
      /* ... KB and KB of additional styles ... */
 }
 #another-fancy-element {
     /* ... KB and KB of additional styles ... */
 }
 /* ... KB and KB of additional styles ... */
 </style>

তবে কেন আপনার এটি করা দরকার? এখানে কেবল একটি লাইন রয়েছে যা ওয়ার্ডপ্রেস থেকে প্রাপ্ত ডেটার উপর নির্ভর করে। ওয়ার্ডপ্রেসের উপর নির্ভর করে কেবল এমন লাইনগুলি বিভক্ত করা ভাল:

 <style type="text/css">
 #my-fancy-element {
      background-image: url(<?php print get_stylesheet_directory_uri(); ?>images/fancy.png);
 }
 </style>

স্ট্যাটিক স্টাইলশীটে অন্য কোনও কিছু রাখুন যা আপনি একটি স্ট্যান্ডার্ড লিঙ্ক উপাদান (স্টাইল। CSS বা যাই হোক না কেন) দিয়ে লোড করেছেন:

 #my-fancy-element {
      /* background-image provided dynamically */
      padding: 20px;
      margin: 20px;
      font-weight: bold;
      text-transform: uppercase;
      font-size: 12pt;
      /* ... KB and KB of additional styles ... */
 }
 #another-fancy-element {
     /* ... KB and KB of additional styles ... */
 }
 /* ... KB and KB of additional styles ... */

এবং ক্যাসকেডটি কাজটি করতে দিন।

এটি জাভাস্ক্রিপ্টের ক্ষেত্রে একই রকম হয়:

 <script type="text/javascript">
 // Here comes a huge function that uses WordPress data:
 function my_huge_function () {
     // Do a million things ...

     jQuery('#my-fancy').append('<a href="'+<?php json_encode(get_permalink($GLOBALS['post']->ID)); ?>+'">foo</a>);

     // Do a million more things ...

     my_other_function(<?php print json_encode(get_userdata($GLOBALS['post']->post_author); ?>);
 }

 function my_other_function (user) {
     // Do a million things ...
 }
 </script>

পরিবর্তে মাথা উপাদান এ জাতীয় কিছু রাখুন:

 <script type="text/javascript">
 var WordPressPostData = {
 url: <?php print json_encode(get_permalink($GLOBALS['post']->ID)); ?>,
 author: <?php print json_encode(get_userdata($GLOBALS['post']->post_author)); ?>
 }
 </script>

এবং তারপরে বাকিগুলিকে একটি স্থিতিশীল জাভাস্ক্রিপ্ট ফাইলে ফেলে দিন, ওয়ার্ডপ্রেসপোস্টডেটা.আরএল এবং ওয়ার্ডপ্রেসপোস্টডেটা.অক্ষেত্রের গ্লোবালগুলি ব্যবহার করতে আমার_হিউজ ফাংশন () এবং মাই_থর_ফংশান () পুনরায় লিখে।

সিএসএসের 40 কে বা জেএস এর 40K প্রায় সর্বদা <1K এ বিভক্ত হতে পারে যা আসলে গতিশীল ডেটার উপর নির্ভর করে, এবং বাকীটি, যা একটি স্ট্যাটিক বাহ্যিক ফাইলে নির্দিষ্ট করা যায় এবং তারপরে ক্যাসকেড (সিএসএসের জন্য) অথবা বিশ্বব্যাপী অ্যাক্সেসযোগ্য ব্যবহার করে পুনরায় সংযুক্ত করা যায় either ভেরিয়েবল (গ্লোবালস, ডিওএম উপাদান বা জেএসের জন্য আপনি যে কোনও কিউবি-হোল পছন্দ করেন)


জমকালো উত্তর!
scribu

2
কেবলমাত্র একটি ছোট সংযোজন: জেএসের ক্ষেত্রে, আমরা ডায়নামিক ভেরিয়েবলগুলি যুক্ত করতে wp_localize_sciprt ব্যবহার করতে পারি ।
আনহ ট্রান

6

ডায়নামিক সিএসএস কেস মোটামুটি সহজ।

কেবল <style type="text/css"></style>ট্যাগগুলির অভ্যন্তরে গতিশীল সিএসএস সংজ্ঞাগুলিকে আউটপুট করে এমন একটি ক্রিয়াকলাপ তৈরি করুন এবং তারপরে সেই ফাংশনটি হুক করুন wp_print_styles। যেমন

<?php
function mytheme_dynamic_css() {
    $options = get_option( 'mytheme_options' );
    ?>
    <style type="text/css">
    /* Dynamic H1 font family */
    h1 { font-family: <?php echo $options['h1_font_family']; ?>;
    </style>
    <?php
}
add_action( 'wp_print_styles', 'mytheme_dynamic_css' );
?>

অথবা, আসুন আমরা বলি যে আপনার কাছে প্রাক-কনফিগার করা রঙিন স্কিম রয়েছে; আপনি বর্তমান ব্যবহারকারীর সেটিং অনুসারে উপযুক্ত স্টাইলশিট সজ্জিত করতে পারেন:

<?php
function mytheme_enqueue_colorscheme_stylesheet() {
    $options = get_option( 'mytheme_options' );
    $color_scheme = $options['color_scheme'];
    wp_enqueue_style( $colorscheme, get_template_directory_uri() . '/css/' . $color_scheme . '.css' );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_colorscheme_stylesheet' );
?>

মনে রাখবেন যে, এই ক্ষেত্রে, ফাংশনটি হুক করা হয় wp_enqueue_scripts, যেহেতু ওয়ার্ডপ্রেসটির wp_enqueue_stylesঅ্যাকশন হুক নেই।


1
1 হিসাবে একই)। আমি এখন এটিই করছি, তবে আপনার
40k

1
তবে সিএসএসের এই 40 কে কোথাও আউটপুট হতে হবে , তাই না? এবং, অবশ্যই # 1 হিসাবে একই, তবে ওয়ার্ডপ্রেসে গতিশীল সিএসএস ইনজেক্ট করার সঠিক উপায় । :)
চিপ বেনেট

2

আমি ভাবছিলাম এখন কিছুক্ষণের জন্য। আপনার প্রশ্ন আমাকে এটিতে ফিরে আসতে বাধ্য করে।এটি একটি ভাল ধারণা বা না তা নিশ্চিত নয়, তাই আমি সে সম্পর্কে বিশেষজ্ঞদের মন্তব্য চাই like

কি হবে যদি আমিঅ্যাডমিন ডেটা সংরক্ষণ করার সময় পিএইচপি এর মাধ্যমে জাভাস্ক্রিপ্ট / সিএসএস ফাইল লিখি । ব্যবহারকারী একবারে লেআউট পরিবর্তন না করা পর্যন্ত এটি এক সময় রচনা হবে (কোন ব্যবহারকারী সম্ভবত প্রায়শই না করে)। এইভাবে আমরা ব্যবহারকারীর সেটিংসের জন্য ডেটাবেস অ্যাক্সেস করছি কেবল একবার যখন ব্যবহারকারী ডেটা সংরক্ষণ করে।

ফাইলটি লেখার পরে এটি একটি নিয়মিত জাভাস্ক্রিপ্ট / সিএসএস ফাইল হবে তাই থিম লোড হওয়ার সময় আমাদের ডাটাবেসটি কল করতে হবে না।

একটি প্রশ্নের উত্তর দরকার: পিএইচপি ফাইল লেখার সময় যখন কোনও ইনস্ট্যান্ট তাত্ক্ষণিকভাবে সাইটে অ্যাক্সেস করার চেষ্টা করবে তখন কী হবে?

আমার সম্পর্কে আপনি কী মনে করেন জানি।


আপনি যদি এই ফাইলগুলি তৈরি করেন wp-content/uploads(ডাব্লুপি কোড থেকে লিখিতযোগ্য একমাত্র ডিরেক্টরি) তবে এটি একটি কার্যকর পন্থা হতে পারে। আমি মনে করি এমনকি ডাব্লুপি কোরও একটি জেএস ফাইলের জন্য এই কৌশলটি ব্যবহার করে।
স্ক্রিবু

অসুবিধাটি হ'ল এটি সত্যই গতিশীল নয়, অর্থাত্ সমস্ত পৃষ্ঠায় প্রত্যেকের জন্য এটি সমান। প্রতিটি পরিবর্তনের জন্য আপনাকে একটি নতুন ফাইল তৈরি করতে হবে। এটি আপনি থিম / প্লাগইন বিকল্পগুলির জন্য এখনও ভাল পন্থা mentioned
স্ক্রিবু

@ স্ক্রিবু: হ্যাঁ এটি সত্য। এটি এমন কিছুর জন্য গোলযোগ হতে পারে। যদি আমরা ব্যবহারকারীদের একটি কাস্টমাইজড প্রোফাইল পৃষ্ঠা দেই এবং তাদের প্রতিটি ফাইল লিখতে পারি। তবে এটি যদি আমরা কোনও ভিজ্যুয়াল ওয়েবসাইট নির্মাতা (টেনে আনুন এবং ফেলে রাখি) যেখানে ব্যবহারকারী রঙ পরিবর্তন করে এবং বিভিন্ন প্রভাব (এই প্রশ্নটি হিসাবে) ইত্যাদি যুক্ত করে এবং ডাব্লুপিএমইউ এর সাথে মিলিত হতে পারে এমন কোনও কিছুর জন্য এটি একটি ভাল পদ্ধতির হতে পারে
সিসির

1

স্ক্রিপ্টগুলির ছোট ছোট টুকরাগুলির জন্য, যা আপনি একটি পৃথক ফাইলে অন্তর্ভুক্ত করতে নাও চান, উদাহরণস্বরূপ কারণ এগুলি গতিশীলভাবে তৈরি করা হয়েছে, ওয়ার্ডপ্রেস 4.5 এবং আরও অফার wp_add_inline_script। এই ফাংশনটি মূলত স্ক্রিপ্টটিকে অন্য স্ক্রিপ্টে ল্যাচ করে। উদাহরণস্বরূপ বলা যাক যে আপনি একটি থিম তৈরি করছেন এবং চান যে আপনার গ্রাহক তার নিজস্ব স্ক্রিপ্টগুলি (গুগল অ্যানালিটিক্স বা অ্যাডথিসের মতো) বিকল্প পৃষ্ঠাগুলির মাধ্যমে sertোকাতে সক্ষম হবেন। উদাহরণ

শৈলীর জন্য রয়েছে wp_add_inline_style, যা মূলত একই কাজ করে। উদাহরণস্বরূপ, আপনি এটি আপনার সমস্ত কাস্টমাইজার মোডগুলি লুপ করতে এবং এটিকে ডাকা স্ট্রিংয়ে জড়ো $all_modsকরতে ব্যবহার করবেন, যা আপনি আপনার মূল স্টাইলশীটে এই জাতীয় সংযোজন করবেন:

if (!empty($all_mods)) wp_add_inline_style ('main-style', $all_mods);

-2

একটি গতিশীল জেএস.এফপি ফাইল তৈরি করুন এবং এটিতে গুরুত্বপূর্ণ ক্যোয়ারী_ভারগুলি ফিড করুন। এই ভেরিয়েবলগুলি $_GETফাইলটিকে প্রসঙ্গ নির্ধারণে সহায়তা করবে এবং এতে আপনি readfile()ভবিষ্যতে অনুরোধের জন্য ক্যাশে এবং ব্যবহার করতে পারবেন ... যাই হোক না কেন করুন।

কেবলমাত্র নিশ্চিত হয়ে নিন যে ফাইলটি wp-load.phpঅন্য কোনও কিছুর আগে লোড হয় , যাতে আপনার ডাব্লুপি ফাংশনে অ্যাক্সেস থাকে। বর্তমান ফোল্ডারে আপেক্ষিক পথটি ব্যবহার করুন (dirname(__FILE__))বা wp-load.phpপ্লাগইন প্লেসমেন্ট নির্বিশেষে সনাক্ত করতে ফোল্ডার কাঠামোয় কেবল উত্ক্রান্ত খনন করুন ।

কোথাও থেকে wp-load.php সন্ধানের কোড seek

// Ensure single declaration of function!
if(!function_exists('wp_locate_loader')):
    /**
     * Locates wp-load.php looking backwards on the directory structure.
     * It start from this file's folder.
     * Returns NULL on failure or wp-load.php path if found.
     * 
     * @author EarnestoDev
     * @return string|null
     */
    function wp_locate_loader(){
        $increments = preg_split('~[\\\\/]+~', dirname(__FILE__));
        $increments_paths = array();
        foreach($increments as $increments_offset => $increments_slice){
            $increments_chunk = array_slice($increments, 0, $increments_offset + 1);
            $increments_paths[] = implode(DIRECTORY_SEPARATOR, $increments_chunk);
        }
        $increments_paths = array_reverse($increments_paths);
        foreach($increments_paths as $increments_path){
            if(is_file($wp_load = $increments_path.DIRECTORY_SEPARATOR.'wp-load.php')){
                return $wp_load;
            }
        }
        return null;
    }
endif;
// Now try to load wp-load.php and pull it in
$mt = microtime(true);
if(!is_file($wp_loader = wp_locate_loader())){
    header("{$_SERVER['SERVER_PROTOCOL']} 403 Forbidden");
    header("Status: 403 Forbidden");
    echo 'Access denied!'; // Or whatever
    die;
}
require_once($wp_loader); // Pull it in
unset($wp_loader); // Cleanup variables

চিয়ার্স, স্ক্রিবু!

পিএস : জটিল স্ট্রাকচারের জন্য যেখানে ফোল্ডারগুলি স্বাভাবিক ডাব্লুপি হ্রাসমূলক কাঠামো অনুসরণ করে না, প্যারেন্ট প্লাগইনগুলি সরাসরি অ্যাক্সেসযোগ্য ফাইলগুলির সাথে তথ্যগুলি ভাগ করতে পারে। একজন পিতা বা মাতা প্লাগইন যে একটি গতিশীল পিএইচপি ফাইল সিএসএস উপস্থাপনা দিয়ে আসে / জেএস একটি ফাইলে লিখতে পারেন realpath()এর wp-load.phpএবং স্বতন্ত্র যে ফাইলটি ব্যবহার করতে পারেন। এটি 0.1% ডাব্লুপি ব্যবহারকারীদের জন্য একটি সমস্যা হবে। আমি মনে করি যারা ফোল্ডারগুলি সরান এবং সাধারণ কাঠামো অনুসরণ করেন না তারা জানেন যে তারা কী করছেন এবং সম্ভবত পিএমপি প্লাগিনগুলি করতে পারেন যা wp-load.phpসরাসরি লোড করা দরকার ।


চতুর! বিরক্তিকর, দয়া করে ব্যাখ্যা যুক্ত করুন। আমাকে আলোকিত করুন। ধন্যবাদ;) xoxo
আর্নেস্তোদেভ

wp-load.phpথিম বা প্লাগইন ফাইল থেকে অন্তর্ভুক্ত করা খারাপ অভ্যাস , যেহেতু wp-contentএবং / অথবা plugins ডিরেক্টরিগুলি ডাব্লুপি ডিরের সাথে যে কোনও জায়গায় থাকতে পারে। WP_CONTENT_DIR এবং WP_PLUGINS_DIR মনে রাখবেন।
স্ক্রিবু

1
@scribu এবং স্বতন্ত্র ফাইলটি প্যারেন্ট প্লাগইনের সাথে সহযোগিতা করতে পারে। প্যারেন্ট প্লাগইনটি যেখানে অবস্থিত ফোল্ডারে wp-load.php সঞ্চয় করতে পারে এবং ডায়নামিক জেএস জেনারেটর সেখান থেকে এটি পড়তে পারে। সাধারণ ...
আর্নেস্টোদেভ

1
হ্যাঁ, প্যারেন্ট প্লাগইন পদ্ধতির কাজ করতে পারে। আপনার উত্তরে এটি লিখুন এবং আমি আমার ডাউনটোটটি সরিয়ে দেব। পিএস: এই সাইটটি ইংরেজিতে রয়েছে; আপনি রোমানিয়ান ভাষায় মন্তব্য করা চালিয়ে যেতে থাকলে আপনার সমস্যা হতে পারে।
স্ক্রিবু

5
মনোভাব কাটা। ম্যানুয়াল কোর লোড व्यवहार्य কৌশল, তবে বেশিরভাগ জিনিসের জন্য প্রথম পছন্দ থেকে দূরে। কেউ সন্দেহ করে না যে আপনি এটি কাজ করতে পারেন। ভোট আপনার মস্তিষ্কের নয়, উত্তরগুলির উত্তর সম্পর্কে।
রাস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.