কীভাবে করবেন_ এবং কীভাবে রিটার্নের মান পাবেন?


10

সুতরাং নিম্নলিখিত পরিস্থিতি আছে।

আমি ডাটাবেস থেকে লগগুলি পরিষ্কার করার জন্য একটি ক্রিয়া যুক্ত করছি:

add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

এখন আমি পর্যায়ক্রমে এই ক্রিয়াটি চালাতে চাই:

wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );

এবং এটি নিজে চালিত করুন:

do_action( 'myplugin_clean_logs' );

পদ্ধতিটি MyPlugin_Logs::clean_logsযদি অন্যদিকে চলে যায় তবে প্রভাবিত সারিগুলির সংখ্যা বা মিথ্যাটি প্রদান করে।

এখন আমি মুছে ফেলা সারিগুলির সংখ্যা প্রদর্শন করতে চাই। আমি এরকম কিছু কল্পনা করব:

$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';

তবে যে do_actionকোনও মান ফেরত দেবে না, কীভাবে রিটার্নের মান পাবেন তা আমার কোনও ধারণা নেই।

আমি কি সরাসরি কোনও ম্যানুয়াল রান করে পদ্ধতিটি সম্পাদন করব, তবে তফসিল ইভেন্টের ক্রিয়াটি ব্যবহার করব?


1
আপনি কোনও নির্ধারিত ইভেন্টে কোনও কিছু প্রতিধ্বনি করতে চান না, তাই হ্যাঁ, আমি পদ্ধতিটি সরাসরি একটি ম্যানুয়াল রান করে চালিয়ে দেব (আমি ধরে নিচ্ছি প্রশাসক এটি ট্রিগার করবে, এবং আপনি তাদের আউটপুটটি দেখাতে চান)।
টিম ম্যালোন

উত্তর:


13

শীতল জিনিসটি একটি ফিল্টার একটি ক্রিয়া হিসাবে একই, কেবল এটি একটি মান দেয়, সুতরাং কেবল এটির পরিবর্তে ফিল্টার হিসাবে সেট আপ করুন:

add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

তারপরে এমন কিছু:

$affected_rows = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );

(এবং অন্য যে কোনও ক্রিয়াকলাপে আপনাকে আবদ্ধ করা যেতে পারে ) এর $affected_rowsকাছে পাস করা উচিত এবং ফেরতের মানটি আবার নির্ধারণ করা উচিত ।clean_logs()myplugin_clean_logs$affected_rows


4
এটি হ্যাকিং কোডটি সফ্টওয়্যার বিকাশের পরিবর্তে হ'ল ডাউনওয়েটেড। যদি ক্রিয়াগুলি কেবলমাত্র ফিল্টারগুলির একটি উপসেট হত তবে সেগুলির কোনও দরকার পড়েনি। ক্রোন মান পাস করতে পারে না কারণ এটি বগী কোর কোড আপনাকে এই জাতীয় শিমিগান করতে দেয় এমনকি যদি এটি ফিল্টার হিসাবে আটকানো উচিত নয় :)
মার্ক কাপলুন

1
পয়েন্ট নেওয়া হয়েছে। আমি পেয়েছি যে দুটি ভিন্ন জিনিসের অভিপ্রায় , তবে এখানে মূল কোডটি দেখার জন্য, পুরো do_action()জিনিসটি একটি বিস্তৃত হ্যাক ছাড়া আর কিছুই নয় apply_filters():)
ক্যাস্পার

মূলত কেবলমাত্র খারাপ নকশা নয় যা কিছুটা বিভ্রান্তির দিকে নিয়ে যায় যা এই জাতীয় প্রশ্নের জন্ম দেয়
মার্ক কাপলুন

1
আমরা যা পেয়েছি তার সাথে আমাদের কাজ করা দরকার, তাই আমি যখন মার্কের দৃষ্টিভঙ্গিটি বুঝতে পারি তখনও আমি মনে করি এটি একটি আইনী উত্তর - যদি না ভবিষ্যতে অবশ্যই এই পদ্ধতির পরিবর্তন না হয় তবে আমি মনে করি যে বিশাল পিছনের সামঞ্জস্য সমস্যার কারণে এটি অসম্ভব এটি পরিচয় করিয়ে দেবে।
টিম ম্যালোন

3
ধন্যবাদ, @ টিমম্যালোন আমি @ মার্ক-কাপলুনের আপত্তিটির প্রশংসা করি। আমার উত্তর বর্ণনা করে যে কীভাবে do_action()কোনও উদ্দেশ্য প্রত্যাবর্তন না করে প্রায় কীভাবে কাজ করা যায় তার পরিবর্তে কীভাবে উদ্দেশ্যগুলির সাথে একত্রে সমাধান ডিজাইন করা যায় do_action()। কেউ যদি জিজ্ঞাসা করে তা করতে সক্ষম হয় তবে সেই উত্তরটি গ্রহণযোগ্য উত্তর হিসাবে প্রাপ্য। আমার প্রথম ধারণাটি হুকড পদ্ধতিতে হবে (ধরে নিই যে ওপি এই প্লাগইনটির জন্য একটি ওওপি নকশা ব্যবহার করছে) এর ফলাফলটি প্লাগইন শ্রেণীর একটি সুরক্ষিত সম্পত্তিতে ফেলে এবং তারপরে কিছুটা পরে তা বের করার জন্য একটি দ্রুত গিটার লিখুন। তবে এটি কেবল একটি ধারণার বুনো চুল!
ক্যাস্পার

-1

এই ফাংশনটি কখনও ব্যবহার করেন নি এবং এটি পরীক্ষাও করেনি, তবে এটি কি কাজ করে? do_action_ref_array ()

function myplugin_clean_logs_fn() {
    $args = array(
        'param1'        => 'val1',
        'param2'        => 'val2',
        'affected_rows' => 0,
    );
    do_action_ref_array( 'myplugin_clean_logs', &$args );
    return $args['affected_rows'];
}

// CALL IT
$affected_rows = my_plugin_clean_logs();
echo $affected_rows .' entr'. ($args['affected_rows']*1===1?'y':'ies') .' deleted.';

// SCHEDULE IT
add_action('myplugin_clean_logs_call_fn', 'myplugin_clean_logs_fn');
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs_call_fn' );

// A SAMPLE FILTER
add_action('myplugin_clean_logs', function($args) {
    // Cleaning process
    // For each log affected, increment $args['affected_rows'] accordingly
}, 10, 3);

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


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

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