Ticket #6970 (closed defect: fixed)

Opened 2 months ago

Last modified 2 weeks ago

Add_feed - bug and fix - Replacing callback function

Reported by: programming.has.no.com Assigned to: ryan
Priority: high Milestone: 2.6
Component: General Version: 2.5.1
Severity: normal Keywords: add_feed
Cc:

Description

When adding a feed using add_feed (wp-includes/rewrite.php) you can not replace the callback function with a one with a different name, as this will try to remove a callback that doesn't exist, thus remove_action fails. Adding a $remove_function to the function variables and checking for its presence and removing the correct callback function fixes this.

buggy version function add_feed($feedname, $function) {

global $wp_rewrite; if (!in_array($feedname, $wp_rewrite->feeds)) { //override the file if it is

$wp_rewrite->feeds[] = $feedname;

} $hook = 'do_feed_' . $feedname; remove_action($hook, $function, 10, 1); add_action($hook, $function, 10, 1); return $hook;

}

fixed version function add_feed($feedname, $function, $remove_function="") {

global $wp_rewrite; if (!in_array($feedname, $wp_rewrite->feeds)) { //override the file if it is

$wp_rewrite->feeds[] = $feedname;

} $hook = 'do_feed_' . $feedname; if($remove_function != "") remove_action($hook, $remove_function, 10, 1); else remove_action($hook, $function, 10, 1); add_action($hook, $function, 10, 1); return $hook;

}

Change History

05/14/08 12:23:23 changed by DD32

Code:

 buggy version
 function add_feed($feedname, $function) {
         global $wp_rewrite;
         if (!in_array($feedname, $wp_rewrite->feeds)) { //override the file if it is
                 $wp_rewrite->feeds[] = $feedname;
         }
         $hook = 'do_feed_' . $feedname;
         remove_action($hook, $function, 10, 1);
         add_action($hook, $function, 10, 1);
         return $hook;
 }
 
 
 
 fixed version
 function add_feed($feedname, $function, $remove_function="") {
         global $wp_rewrite;
         if (!in_array($feedname, $wp_rewrite->feeds)) { //override the file if it is
                 $wp_rewrite->feeds[] = $feedname;
         }
         $hook = 'do_feed_' . $feedname;
         if($remove_function != "")
                 remove_action($hook, $remove_function, 10, 1);
         else
                 remove_action($hook, $function, 10, 1);
         add_action($hook, $function, 10, 1);
         return $hook;
 }

(follow-up: ↓ 3 ) 05/14/08 22:01:02 changed by ryan

How about always removing the default function for that feed?

(in reply to: ↑ 2 ) 05/14/08 22:26:50 changed by programming.has.no.com

Replying to ryan:

How about always removing the default function for that feed?

Yer that would work, and save changing the function arguments... How about this version?

function add_feed($feedname, $function) {

global $wp_rewrite; if (!in_array($feedname, $wp_rewrite->feeds)) { //override the file if it is

$wp_rewrite->feeds[] = $feedname;

} $hook = 'do_feed_' . $feedname; remove_action($hook, $hook, 10, 1); add_action($hook, $function, 10, 1); return $hook;

}

05/14/08 22:34:09 changed by programming.has.no.com

  • owner changed from anonymous to ryan.

06/24/08 00:29:05 changed by ryan

  • status changed from new to closed.
  • resolution set to fixed.

(In [8179]) Remove default feed function when adding new function to hook. fixes #6970