কোনও শ্রেণীর শর্টকোড হ্যান্ডলার সহ পিএইচপি ত্রুটি


13

বর্তমানে আমি একটি প্লাগইনের শর্টকোড যুক্ত করার জন্য নিম্নলিখিত জেনেরিক প্রবাহটি ব্যবহার করছি।

class MyPlugin {

    private $myvar;

    function baztag_func() {
        print $this->myvar;            
    }
}

add_shortcode( 'baztag', array('MyPlugin', 'baztag_func') );

এখন যখন এই শ্রেণিটি এবং এর পদ্ধতিটি বলা হয় তখন আমি নীচের ত্রুটি পাই।

মারাত্মক ত্রুটি: যখন object

(লাইন নংটি যেখানে আমি মুদ্রিত করেছি $this->myvar)

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


বিষয় বন্ধ - ফাংশন করা static
কায়জার

উত্তর:


31

ত্রুটিটি যেমন বলেছে আপনার ব্যবহারের জন্য ক্লাসের একটি উদাহরণ প্রয়োজন $this। কমপক্ষে তিনটি সম্ভাবনা রয়েছে:

সবকিছু স্থির করুন

class My_Plugin
{
    private static $var = 'foo';

    static function foo()
    {
        return self::$var; // never echo or print in a shortcode!
    }
}
add_shortcode( 'baztag', array( 'My_Plugin', 'foo' ) );

তবে এটি আর ওওপি নয়, কেবল নেমস্পেসিং।

প্রথমে একটি আসল অবজেক্ট তৈরি করুন

class My_Plugin
{
    private $var = 'foo';

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

$My_Plugin = new My_Plugin;

add_shortcode( 'baztag', array( $My_Plugin, 'foo' ) );

এইটা কাজ করে. যদি কেউ শর্টকোডটি প্রতিস্থাপন করতে চায় তবে আপনি কিছু অস্পষ্ট সমস্যার মধ্যে পড়ে ।

ক্লাসের উদাহরণ দেওয়ার জন্য একটি পদ্ধতি যুক্ত করুন:

final class My_Plugin
{
    private $var = 'foo';

    public function __construct()
    {
        add_filter( 'get_my_plugin_instance', [ $this, 'get_instance' ] );
    }

    public function get_instance()
    {
        return $this; // return the object
    }

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

add_shortcode( 'baztag', [ new My_Plugin, 'foo' ] );

এখন, যখন কেউ অবজেক্টের উদাহরণ পেতে চায়, তখন তাকে কেবল লিখতে হবে:

$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL );

if ( is_a( $shortcode_handler, 'My_Plugin ' ) )
{
    // do something with that instance.
}

পুরাতন সমাধান: আপনার ক্লাসে অবজেক্টটি তৈরি করুন create

class My_Plugin
{
    private $var = 'foo';

    protected static $instance = NULL;

    public static function get_instance()
    {
        // create an object
        NULL === self::$instance and self::$instance = new self;

        return self::$instance; // return the object
    }

    public function foo()
    {
        return $this->var; // never echo or print in a shortcode!
    }
}

add_shortcode( 'baztag', array( My_Plugin::get_instance(), 'foo' ) );

থ্যাঙ্কস ম্যান ... অমূল্য তথ্য জানায় যেহেতু ওয়ার্ডপ্রেস.আর.গুজে তাদের অ্যাড_শোর্টকোড ডকুমেন্টেশন পৃষ্ঠাতে এটি বেশি কিছু বলা হয়নি। আমি সমাধানটি বের করেছিলাম তবে আপনি যেহেতু এটি একটি খারাপ অনুশীলন হিসাবে রায় দিয়েছেন এবং আপনার আরও ভাল সমাধান রয়েছে তাই আমি এই সমস্যার সমাধান হিসাবে চিহ্নিত করছি :)
xmaestro

আমি সত্যিই এই পুরাতন প্রশ্ন খনন আমি দুঃখিত, কিন্তু আপনি সম্প্রসারিত plase পারে কি এই লাইন আছে: NULL === self::$instance and self::$instance = new self;? আমি কিছুটা বিভ্রান্ত কারণ কারণ ===এবং andব্যবহার করা হয়, কিন্তু ছাড়া if, আপনি যদি আমার অর্থ বোঝেন তবে।
সোভেন

@ স্যভেন এটি দ্বিতীয় উদাহরণ রোধ করার জন্য একটি চেক। এটি এই ক্লাসটিকে একটি সিঙ্গলটন করে তোলে ... আমি আজকাল এটি করতাম না। আমি এই উত্তরটি আবার লিখব।
ফুসিয়া

তার জন্য ধন্যবাদ! আমি মনে করি আমি এখন সঠিক পথে রয়েছি, যদিও এটি আশ্চর্যজনক যে এটি ওয়ার্ডপ্রেস এবং ওওপি ;-) ব্যবহার করে কতটা জটিল হতে পারে
স্যাভেন

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

7

আপনি ক্লাসের মধ্যে শর্টকোড এর মতো ব্যবহার করতে পারেন

class stockData{


    function __construct() {
        add_shortcode( 'your_shortcode_name', array( $this, 'showData' ) );
        //add_action('login_enqueue_scripts', array( $this,'my_admin_head'));
    }

    function showData(){
        return '<h1>My shortcode content</h1>' ;
    }
}

$object=new stockData();

আপনি যদি অন্য ক্লাসের শর্টকোড সামগ্রী অ্যাক্সেস করতে চান। আপনি এই মত করতে পারেন।

class my_PluginClass {

  public function __construct( $Object ) {

    $test = add_shortcode( 'your_shortcode_name', array( $Object, 'your_method_name' ) );

  }

}

class CustomHandlerClass{

  public function your_method_name( $atts, $content ) {
     return '<h1>My shortcode content</h1>' ;
  }
}

$Customobject  = new CustomHandlerClass();
$Plugin         = new my_PluginClass( $Customobject );

1
আমি এই সমাধানটি সত্যিই পছন্দ করি। এটি সত্যই পরিষ্কার এবং বোধগম্য। আমার সাথে React.js বিকাশকারী পক্ষ এতে খুশি।
অ্যারোনড্যান্সার

1

নিশ্চিত করুন যে আপনি এটি ব্যবহারের আগে আপনার ক্লাসের উদাহরণ তৈরি করেছেন যদি না আপনি নিশ্চিত হন যে এটি স্ট্যাটিকালি বলা হবে be আপনি যখন কোনও পদ্ধতিকে স্ট্যাটিকভাবে কল করেন তখন আপনি কোনও দৃষ্টান্ত ব্যবহার করবেন না এবং তাই এর কোনও সদস্যের ভেরিয়েবল বা পদ্ধতিতে অ্যাক্সেস নেই।

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