এই কোডটি কতবার চলবে? (বা, ঠাকুরমা কতটা ধনী?)


20

হাইপোথিটিক্যাল উদাহরণ তবে আসল বিশ্বের প্রয়োগযোগ্যতা (আমার মতো কেউ শেখার জন্য)।

এই কোড দেওয়া:

<?php

function send_money_to_grandma() {
     internetofThings("send grandma","$1");
}

add_action('init','send_money_to_grandma');
add_action('init','send_money_to_grandma');

ঠিক আছে, এখন আমি আমার ডাব্লুপি সাইটটি আনব এবং লগ ইন করব Ad অ্যাডমিনে আমি কয়েকটি পৃষ্ঠা অতিক্রম করি। আমার ল্যাপটপের ব্যাটারিটি মারা যাওয়ার আগে অ্যাকশন 'আরআইআই' মোট 100 বার গুলি চালায়।

প্রথম প্রশ্ন: আমরা ঠাকুরমার কাছে কত টাকা পাঠিয়েছি? এটি কি $ 1, $ 2, $ 100 বা 200 ডলার (বা অন্য কিছু?)

আপনি যদি নিজের উত্তরটি ব্যাখ্যা করতে পারেন তবে দুর্দান্ত।

দ্বিতীয় প্রশ্ন: আমরা যদি নিশ্চিত করতে চাই যে আমরা কেবল ঠাকুরমা $ 1 প্রেরণ করেছি, তা করার সর্বোত্তম উপায় কী? গ্লোবাল ভেরিয়েবল (সেমফোর) যা 'সত্য' হয়ে যায় আমরা প্রথমবার send 1 প্রেরণ করি? বা ইতিমধ্যে কোনও ক্রিয়া ঘটেছে কিনা এবং এটি একাধিকবার গুলি চালানো থেকে বিরত রাখতে আরও কিছু পরীক্ষা আছে?

তৃতীয় প্রশ্ন: প্লাগইন বিকাশকারীরা কি এটি নিয়ে চিন্তিত? আমি বুঝতে পারি যে আমার উদাহরণটি নির্বোধ তবে আমি উভয়ই পারফরম্যান্স সমস্যা এবং অন্যান্য অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়াগুলি সম্পর্কে চিন্তা করছিলাম (উদাহরণস্বরূপ যদি ডাটাবেসে ফাংশনটি আপডেট / সন্নিবেশ করা হয়)।


2
অবশ্যই স্বীকার করতে হবে, এটি একটি দীর্ঘ সময়ের সেরা প্রশ্ন ;-)
পিটার গুজন

উত্তর:


21

এখানে এ সম্পর্কে কিছু এলোমেলো চিন্তা রয়েছে:

প্রশ্ন 1

আমরা ঠাকুরমার কাছে কত টাকা পাঠিয়েছি?

100 পৃষ্ঠা লোডের জন্য, আমরা তাকে 100 x $ 1 = $ 100 প্রেরণ করেছি।

এখানে আমরা আসলে 100 x do_action( 'init' )কল বলতে চাইছি ।

এটির সাথে আমরা দুবার যুক্ত করেছিলাম তাতে কিছু যায় আসে না:

add_action( 'init','send_money_to_grandma' );
add_action( 'init','send_money_to_grandma' );

কারণ কলব্যাক এবং অগ্রাধিকারগুলি (ডিফল্ট 10) অভিন্ন

আমরা এটি পরীক্ষা করতে পারি যে কীভাবে এটি বিশ্বব্যাপী অ্যারে তৈরি করে তার add_actionজন্য কেবল একটি মোড়ক :add_filter$wp_filter

function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
        global $wp_filter, $merged_filters;

        $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
        $wp_filter[$tag][$priority][$idx] = array(
            'function'      => $function_to_add, 
            'accepted_args' => $accepted_args
        );
        unset( $merged_filters[ $tag ] );
        return true;
}

তবে আমরা যদি অগ্রাধিকারটি পরিবর্তন করে থাকি:

add_action( 'init','send_money_to_grandma', 9 );
add_action( 'init','send_money_to_grandma', 10 );

তারপরে আমরা তাকে প্রতি পৃষ্ঠার লোডের জন্য 2 এক্স $ 1 বা 100 পৃষ্ঠা লোডের জন্য 200 ডলার পাঠাতাম।

কলব্যাক যেখানে আলাদা সেখানে একই:

add_action( 'init','send_money_to_grandma_1_dollar' );
add_action( 'init','send_money_to_grandma_also_1_dollar' );

প্রশ্ন # 2

আমরা যদি তা নিশ্চিত করতে চাই তবে আমরা কেবল ঠাকুরমা $ 1 প্রেরণ করব

আমরা যদি কেবলমাত্র পৃষ্ঠার লোডের জন্য একবার এটি পাঠাতে চাই , তবে এটি করা উচিত:

add_action( 'init','send_money_to_grandma' );

কারণ initহুকটি কেবল একবারই চালিত হয়। আমাদের কাছে এমন অন্যান্য হুক থাকতে পারে যা প্রতি পৃষ্ঠা লোডে বহুবার জ্বলে ওঠে।

চল ডাকি:

add_action( 'someaction ','send_money_to_grandma' );

তবে someactionপৃষ্ঠার লোডে 10 বার আগুন লাগলে কী ঘটে ?

আমরা send_money_to_grandma()সাথে ফাংশন সামঞ্জস্য করতে পারে

function send_money_to_grandma() 
{
    if( ! did_action( 'someaction' ) )
        internetofThings("send grandma","$1");
}

বা কাউন্টার হিসাবে স্ট্যাটিক ভেরিয়েবল ব্যবহার করুন :

function send_money_to_grandma() 
{
    static $counter = 0;
    if( 0 === $counter++ )
        internetofThings("send grandma","$1");
}

যদি আমরা কেবল এটি একবার চালাতে চাই (কখনও!), তবে আমরা wp_optionsটেবিলের কোনও বিকল্প বিকল্প এপিআইয়ের মাধ্যমে নিবন্ধিত করতে পারি :

function send_money_to_grandma() 
{
    if( 'no' === get_option( 'sent_grandma_money', 'no' ) )
    {
        update_option( 'sent_grandma_money', 'yes' );
        internetofThings( "send grandma","$1" );
    }
}

যদি আমরা প্রতিদিন একবার তার টাকা পাঠাতে চাই, তবে আমরা ট্রান্সিয়েন্ট এপিআই ব্যবহার করতে পারি

function send_money_to_grandma() 
{
    if ( false === get_transient( 'sent_grandma_money' ) ) )
    {
        internetofThings( "send grandma","$1" );
        set_transient( 'sent_grandma_money', 'yes', DAY_IN_SECONDS );
    }
}

বা এমনকি ডাব্লুপি-ক্রোন ব্যবহার করুন।

মনে রাখবেন আপনার অজ্যাক্স কল থাকতে পারে। যেমন.

সেগুলির জন্য যাচাই করার উপায় রয়েছে যেমন with DOING_AJAX

পুনর্নির্দেশগুলিও থাকতে পারে, যা প্রবাহকে বাধা দিতে পারে।

তারপর আমরা শুধুমাত্র ব্যাকএন্ড থেকে সীমিত করতে চাইতে পারেন is_admin()বা না: ! is_admin()

প্রশ্ন # 3

এটি কি এমন কিছু যা প্লাগইন বিকাশকারীরা উদ্বিগ্ন?

হ্যাঁ এটি গুরুত্বপূর্ণ।

আমরা যদি আমাদের দাদীকে খুব খুশি করতে চাই তবে আমরা তা করব:

add_action( 'all','send_money_to_grandma' );

তবে এটি পারফরম্যান্সের জন্য খুব খারাপ হবে ... এবং আমাদের মানিব্যাগ ;-)


বাহ - এমন একটি পূর্ণ প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ; এটি প্রচুর সাহায্য করে!
সিসি

1
তুমি স্বাগতম - আমি সত্যিই আস্বাদিত কিভাবে আপনি আপনার প্রশ্ন ;-) @CC phrased
birgire

2
দিনের শেষে, আমরা আমাদের ওয়ালেট এবং ঠাকুমাকে খুশি রাখতে চাই, তাই এটি নিখুঁত সম্প্রীতি / ভারসাম্য খুঁজে পাওয়া সম্পর্কে ;-)
পিটার গুজন

খুব সুন্দর উত্তর +1, তবে এটি বলার অপেক্ষা রাখে না যে কীভাবে বারবার কোনও ক্রিয়া যুক্ত করা যায় তা কলব্যাক আইডির উপরও নির্ভর করে এবং যখন বস্তুর সাথে লেনদেন করা হয় তখন বিষয়গুলি আরও জটিল হয় ... ধারণাটি এখানে আরও ভালভাবে ব্যাখ্যা করা শক্ত, আমি ' একটি উত্তর লিখব ...
গাজাজাপ

ধন্যবাদ @ গাজাজাজেপ - হ্যাঁ দুর্দান্ত হবে, যেহেতু আমি তৃতীয় কী - আইডেক্স এবং _ডব্লিউপি_ফিল্টার_বিল্ড_উনিক_আইডি () সজ্জিত করিনি, এটি কেবল প্রদর্শিত হয়েছে ;-)
বার্গিরে

8

এটি সম্পূর্ণ উত্তরের চেয়ে খুব ভাল বার্গায়ারের উত্তরের একটি মন্তব্য , তবে কোড লিখতে হবে, মন্তব্যগুলি ফিট করে না।

উত্তর থেকে মনে হতে পারে যে ওপি নমুনা কোডে একবারে ক্রিয়া যুক্ত হওয়ার একমাত্র কারণ, এমনকি add_action()দু'বার বলা হলেও একই অগ্রাধিকারটি ব্যবহৃত হয়। এটা সত্যি না.

কোড ইন add_filterএকটি গুরুত্বপূর্ণ অংশ _wp_filter_build_unique_id()ফাংশন কল, যে প্রতি একটি অদ্বিতীয় আইডি তৈরি করে কলব্যাক

আপনি যদি কোনও সাধারণ ভেরিয়েবল ব্যবহার করেন, যেমন একটি স্ট্রিংয়ের মতো যা একটি ফাংশন নাম ধারণ করে, যেমন "send_money_to_grandma", তবে আইডিটি স্ট্রিংয়ের সাথেই সমান হবে, তাই যদি অগ্রাধিকারটি একই হয়, পাশাপাশি আইডি একই রকম হয়, কলব্যাকটি একবার যুক্ত হয়ে যায়।

তবে জিনিসগুলি সর্বদা সহজ হয় না। কলব্যাকগুলি callableপিএইচপি-তে থাকা যা কিছু হতে পারে :

  • ফাংশন নাম
  • স্ট্যাটিক ক্লাস পদ্ধতি
  • গতিশীল বর্গ পদ্ধতি
  • চলনযোগ্য অবজেক্টস
  • সমাপ্তি (বেনামে ফাংশন)

প্রথম দুটি যথাক্রমে একটি স্ট্রিং এবং 2 টি স্ট্রিং ( 'send_money_to_grandma'এবং array('MoneySender', 'send_to_grandma')) এর অ্যারে দ্বারা প্রতিনিধিত্ব করা হয় যাতে আইডি সর্বদা একই থাকে এবং আপনি নিশ্চিত হতে পারেন যে অগ্রাধিকারটি একই হলে একবার কলব্যাক যুক্ত হয়েছিল।

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

এই উদাহরণটি ধরুন:

class MoneySender {

   public function sent_to_grandma( $amount = 1 ) {
     // things happen here
   }

}

$sender1 = new MoneySender();
$sender2 = new MoneySender();

add_action( 'init', array( $sender1, 'sent_to_grandma' ) );
add_action( 'init', array( $sender1, 'sent_to_grandma' ) );
add_action( 'init', array( $sender2, 'sent_to_grandma' ) );

আমরা প্রতি পৃষ্ঠায় কত ডলার পাঠাচ্ছি?

উত্তরটি 2, কারণ আইডি ওয়ার্ডপ্রেস তৈরি করে $sender1এবং $sender2ভিন্ন are

এক্ষেত্রেও একই ঘটনা ঘটে:

add_action( 'init', function() {
   sent_to_grandma();
} );

add_action( 'init', function() {
   sent_to_grandma();
} );

উপরে আমি sent_to_grandmaবন্ধকরণের ভিতরে ফাংশনটি ব্যবহার করেছি এবং কোডটি একরকম হলেও 2 টি ক্লোজার হ'ল \Closureবস্তুর 2 টি পৃথক উদাহরণ , তাই ডাব্লুপি 2 টি পৃথক আইডি তৈরি করবে, যার ফলে অগ্রাধিকারটি একই থাকলেও ক্রিয়াটি দু'বার যুক্ত হবে।


4

আপনি যোগ করতে পারবেন না একই কর্ম করতে একই কর্ম হুক সঙ্গে, একই অগ্রাধিকার

তৃতীয় পক্ষের প্লাগইনগুলির একাধিকবার ঘটনার ক্রিয়াকলাপের উপর নির্ভরশীল একাধিক প্লাগইনগুলি প্রতিরোধ করার জন্য এটি করা হয়েছে (গেটওয়ে পেমেন্ট ইন্টিগ্রেশন ইত্যাদির মতো ওয়ার্ক কমার্স এবং এর সমস্ত তৃতীয় পক্ষের প্লাগইনগুলি ভাবেন)। তাই অগ্রাধিকার নির্দিষ্ট না করেই, ঠাকুরমা দরিদ্র রয়েছেন:

add_action('init','print_a_buck');
add_action('init','print_a_buck');

function print_a_buck() {
    echo '$1</br>';
}
add_action('wp', 'die_hard');
function die_hard() {
    die('hard');
}

তবে, আপনি যদি এই ক্রিয়াকে অগ্রাধিকার যোগ করেন:

add_action('init','print_a_buck', 1);
add_action('init','print_a_buck', 2);
add_action('init','print_a_buck', 3);

দাদী এখন তার পকেটে 4 ডলার দিয়ে মারা যায় (1, 2, 3 এবং ডিফল্ট: 10)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.