সিমলিঙ্কযুক্ত ডিরেক্টরিগুলিতে প্লাগইনগুলি?


20

আমি যখন প্লাগইনগুলি বিকাশ করি তখন আমি আমার প্লাগইন ডিরেক্টরিটি বিভিন্ন wp-contentডিরেক্টরিতে সিম্পলক করে ওয়ার্ডপ্রেসের একাধিক সংস্করণে তাদের পরীক্ষা করি । এটি দুর্দান্ত কারণ যেহেতু আমাকে কেবল একবার ফাইলগুলি সম্পাদনা করতে হবে তবে এটি আমার প্লাগইনে সংস্থানসমূহের জন্য উত্সগুলি উত্পন্ন করার জন্য একটি গুরুত্বপূর্ণ নির্মাণকে ভেঙে দেয়: __FILE__প্রকৃত প্লাগইন অবস্থানটিকে বোঝায়, এর মধ্যে নয় wp-content। আমি কীভাবে এটি সমাধান করব?

আমার ডিরেক্টরি কাঠামোটি এর মতো দেখাচ্ছে:

  • /path/to/wordpress/development/dir/
    • plugin-development/
      • monkeyman-rewrite-analyzer/
        • monkeyman-rewrite-analyzer.php
        • js/
          • monkeyman-rewrite-analyzer.js
    • versions/
      • 3.1/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer উপরের প্লাগইনটিতে একটি সিমিলিংক হিসাবে
      • 3.1-multi-dir/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer উপরের প্লাগইনটিতে একটি সিমিলিংক হিসাবে
      • 3.1-multi-domain/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer উপরের প্লাগইনটিতে একটি সিমিলিংক হিসাবে

আমি যদি জাভাস্ক্রিপ্ট ফাইলটি সারিবদ্ধ করতে চাই তবে আমার ব্যবহার করা উচিত plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] ), তবে __FILE__এখানে ব্যবহার করা কার্যকর হবে না, কারণ আসল ফাইলের পথটি হবে /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.phpনা /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php, তাই ওয়ার্ডপ্রেস প্রথম অংশটি বের করতে পারে না এবং ওয়ার্ডপ্রেস ইনস্টলেশন সম্পর্কিত একটি URL তৈরি করতে পারে না।

উত্তর:


6

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

এটি অন্যান্য সমস্ত ক্ষেত্রে plugin_basename()যেমন ব্যবহার করা হয় তা হ্যান্ডেল করবে না , যেমন register_activation_hook()এবং কো।

আরও তথ্য: http://core.trac.wordpress.org/ticket/16953


আমি বিশ্বাস করি যে ব্যবহারের WP_PLUGIN_URLপ্রস্তাব দেওয়া হয়নি কারণ প্রশাসকদের এই নির্দিষ্ট প্লাগইনটির ডিরেক্টরিটির নাম পরিবর্তন করার অনুমতি দেওয়া উচিত, তবে এটি এড়াতে যাওয়ার আরও একটি কারণ আছে কি? এবং প্রকৃতপক্ষে, আপনার টিকিট একটি সহজ সমাধান হবে।
জান ফ্যাব্রি

অপরদিকে. WP_PLUGIN_URL এ কেবলমাত্র URL টি থাকে যা সরাসরি 'প্লাগইনস' ডির দিকে নির্দেশ করে। আপডেট উত্তর দেখুন।
scribu

@ স্ক্রিবু: তবে যদি আমার প্লাগইনগুলি বাস করে /external/folder/banana-plugin/তবে প্রশাসক সেই ডিরেক্টরিটিতে লিঙ্ক করে /httpd-root/wp-content/plugins/apple-plugin/? তাহলে কি যাবার চেষ্টা করবে /wp-content/plugins/banana-plugin/, না? এবং আমি বিশ্বাস করি পৃথক প্লাগইন ডিরেক্টরিগুলির নাম চয়ন করতে প্রশাসকের স্বাধীন হওয়া উচিত?
জান ফ্যাব্রি

আমি আপনার সাথে আর তর্ক করব না, কারণ আমি সমাধানটি পেয়েছি: 'প্লাগইন_আরল' ফিল্টার। আবার আপডেট উত্তর।
scribu

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

3

আমি বর্তমানে ওয়ার্ডপ্রেস-সম্পর্কিত ফাইলের অবস্থানটি পেতে একটি কৌশল ব্যবহার করি: wp_get_active_and_valid_plugins()ফাইলের পাথগুলি ফেরত দেয়, এবং wp_settings.phpসেগুলি থেকে লুপ করে এবং ফাইলগুলি অন্তর্ভুক্ত করে । সুতরাং গ্লোবাল $pluginভেরিয়েবল আপনার বর্তমান প্লাগইনটি উল্লেখ করবে (অবশ্যই প্লাগইনটি লোড হওয়ার পরে কেবল তাই আমি এটি একটি প্রাক উপস্থাপিত বৈশ্বিক চলকটিতে সংরক্ষণ করি):

$monkeyman_Rewrite_Analyzer_file = $plugin;

যেহেতু প্লাগইনগুলি অবশ্যই ব্যবহার-করা বা নেটওয়ার্ক প্লাগইন হিসাবে লোড করা যায় এবং এই লুপগুলি অন্য পরিবর্তনশীল নাম ব্যবহার করে, সম্পূর্ণ কোডটি এর মতো দেখায়:

$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $plugin;
}

ফলব্যাকটি এখনও রয়েছে __FILE__, তাই যদি ভবিষ্যতে কেউ লুপ ভেরিয়েবলের নাম পরিবর্তন করে তবে আমার কোডটি সমস্ত ইনস্টলেশনগুলির 99% এর জন্য এখনও কাজ করা উচিত, কেবলমাত্র আমার বিকাশ সেটআপ ব্যর্থ হবে এবং আমি সহজেই একটি নতুন সংস্করণ প্রকাশ করতে পারি।


দুর্দান্ত সমাধান @ জান। আমি ফাংশনগুলিতে কল করে এবং লুপিংয়ের মাধ্যমে অনুরূপ কিছু বাস্তবায়ন করেছি কারণ আমি ভুলে গিয়েছিলাম যে সেই ভেরিয়েবলগুলি অ্যাক্সেসযোগ্য ছিল global। এখানে আপনার পোস্টের জন্য ধন্যবাদ আমি বুঝতে পেরেছি যে আমি এটিকে আরও সহজ করে তুলতে পারি। বিটিডাব্লু, আমি আপনার আইফোন false === strpos( __FILE__, WP_CONTENT_DIR )স্টেটমেন্ট চালানোর আগে পরীক্ষাও করছি কারণ আমি ধরে নিচ্ছি যে প্লাগইনটি WP_CONTENT_DIRসিমলিঙ্কযুক্ত না থাকলে তা রয়েছে; আমি আশা করি এটি বৈধ যুক্তিযুক্ত।
মাইকচিনকেল

0

46260 বাগে একটি মন্তব্য $_SERVER["SCRIPT_FILENAME"]পরিবর্তে ব্যবহার করার পরামর্শ দেয় __FILE__। এটা কি কাজ করে?


1
না, অন্তর্ভুক্ত ফাইলগুলিতে এটি পরিবর্তন হয় না। তাই আপনি যদি index.phpঅন্তর্ভুক্ত library.php, $_SERVER['SCRIPT_FILENAME']library.phpইচ্ছার এখনও হতে index.php। তবে বাগের রেফারেন্সের জন্য ধন্যবাদ, আমি এটিকে নিবিড়ভাবে অনুসরণ করব!
জান ফ্যাব্রি

0

$_SERVER["SCRIPT_FILENAME"]আপনি যদি এটি সঠিকভাবে ব্যবহার করেন তবে কাজ করে। আপনাকে কেবল এটি একটি বেস পাথ সেট করতে ব্যবহার করতে হবে, এবং তারপরে সেই ফাইলটি সেই বেস পাথের সাথে সম্পর্কিত কোনও পাথ ব্যবহার করে অন্তর্ভুক্ত করবে।

কিছুটা এইরকম:

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

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

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