বেনামে ফাংশনগুলির মাধ্যমে যুক্ত ক্রিয়া / ফিল্টারগুলি সরান


10

এটি অবশ্যই একটি খারাপ অভ্যাস যা আমি অবশ্যই বলি। অজ্ঞাতনামা ফাংশনগুলির মাধ্যমে যুক্ত ক্রিয়া এবং ফিল্টারগুলি সরাতে একটি সমাধান খুঁজতে শেষ দুই ঘন্টা ব্যয় করেছেন।

এটি প্যারেন্ট থিমে ব্যবহৃত কোড এবং আমার এটি সরিয়ে নেওয়া দরকার।

/**
 * Add custom columns to admin comments grid
 *  * Rate that user set.
 */
add_filter( 'manage_edit-comments_columns', function( $default ) {
    $columns['smr_comment_rate']  = __( 'Rate', 'txtdmn' );

    return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
});

টসচোর উত্তর পেয়েছে, এটির সাথে ভারী খেলেছে, তবে কোনও সাহায্য নেই। সুতরাং, বেনামী ফাংশনগুলির মাধ্যমে যুক্ত ক্রিয়া / ফিল্টারগুলি মুছে ফেলবে এমন কোনও বিকল্প আছে?

ধন্যবাদ


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

জিমাজ্যাপটি দেখে মনে হচ্ছে @ বিশালবাসনেট 23 এটি এখানে করেছে: gist.github.com/vishalbasnet23/5f74df4c800681199ab0246bc037d1d5 আমি এটি পরীক্ষা করছি এবং এখনও অবধি এটি পুরোপুরি কাজ করছে।
রেনান অলিভিরা

উত্তর:


10

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

আপনার পোস্ট @ টসচো উত্তরের একটি থেকে উত্পন্ন ফাংশনটি ব্যবহার করে কীভাবে সেগুলি সরিয়ে ফেলতে হবে তা আমি দেখাব:

/**
 * Remove an object filter.
 *
 * @param  string $tag                Hook name.
 * @param  string $class              Class name. Use 'Closure' for anonymous functions.
 * @param  string|void $method        Method name. Leave empty for anonymous functions.
 * @param  string|int|void $priority  Priority
 * @return void
 */
function remove_object_filter( $tag, $class, $method = NULL, $priority = NULL ) {
  $filters = $GLOBALS['wp_filter'][ $tag ];
  if ( empty ( $filters ) ) {
    return;
  }
  foreach ( $filters as $p => $filter ) {
    if ( ! is_null($priority) && ( (int) $priority !== (int) $p ) ) continue;
    $remove = FALSE;
    foreach ( $filter as $identifier => $function ) {
      $function = $function['function'];
      if (
        is_array( $function )
        && (
          is_a( $function[0], $class )
          || ( is_array( $function ) && $function[0] === $class )
        )
      ) {
        $remove = ( $method && ( $method === $function[1] ) );
      } elseif ( $function instanceof Closure && $class === 'Closure' ) {
        $remove = TRUE;
      }
      if ( $remove ) {
        unset( $GLOBALS['wp_filter'][$tag][$p][$identifier] );
      }
    }
  }
}

আমি ফাংশনটির নাম পরিবর্তন করেছি remove_object_filterকারণ এটি সমস্ত ধরণের অবজেক্ট ফিল্টারগুলি সরিয়ে ফেলতে পারে: স্ট্যাটিক ক্লাস পদ্ধতি, গতিশীল অবজেক্ট পদ্ধতি এবং ক্লোজার।

$priorityযুক্তি ঐচ্ছিক, কিন্তু বন্ধ সরানোর এটা সবসময় ব্যবহার করা উচিত, অন্যথায় ফাংশন কোনো অবসান ফিল্টার যোগ করা, সেটা ব্যাপার যা অগ্রাধিকার এ, কারণ যখন সরাবে $priorityবাদ দেওয়া হয়, লক্ষ্য বর্গ / পদ্ধতি বা অবসান ব্যবহার সমস্ত ফিল্টার হয় সরানো হয়েছে।

ব্যবহারবিধি

// remove a static method
remove_object_filter( 'a_filter_hook', 'AClass', 'a_static_method', 10 );

// remove a dynamic method
remove_object_filter( 'a_filter_hook', 'AClass', 'a_dynamic_method', 10 );

// remove a closure
remove_object_filter( 'a_filter_hook', 'Closure', NULL, 10 );

আমি এটির এবং আরও অনেককে চেষ্টা করেছি, তবে এটি কার্যকর হয় না
am:

@ অ্যাডমজ ৪. version সংস্করণ থেকে, ওয়ার্ডপ্রেস হুকগুলি পরিচালনা করার জন্য নতুন উপায় চালু করেছে, সুতরাং এটি আর কাজ করবে না ...
gmaszap

আপনি কোন সুযোগের দ্বারা কোনও বিকল্প সম্পর্কে জানেন?
আদমজ

1
@ অ্যাডামজে আমি এটিকে 4.7+ এর জন্য আপডেট করতে পারলাম, তবে এখনই সময় নেই এবং কখন আসব তা নিশ্চিত নয় not এটি একটি নতুন প্রশ্ন খোলার জন্য ঠিক আছে, যেখানে আপনি এই প্রশ্নোত্তর / এটির সাথে লিঙ্ক করেছেন এবং বলছেন যে এটি পুরানো হয়েছে, যেভাবে যে কেউ উত্তর দিতে পারে, তাই আমার যদি সময় না থাকে, সম্ভবত অন্য কেউ will বিকল্প হিসাবে, আপনি এই
কিউতে

3

আপনি যদি 11 টি অগ্রাধিকার সহ আপনার ফিল্টার যুক্ত করেন, তবে এটি পরে যায়? এটি কুৎসিত, তবে এটি আপনার ক্ষেত্রে কার্যকর হতে পারে।

add_filter( 'manage_edit-comments_columns', function( $default ) {
    unset( $default['smr_comment_rate'] );

    return $default;
}, 11, 1 );

2

অজ্ঞাতনামা ফিল্টার এবং ক্রিয়া নিম্নলিখিত ব্যবহার করে স্থানীয়ভাবে মুছে ফেলা যেতে পারে:

remove_filter( $tag, function(){}, $priority )

অনন্য আইডি ব্যবহার করে তৈরি করার সময় spl_object_hash(), বেনামে ফাংশনগুলি একে অপরের সাথে তুলনীয়, তাই সম্পূর্ণ ক্লোজার অবজেক্টটি আবার তৈরি করার প্রয়োজন হয় না।

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

// Filter which was added and needs to be removed
add_filter( 'manage_edit-comments_columns', function( $default ) {
    $columns['smr_comment_rate']  = __( 'Rate', 'txtdmn' );

    return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
} );

// Removes the last anonymous filter to be added
remove_filter( 'manage_edit-comments_columns', function(){} );

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

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