ওয়ান-টাইম স্ক্রিপ্টগুলি কার্যকর করার জন্য আপনার সেরা অনুশীলন কী?


32

সমস্যাটি

আমরা সকলেই এইরকম পরিস্থিতিতে পড়েছি এবং এই সাইটে প্রচুর প্রশ্নের এই জাতীয় সমাধানের প্রয়োজন। আপনাকে হয় একটি ডেটাবেস আপডেট করতে হবে, স্বয়ংক্রিয়ভাবে প্রচুর ডেটা ,োকাতে হবে, রূপান্তর meta_keysকরতে হবে বা এরকম কিছু।

অবশ্যই, সেরা অনুশীলনের উপর ভিত্তি করে চলমান সিস্টেমে এটি হওয়া উচিত নয়।

তবে যেমনটি হয়, আমি আপনার এই সমস্যার ব্যক্তিগত সমাধান এবং আপনি কেন নিজেকে বেছে নিয়েছেন তা শুনতে ভাল লাগবে।

প্রশ্নটি

আপনি কীভাবে আপনার (চলমান) ওয়ার্ডপ্রেস ইনস্টলটিতে ওয়ান-টাইম স্ক্রিপ্টগুলি প্রয়োগ করবেন?

এখানে সমস্যাটি মূলত নিম্নলিখিত কারণগুলির কারণে:

  • ডেটা sertোকানো স্ক্রিপ্টগুলি একাধিকবার চলবে না
  • যে সমস্ত স্ক্রিপ্টগুলির জন্য প্রচুর রিসোর্স প্রয়োজন সেগুলি যখন পর্যবেক্ষণ করা যায় না এমন সময়ে চালানো উচিত নয়
  • এগুলি দুর্ঘটনাক্রমে চালানো উচিত নয়

আমি জিজ্ঞাসা কারণ

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

আপনার কাছ থেকে শেখার অপেক্ষায় :)


2
যদি এটি সত্যিই কেবল এক সময়ের একমাত্র চুক্তি হয় তবে আমি স্ক্রিপ্টটি লিখি, আমি এটি চালনা করি, তবে আমি এটি মুছি। এর পরে আর কেউ চালাতে পারে না। সমস্ত কিছুর মতো কোডও ক্ষণস্থায়ী। ;)
অটো

1
বিষয়টি আমি উদ্বিগ্ন যে কোনও স্ক্রিপ্টটি কাকতালীয়ভাবে দ্বিতীয়বার বলা যেতে পারে। তবে আমি আপনার পদ্ধতিটি অসংখ্যবার করেছি;)
ফিশচি

এটি একটি প্লাগইনের প্রশাসক পৃষ্ঠায় চালান, সর্বদা আমার জন্য কাজ করে। আপনি যদি প্রয়োজন হয় তবে এটি আপনিই হন তা নিশ্চিত করার জন্য আপনি পৃষ্ঠার শীর্ষে লেখক চেকগুলি যুক্ত করতে পারেন।
অ্যান্ড্রু বার্টেল

তবে আপনি নির্ধারিত এক সময় কার্যকর করার কথা বলছেন না , কেবল ম্যানুয়াল ?
বিরগিরে

1
হ্যাঁ, আমি কেবল সময় অনুসারে ম্যানুয়াল সম্পর্কেই কথা বলছি, যেমন মাইগ্রেশন-স্ক্রিপ্ট ইত্যাদি, wp-cronনির্ধারিত ইভেন্টগুলি নয়।
ফিশচি

উত্তর:


17

আমি নিজের জন্য এর সংমিশ্রণটি ব্যবহার করি:

  • এককালীন স্ক্রিপ্টে উত্সর্গীকৃত একটি ফাইল
  • স্ক্রিপ্টটি দুর্ঘটনাক্রমে একাধিকবার চালানো থেকে বিরত রাখতে একটি ক্ষণস্থায়ী ব্যবহার করে
  • স্ক্রিপ্টটি কেবলমাত্র আমার দ্বারা পরিচালিত হয়েছে তা নিশ্চিত করতে সক্ষমতা-পরিচালনা বা ব্যবহারকারী-নিয়ন্ত্রণ ব্যবহার করে।

গঠন

আমি onetime.phpআমার অন্তর্ভুক্ত ফোল্ডারে একটি ফাইল ( ) ব্যবহার করি incযা এতে অন্তর্ভুক্ত থাকে এবং functions.phpব্যবহারের পরে সেখান থেকে মুছে ফেলা হয়।

include( 'inc/onetime.php' );

লিপি নিজেই ফাইল

আমার সালে onetime.phpআমার ফাংশন f711_my_onetime_function()স্থাপন করা হয়। যেহেতু এটি কোনও ফাংশন হতে পারে। আমি ধরে নিলাম আপনার স্ক্রিপ্টটি পরীক্ষা করা হয়েছে এবং সঠিকভাবে কাজ করে।

স্ক্রিপ্টের প্রয়োগের উপর নিয়ন্ত্রণ অর্জন করতে, আমি উভয়ই ব্যবহার করি

ক্ষমতা নিয়ন্ত্রণ

অন্য স্ক্রিপ্টগুলি দুর্ঘটনাক্রমে আমার স্ক্রিপ্ট কার্যকর করা থেকে বিরত রাখতে:

if ( current_user_can( 'manage_options' ) ) // check for administrator rights

অথবা

if ( get_current_user_id() == 711 ) // check if it is me - I prefer restricting the execution to me, not to all admins.

একটি ক্ষণস্থায়ী

নিজেকে একাধিকবার স্ক্রিপ্টটি দুর্ঘটনাক্রমে চালানো থেকে বিরত রাখতে।

$transient = 'f711_my_onetime_check';
if ( !get_transient( $transient ) ) // check if the function was not executed.

আমার ফাংশনে স্ক্রিপ্টটি সম্পাদন করার জন্য ফাইলটি f711_my_onetime_function()দেখতে এমন হবে:

$transient = 'f711_my_onetime_check';
if ( get_current_user_id() == 711 && !get_transient( $transient ) ) {

    set_transient( $transient, 'locked', 600 ); // lock function for 10 Minutes
    add_action( 'wp_footer', 'f711_my_onetime_function' ); // execute my function on the desired hook.

}

function f711_my_onetime_function() {
    // all my glorious one-time-magic.
}

চেকের উপস্থিতি উপস্থিত হওয়ার সাথে সাথেই আমি ক্ষণস্থায়ী সেট করার কারণটি হ'ল আমি চাই যে স্ক্রিপ্টটি দু'বার ব্যবহার করার ক্ষেত্রে স্ক্রিপ্টটি লক হয়ে যাওয়ার পরে ফাংশনটি কার্যকর করা হোক

আমার ফাংশন থেকে যদি আমার কোনও আউটপুট প্রয়োজন হয় তবে আমি এটি ফুটারে মন্তব্য হিসাবে মুদ্রণ করি বা কখনও কখনও আমি সামগ্রীটি ফিল্টারও করি।

লকআউটটাইমটি 10 ​​মিনিটে সেট করা থাকে তবে আপনার প্রয়োজনের সাথে সামঞ্জস্য করা যায়।

পরিষ্কার কর

আমার স্ক্রিপ্ট সফল সঞ্চালনের পর আমার দ্বারা মুছে ফেলা includeথেকে functions.php, এবং অপসারণ onetime.phpসার্ভার থেকে। যেহেতু আমি ক্ষণস্থায়ীটির জন্য একটি সময়সীমা ব্যবহার করেছি, আমার ডাটাবেস পরিষ্কার করার দরকার নেই, তবে আপনি ফাইলটি সরিয়ে দেওয়ার পরে অবশ্যই আপনি ক্ষণস্থায়ীটিকে মুছতে পারেন।


আমি এটিতে আমার উত্তর যুক্ত করার কথা ভেবেছিলাম, তবে এই উত্তরের শীর্ষে আপনার তালিকাটি পড়ার পরে ... আমার পন্থাটি প্রায় একই রকম দেখাবে বলে আমি আর করব না। সুতরাং এটির জন্য +1 - এ সম্পর্কে বিস্তারিত চিন্তাভাবনার জন্য।
tfrommen

14

আপনি এটি করতে পারেন:

চালানো onetime.phpএবং মৃত্যুর পরে নামকরণ।

if ( current_user_can( 'manage_options' ) ) {

    if( ! file_exists( '/path/to/onetime.php' ) )
      return;
    add_action( 'wp_footer', 'ravs_my_onetime_function' ); // execute my function on the desired hook.

}

function ravs_my_onetime_function() {

    // all my glorious one-time-magic.
    include( '/path/to/onetime.php' );

   // after all execution rename your file;
   rename( '/path/to/onetime.php', '/path/to/onetime-backup.php');
}

এই আমরা কি করতেছি; এটি নির্বোধ-প্রমাণ হওয়ার গ্যারান্টিযুক্ত।
কিউস

7

আমি এটির জন্য একটি কমান্ড লাইন ফিং স্ক্রিপ্ট তৈরি করেছি, এটি বাহ্যিক স্ক্রিপ্টটি চালানো ছাড়া অন্য বিশেষ কিছু নয়। আমি সিএলআই এর মাধ্যমে এটি ব্যবহার করার কারণ হ'ল:

  • আমি ভুল করে এটি লোড করা চাই না (কমান্ড টাইপ করা দরকার)
  • এটি নিরাপদ যেহেতু এটি ওয়েবের মূলের বাইরে চালানো যেতে পারে, অন্য কথায় এটি ডাব্লুপি'কে প্রভাবিত করতে পারে তবে ডাব্লুপি কোনওভাবে স্ক্রিপ্টে পৌঁছতে পারে না।
  • এটি ডাব্লুপি বা ডিবিতে কোনও কোড যুক্ত করে না।

require('..path to ../wp-blog-header.php');
//bunch of WP globals
define('WP_USE_THEMES', false);
//custom code

সুতরাং আপনি Phing, বা পিএইচপি সি এল আই ব্যবহার করতে পারেন এবং রাতে ঘুমাতে পারেন। ডাব্লুপি-সিএলআইও একটি ভাল বিকল্প, যদিও আপনি যদি এটি ওয়েবের মূলের বাইরে ব্যবহার করতে পারেন তবে আমি ভুলে যাই।

যেহেতু এটি একটি জনপ্রিয় পোস্ট এখানে স্ক্রিপ্টের একটি উদাহরণ: https://github.com/wycks/WordPhing (run.php)


এটি দেখতে দুর্দান্ত এবং সাধারণ, পাশাপাশি সুরক্ষিত। আপনি কমান্ড লাইনটি ব্যবহার করে আমার একটি প্রধান উদ্বেগকে (দুর্ঘটনার দ্বারা আমি দু'বার মৃত্যুদণ্ড কার্যকর করে) coveredেকে রেখেছি। ভাল যুক্তি!
ফিশচি

5

এককালীন স্ক্রিপ্ট চালানোর আর একটি দুর্দান্ত সহজ উপায় হ'ল এম ইউ প্লাগইনের মাধ্যমে এটি করা।

কিছু পিএইচপি ফাইলের (যেমন, one-time.php) কোডটি রেখে দিন যা আপনি আপনার এমইউ প্লাগইনগুলির ফোল্ডারে (ডিফল্টরূপে) আপলোড করেন/wp-content/mu-plugins ), ফাইলের অনুমতিগুলি সামঞ্জস্য করুন, প্লাগইনটি চালান (যেমন, আপনার নির্বাচিত হুক অনুসারে, আপনাকে মূলত সামনের দিকে যেতে হবে / ব্যাকএন্ড) এবং আপনি সব শেষ করেছেন।

এখানে একটি বয়লারপ্লেট রয়েছে:

/**
* Main (and only) class.
*/
class OneTimeScript {

    /**
     * Plugin function hook.
     *
     * @type    string
     */
    public static $hook = 'init';


    /**
     * Plugin function priority.
     *
     * @type    int
     */
    public static $priority = 0;


    /**
     * Run the one-time script.
     *
     * @hook    self::$hook
     * @return  void
     */
    public static function run() {
        // one-time action goes here...

        // clean up
        add_action('shutdown', array(__CLASS__, 'unlink'), PHP_INT_MAX);
    } // function run


    /**
     * Remove the file.
     *
     * @hook    shutdown
     * @return  void
     */
    public static function unlink() {
        unlink(__FILE__);
    } // function unlink

} // class OneTimeScript

add_action(OneTimeScript::$hook, array('OneTimeScript', 'run'), OneTimeScript::$priority);

মন্তব্য এবং স্টাফ ছাড়াই, এটি কেবল এটির মতো দেখাচ্ছে:

class OneTimeScript {
    public static $hook = 'init';
    public static $priority = 0;

    public static function run() {
        // one-time action goes here...
        add_action('shutdown', array(__CLASS__, 'unlink'), PHP_INT_MAX);
    } // function run

    public static function unlink() {
        unlink(__FILE__);
    } // function unlink
} // class OneTimeScript
add_action(OneTimeScript::$hook, array('OneTimeScript', 'run'), OneTimeScript::$priority);

4

আদর্শ অবস্থার অধীনে আমি সার্ভারে ssh করব এবং ডাব্লুপি-ক্লিপ ব্যবহার করে নিজেই ফাংশনটি সম্পাদন করব।

যদিও এটি প্রায়শই সম্ভব হয় না, তাই আমি একটি G _GET ভেরিয়েবল সেট করে 'এআইডি'-এ হুক করে থাকি, উদাহরণস্বরূপ:

add_action( 'init', function() {
    if( isset( $_GET['one_time'] ) && $_GET['one_time'] == 'an_unlikely_string' ) {
        do_the_one_time_thing();
    }
});

তারপর আঘাত

http://my_blog.com/?one_time=an_unlikely_string

এবং এটি শেষ হয়ে গেলে হুকটি অক্ষম করুন।


4

কখনও কখনও আমি প্লাগইন নিষ্ক্রিয়করণের উপর আবদ্ধ একটি ফাংশন ব্যবহার করি।

এখানে দেখুন পুরানো লিঙ্কগুলিকে আপডেট করুন প্রিমিটি পারমালিক্স কাস্টম পোস্টের ধরণে

একবার কেবল প্রশাসকরা প্লাগইনগুলি সক্রিয় করতে পারলে সেখানে পার্শ্ব প্রতিক্রিয়া হিসাবে একটি দক্ষতা যাচাই করা হবে।

নিষ্ক্রিয়কৃত ফাইলটি একবার মুছে ফেলার দরকার নেই এটি ওয়ার্ড্রেস দ্বারা অন্তর্ভুক্ত হবে না। নেশায় আপনি যদি আবার দৌড়াতে চান তবে আপনি এটি করতে পারেন। আবার সক্রিয় ও নিষ্ক্রিয় করা হচ্ছে।

এবং কখনও কখনও আমি @ ফিশির উত্তরের মতো ব্যবহৃত ক্ষণস্থায়ী ব্যবহার করি। উদাহরণস্বরূপ এখানে চিত্রগুলি থেকে ওয়ার্ক কমার্স পণ্য তৈরি করতে কোয়েরি করুন বা এখানে স্বয়ংক্রিয়ভাবে প্রকাশিত পোস্টের জন্য পোস্টের সামগ্রীতে আইএমজি ট্যাগগুলি মুছুন / প্রতিস্থাপন করুন

উভয়ের সংমিশ্রণ একটি বিকল্প হতে পারে।


এটিও সত্যই একটি ভাল ধারণা। যদি এটি সর্বদা বিরক্তিকর হয়ে ওঠে তবে এটিকে আবার নিষ্ক্রিয় করতে সক্রিয় করতে হবে, আপনি একই ফাংশনটি প্লাগইনটির অ্যাক্টিভেশনেও আঁকতে পারেন, তাই না?
ফিশচি

হ্যা যদি তুমি চাও. যাইহোক, আমি মনে করি যে 2 টি ক্লিকগুলি এক-সময় স্ক্রিপ্ট চালানোর জন্য দুর্দান্ত প্রচেষ্টা নয়। সিএলআই কমান্ড বা ফাইল হ্যান্ডলিং (নাম পরিবর্তন, মোছা) জড়িত অন্য যে কোনও সমাধানের জন্য আরও "কাজের" প্রয়োজন। তদাতিরিক্ত, আপনি যতবার হুকের উপর নির্ভর করেন, আপনি গ্লোবাল ভেরিয়েবলের উপর নির্ভর করেন, কোডের সুরক্ষা / পূর্বাভাসের বিষয়ে সম্ভাব্য সমস্যাগুলির একটি অতিরিক্ত স্তর যুক্ত করে। @ ফিসচি
গাজাজাপ

আমার মনে হয় না যে দুটি ক্লিক খুব বেশি, কেবল জিজ্ঞাসা করতে চেয়েছিল :)
ফিশচি

3

অবশ্যই আপনি পারবেন, কেবলমাত্র আপনার ওয়ান টাইম কোডটিকে একটি প্লাগইন হিসাবে তৈরি করুন।

add_action('admin_init', 'one_time_call');
function one_time_call()
{
    /* YOUR SCRIPTS */
    deactivate_plugins('onetime/index.php'); //deactivate current plugin
}

অ্যাক্টিভেট লিঙ্কটিতে ক্লিক না করে আমি কীভাবে এই প্লাগইনটি সক্রিয় করব?

শুধু যোগ activate_plugins('onetime/index.php');মধ্যেfunctions.php

বা ব্যবহারে অবশ্যই প্লাগইনগুলি ব্যবহার করতে হবে, http://codex.wordpress.org/Must_Use_Plugins

আপনি যখন ওয়ানটাইম প্লাগইন সম্পাদন করতে চান তখন বিভিন্ন ক্রিয়া দিয়ে চেষ্টা করুন,

  1. অ্যাডমিন_ইনিট - অ্যাডমিন টিম পরে

  2. init - ওয়ার্ডপ্রেস init

  3. ডাব্লুপি - যখন ওয়ার্ডপ্রেস লোড হয়


2

আর একটি উপায় হ'ল কাজ শেষ হয়ে গেলে একটি বিশ্বব্যাপী wp_option সেট করা এবং প্রতিবার init হুক কার্যকর হওয়ার পরে সেই বিকল্পটি পরীক্ষা করা।

function my_one_time_function() {
    // Exit if the work has already been done.
    if ( get_option( 'my_one_time_function', '0' ) == '1' ) {
        return;
    }

    /***** DO YOUR ONE TIME WORK *****/

    // Add or update the wp_option
    update_option( 'my_one_time_function', '1' );
}
add_action( 'init', 'my_one_time_function' );

স্বাভাবিকভাবেই আপনার এই কোডটি চিরতরে রাখার দরকার নেই (এটি ডাটাবেস থেকে সাধারণ পাঠযোগ্য হলেও), কাজটি শেষ হওয়ার পরে আপনি সম্ভবত কোডটি সরিয়ে ফেলতে পারেন। আপনার কোডটি পুনঃ-কার্যকর করতে হলে আপনি নিজেই এই বিকল্পটির মান 0 তে পরিবর্তন করতে পারেন।


1

আমার এ বিষয়ে কিছুটা ভিন্ন। আমি আমার থিমের ফাংশন.এফপি-তে একটি ফাংশন হিসাবে আমার ওয়ান-টাইম স্ক্রিপ্ট যুক্ত করতে এবং এটি একটি নির্দিষ্ট জিইটি কোয়েরিতে চালাতে চাই।

if ( isset($_GET['linkupdate']) ) {
    add_action('init', 'link_update', 10);
}
function link_update() {
  // One Time Script
   die;
}

এটি চালানোর জন্য, কেবলমাত্র "www.sitename.com/?linkupdate" URL টি দেখুন

এটি এখন পর্যন্ত আমার পক্ষে ভাল কাজ করছে ...

এই পদ্ধতিতে কি কোনও ত্রুটি আছে? ভাবছি...


1

আমি কেবলমাত্র একটি একক কাস্টম পণ্য টেম্পলেট পৃষ্ঠা ব্যবহার করছি যা আমি ব্যবহার করছি না এবং পাবলিক সার্ভারের কোনও কিছুর সাথে সংযুক্ত নেই।

আমার কাছে যদি প্রশংসাপত্রীয় পৃষ্ঠা থাকে যা লাইভ না থাকে (খসড়া মোডে বা যাই হোক না কেন) তবে একক পৃষ্ঠার টেমপ্লেটের সাথে সংযুক্ত আছে, উদাহরণস্বরূপ single-testimonial.php- আমি সেখানে ফাংশন রাখতে পারি, একটি মাধ্যমে পৃষ্ঠাটি লোড করতে পারিpreview এবং ফাংশন বা যা কিছু আছে তার একবার চালু। ডিবাগিংয়ের ক্ষেত্রে ফাংশনে পরিবর্তন করা খুব সহজ।

সত্যিই সহজ এবং আমি এটি ব্যবহারের চেয়ে বেশি পছন্দ করি initকারণ এটি কখন এবং কীভাবে চালু হয়েছিল তার উপর আমার আরও নিয়ন্ত্রণ রয়েছে। শুধু আমার পছন্দ।


0

এটি যদি সহায়তা করে তবেই আমি এটি করেছি এবং এটি ভালভাবে কাজ করে:

add_action( 'init', 'upsubscriptions_setup');

function upsubscriptions_setup()
{
    $version = get_option('upsubscriptions_setup_version');

    // If no version is recorded yet in the DB
    if (!$version) {
        add_option('upsubscriptions_setup_version', '0.1');
        $version = get_option('upsubscriptions_setup_version');
    }

    if (version_compare($version, "0.1") <= 0) {
        // do stuff
        update_option('upsubscriptions_setup_version', '0.2');
    }

    if (version_compare($version, "0.2") <= 0) {
        // do stuff
        update_option('upsubscriptions_setup_version', '0.3');
    }

    if (version_compare($version, "0.3") <= 0) {
        // do stuff
        update_option('upsubscriptions_setup_version', '0.4');
    }

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