ওয়ার্ডপ্রেস প্লাগইনস এবং থিমগুলিতে অটোলয়েডিং ও নামস্পেসগুলি: এটি কি কাজ করতে পারে?


70

কেউ কি কোনও প্লাগইন বা থিমের মধ্যে অটোলয়েডিং এবং / অথবা পিএইচপি নেমস্পেস ব্যবহার করেছেন ?

সেগুলি ব্যবহারের বিষয়ে চিন্তাভাবনা? কোনো ক্ষতি? Pitfalls?

দ্রষ্টব্য: নাম স্থানগুলি কেবলমাত্র PHP 5.3+ + ধরুন, এই প্রশ্নের জন্য, আপনি জানেন যে আপনি যে সার্ভারগুলি জানেন সেগুলি আপনার পিএইচপি 5.3 বা তার বেশি রয়েছে with

উত্তর:


89

ঠিক আছে, আমার দুটি বড় প্রকল্প হয়েছিল যেখানে আমি নামস্থান এবং অটোলয়েডিংয়ের উপর নির্ভর করার জন্য পর্যাপ্ত সার্ভারের নিয়ন্ত্রণে ছিলাম।

প্রথম আপ। অটোলয়েডিং দুর্দান্ত। প্রয়োজনের বিষয়ে চিন্তা না করা একটি তুলনামূলক ভাল জিনিস।

আমি কয়েকটি প্রকল্পে একটি লোডার ব্যবহার করছি। ক্লাসটি প্রথমে বর্তমান নেমস্পেসে রয়েছে কিনা তা পরীক্ষা করে পরীক্ষা করে দেখুন, তারপরেও যদি জামিন হয় না। সেখান থেকে ক্লাসটি সন্ধান করার জন্য কিছু স্ট্রিং ম্যানিপুলেশন।

<?php
spl_autoload_register(__NAMESPACE__ . '\\autoload');
function autoload($cls)
{
    $cls = ltrim($cls, '\\');
    if(strpos($cls, __NAMESPACE__) !== 0)
        return;

    $cls = str_replace(__NAMESPACE__, '', $cls);

    $path = PLUGIN_PATH_PATH . 'inc' . 
        str_replace('\\', DIRECTORY_SEPARATOR, $cls) . '.php';

    require_once($path);
}

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

নেমস্পেস এবং হুকস

ওয়ার্ডপ্রেসের হুক সিস্টেমটি call_user_func(এবং call_user_func_array) ব্যবহার করে কাজ করে যা ফাংশনের নামগুলি স্ট্রিং হিসাবে গ্রহণ করে এবং যখন do_action(এবং, পরবর্তীকালে call_user_func) ফাংশন কল করা হয় তখন তাদের ডাকে।

নেমস্পেসগুলির সাথে, এর অর্থ হল আপনাকে পুরোপুরি যোগ্যতাসম্পন্ন ফাংশন নামগুলি পাস করতে হবে যা নাম স্থানটিকে হুকের মধ্যে অন্তর্ভুক্ত করবে।

<?php
namespace WPSE\SomeNameSpace;

add_filter('some_filter', 'WPSE\\SomeNameSpace\\the_function');
function the_function()
{
   return 'did stuff';
}

আপনি যদি এটি করতে চান তবে সম্ভবত __NAMESPACE__যাদুবিদ্যার উদার ব্যবহার করা ভাল ।

<?php
namespace WPSE\SomeNameSpace;

add_filter('some_filter', __NAMESPACE__ . '\\the_function');
function the_function()
{
   return 'did stuff';
}

আপনি যদি সর্বদা আপনার হুকগুলি ক্লাসে রাখেন তবে এটি আরও সহজ। স্ট্যান্ডার্ড কোনও বর্গের উদাহরণ তৈরি করে এবং কন্সট্রাক্টরের সমস্ত হুক $thisকাজ করে কাজ করে।

<?php
namespace WPSE\SomeNameSpace;

new Plugin;

class Plugin
{
    function __construct()
    {
        add_action('plugins_loaded', array($this, 'loaded'));
    }

    function loaded()
    {
        // this works!
    }
}

আমি করতে চাইলে আপনি যদি স্থির পদ্ধতি ব্যবহার করেন তবে আপনাকে অ্যারের প্রথম যুক্তি হিসাবে সম্পূর্ণ যোগ্য শ্রেণীর নামটি পাস করতে হবে। এটি অনেক কাজ, যাতে আপনি কেবল ম্যাজিক __CLASS__ধ্রুবক ব্যবহার করতে পারেন বা get_class

<?php
namespace WPSE\SomeNameSpace;

Plugin::init();

class Plugin
{
    public static function init()
    {
        add_action('plugins_loaded', array(__CLASS__, 'loaded'));
        // OR: add_action('plugins_loaded', array(get_class(), 'loaded'));
    }

    public static function loaded()
    {
        // this works!
    }
}

কোর ক্লাস ব্যবহার করা

পিএইচপি'র ক্লাস নেম রেজোলিউশনটি কিছুটা দুর্বল। যদি আপনি মূল ডাব্লুপি ক্লাস ব্যবহার করতে চলেছেন ( WP_Widgetনীচের উদাহরণে) আপনাকে অবশ্যই useবিবৃতি প্রদান করতে হবে ।

use \WP_Widget;

class MyWidget extends WP_Widget
{
   // ...
}

অথবা আপনি সম্পূর্ণরূপে যোগ্য শ্রেণীর নামটি ব্যবহার করতে পারেন - মূলত কেবল ব্যাকস্ল্যাশ সহ এটি উপস্থাপন করা।

<?php
namespace WPSE\SomeNameSpace;

class MyWidget extends \WP_Widget
{
   // ...
}

সংজ্ঞায়িত

এটি আরও সাধারণ পিএইচপি, তবে এটি আমাকে বিট করে, তাই এটি এখানে।

আপনার প্লাগইনটির পথের মতো আপনি প্রায়শই ব্যবহার করবেন এমন জিনিসগুলি আপনি সংজ্ঞায়িত করতে চাইতে পারেন। সংজ্ঞায়িত স্টেটমেন্টটি ব্যবহার করে জিনিসগুলি রুট নেমস্পেসে রাখে যদি না আপনি স্পষ্টরূপে সংজ্ঞাটির প্রথম যুক্তির মধ্যে নেমস্পেসটি প্রবেশ করেন।

<?php
namespace WPSE\SomeNameSpace;

// root namespace
define('WPSE_63668_PATH', plugin_dir_path(__FILE__));

// in the current namespace
define(__NAMESPACE__ . '\\PATH', plugin_dir_path(__FILE__));

আপনি constপিএইচপি 5.3 প্লাস সহ কোনও ফাইলের মূল স্তরে কীওয়ার্ডটি ব্যবহার করতে পারেন । constsগুলি সর্বদা বর্তমান নেমস্পেসে থাকে তবে কোনও defineকলটি তার চেয়ে কম নমনীয় ।

<?php
namespace WPSE\SomeNameSpace;

// in the current namespace
const MY_CONST = 1;

// this won't work!
const MY_PATH = plugin_dir_path(__FILE__);

আপনার থাকতে পারে অন্য কোনও টিপস নির্দ্বিধায় বোধ করুন!


16

এখানে একটি 2017 উত্তর।

অটোলয়েডিং দুর্দান্ত। নেমস্পেসিং দুর্দান্ত।

যদিও আপনি নিজেরাই এটি রোল করতে পারেন, 2017 এ এটি আপনার পিএইচপি প্রয়োজনীয়তাগুলি পরিচালনা করতে দুর্দান্ত এবং সর্বব্যাপী সুরকারকে ব্যবহার করার সর্বাধিক অর্থ বোধ করে । সুরকার পিএসআর -0 এবং পিএসআর -4 উভয় অটোলয়েডিং সমর্থন করে তবে প্রাক্তনটিকে 2014 থেকে অবহেলা করা হয়েছে, তাই পিএসআর -4 ব্যবহার করুন। এটি আপনার ডিরেক্টরিগুলির জটিলতা হ্রাস করে।

আমরা আমাদের প্রতিটি প্লাগইন / থিমকে তার নিজস্ব গিথুব সংগ্রহস্থলে রাখি, প্রতিটি তাদের নিজস্ব composer.jsonফাইল এবং composer.lockফাইল সহ।

আমাদের প্লাগিনগুলির জন্য আমরা ব্যবহার করি ডিরেক্টরি কাঠামোটি এখানে। (আমাদের কাছে আসলে একটি প্লাগইন বলা নেই awesome-plugin, তবে আমাদের উচিত))

plugins/awesome-plugin/bootstrap.php
plugins/awesome-plugin/composer.json
plugins/awesome-plugin/composer.lock
plugins/awesome-plugin/awesome-plugin.php
plugins/awesome-plugin/src/*

plugins/awesome-plugin/vendor/autoload.php
plugins/awesome-plugin/vendor/*

আপনি যদি কোনও উপযুক্ত composer.jsonফাইল সরবরাহ করেন তবে সুরকার এখানে নাম-ফাঁক এবং অটোলয়েডিং পরিচালনা করে।

{
    "name": "awesome-company/awesome-plugin",
    "description": "Wordpress plugin for AwesomeCompany website, providing awesome functionality.",
    "type": "wordpress-plugin",
    "autoload": {
        "psr-4": {
            "AwesomeCompany\\Plugins\\AwesomePlugin\\": "src"
        }
    }
}

আপনি যখন চালান composer install, এটি vendorডিরেক্টরি এবং vendor/autoload.phpফাইল তৈরি করে যা আপনার নাম-ফাঁক করা ফাইলগুলিতে এবং src/আপনার প্রয়োজন হতে পারে অন্য কোনও লাইব্রেরি অটলয়েড করবে।

তারপরে আপনার মূল প্লাগইন-ফাইলের শীর্ষে (যা আমাদের জন্য awesome-plugin.php) আপনার প্লাগইন মেটাডেটার পরে আপনার কেবল প্রয়োজন:

// Composer autoloading.
require_once __DIR__ . '/vendor/autoload.php';

...

বোনাস বৈশিষ্ট্য

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

{
  "name": "awesome-company/awesome-website",
  "type": "project",
  "license": "proprietary",
  "description": "WordPress boilerplate with modern development tools, easier configuration, and an improved folder structure",
  "config": {
    "preferred-install": "dist"
  },
  "repositories": [
    {
      "type": "composer",
      "url": "https://wpackagist.org"
    },
    { // Tells Composer to look for our proprietary Awesome Plugin here.
        "url": "https://github.com/awesome-company/awesome-plugin.git",
        "type": "git"
    }
  ],
  "require": {
    "php": ">=5.5",
    "awesome-company/awesome-plugin": "dev-production", // Our plugin!
    "wpackagist-plugin/cool-plugin": "dev-trunk",       // Someone else' plugin
    "wpackagist-theme/cool-theme": "dev-trunk",         // Someone else' theme
    "composer/installers": "~1.2.0",     // Bedrock default
    "vlucas/phpdotenv": "^2.0.1",        // Bedrock default
    "johnpbloch/wordpress": "4.7.5",     // Bedrock default
    "oscarotero/env": "^1.0",            // Bedrock default
    "roots/wp-password-bcrypt": "1.0.0"  // Bedrock default
  },
  "extra": {
    // This is the magic that drops packages with the correct TYPE in the correct location. 
    "installer-paths": {
      "web/app/mu-plugins/{$name}/": ["type:wordpress-muplugin"],
      "web/app/plugins/{$name}/": ["type:wordpress-plugin"],
      "web/app/themes/{$name}/": ["type:wordpress-theme"]
    },
    "wordpress-install-dir": "web/wp"
  },
  "scripts": {
    "test": [
      "vendor/bin/phpcs"
    ]
  }
}

নোট 1: মন্তব্যগুলি JSON এ আইনী নয়, তবে আমি আরও স্পষ্টতার জন্য উপরের ফাইলটি টিকিয়েছি।

দ্রষ্টব্য 2: আমি ব্রেলিপ্লেট বেডরক ফাইলের কিছু বিট ব্রিভিটির জন্য কাটা করেছি।

নোট 3: এই কারণেই typeপ্রথম composer.jsonফাইলের ক্ষেত্রটি উল্লেখযোগ্য। সুরকার স্বয়ংক্রিয়ভাবে এটি web/app/pluginsডিরেক্টরিতে ফেলে দেয়।


আপনার উত্তরের প্রশংসা করুন, খুব সহায়ক! তবে আপনি যে "বুটস্ট্র্যাপ.এফপি" উল্লেখ করছেন তা সম্পর্কে আমি আগ্রহী। এতে কী রয়েছে? :)
IN

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

4

আমি অটোলয়েডিং ব্যবহার করি (যেহেতু আমার প্লাগইনটিতে ক্লাসগুলি প্রচুর পরিমাণে রয়েছে - আংশিক কারণ এটিতে ট্যুইগ অন্তর্ভুক্ত), কখনও আমার নজরে আসে নি কোনও সমস্যা হয়নি (প্লাগইন ইনস্টল> 20,000 বার)।

যদি আপনি আত্মবিশ্বাসী হন যে আপনাকে কখনই কোনও পিএইচপি ইনস্টলেশন ব্যবহার করার প্রয়োজন হবে না যা নামপথগুলি সমর্থন করে না তবে আবার আপনি ভাল (বর্তমান ওয়ার্ডপ্রেস ব্লগের ~ 70% ব্লগ নেমস্পেস সমর্থন করে না)। কয়েকটি বিষয় লক্ষণীয়:

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

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

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