Changeset 16099 for trunk/wp-includes/class-wp.php
- Timestamp:
- 10/30/2010 07:02:06 AM (14 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-includes/class-wp.php
r16091 r16099 526 526 527 527 /** 528 * WordPress Error class.529 *530 * Container for checking for WordPress errors and error messages. Return531 * WP_Error and use {@link is_wp_error()} to check if this class is returned.532 * Many core WordPress functions pass this class in the event of an error and533 * if not handled properly will result in code errors.534 *535 * @package WordPress536 * @since 2.1.0537 */538 class WP_Error {539 /**540 * Stores the list of errors.541 *542 * @since 2.1.0543 * @var array544 * @access private545 */546 var $errors = array();547 548 /**549 * Stores the list of data for error codes.550 *551 * @since 2.1.0552 * @var array553 * @access private554 */555 var $error_data = array();556 557 /**558 * PHP4 Constructor - Sets up error message.559 *560 * If code parameter is empty then nothing will be done. It is possible to561 * add multiple messages to the same code, but with other methods in the562 * class.563 *564 * All parameters are optional, but if the code parameter is set, then the565 * data parameter is optional.566 *567 * @since 2.1.0568 *569 * @param string|int $code Error code570 * @param string $message Error message571 * @param mixed $data Optional. Error data.572 * @return WP_Error573 */574 function WP_Error($code = '', $message = '', $data = '') {575 if ( empty($code) )576 return;577 578 $this->errors[$code][] = $message;579 580 if ( ! empty($data) )581 $this->error_data[$code] = $data;582 }583 584 /**585 * Retrieve all error codes.586 *587 * @since 2.1.0588 * @access public589 *590 * @return array List of error codes, if avaiable.591 */592 function get_error_codes() {593 if ( empty($this->errors) )594 return array();595 596 return array_keys($this->errors);597 }598 599 /**600 * Retrieve first error code available.601 *602 * @since 2.1.0603 * @access public604 *605 * @return string|int Empty string, if no error codes.606 */607 function get_error_code() {608 $codes = $this->get_error_codes();609 610 if ( empty($codes) )611 return '';612 613 return $codes[0];614 }615 616 /**617 * Retrieve all error messages or error messages matching code.618 *619 * @since 2.1.0620 *621 * @param string|int $code Optional. Retrieve messages matching code, if exists.622 * @return array Error strings on success, or empty array on failure (if using codee parameter).623 */624 function get_error_messages($code = '') {625 // Return all messages if no code specified.626 if ( empty($code) ) {627 $all_messages = array();628 foreach ( (array) $this->errors as $code => $messages )629 $all_messages = array_merge($all_messages, $messages);630 631 return $all_messages;632 }633 634 if ( isset($this->errors[$code]) )635 return $this->errors[$code];636 else637 return array();638 }639 640 /**641 * Get single error message.642 *643 * This will get the first message available for the code. If no code is644 * given then the first code available will be used.645 *646 * @since 2.1.0647 *648 * @param string|int $code Optional. Error code to retrieve message.649 * @return string650 */651 function get_error_message($code = '') {652 if ( empty($code) )653 $code = $this->get_error_code();654 $messages = $this->get_error_messages($code);655 if ( empty($messages) )656 return '';657 return $messages[0];658 }659 660 /**661 * Retrieve error data for error code.662 *663 * @since 2.1.0664 *665 * @param string|int $code Optional. Error code.666 * @return mixed Null, if no errors.667 */668 function get_error_data($code = '') {669 if ( empty($code) )670 $code = $this->get_error_code();671 672 if ( isset($this->error_data[$code]) )673 return $this->error_data[$code];674 return null;675 }676 677 /**678 * Append more error messages to list of error messages.679 *680 * @since 2.1.0681 * @access public682 *683 * @param string|int $code Error code.684 * @param string $message Error message.685 * @param mixed $data Optional. Error data.686 */687 function add($code, $message, $data = '') {688 $this->errors[$code][] = $message;689 if ( ! empty($data) )690 $this->error_data[$code] = $data;691 }692 693 /**694 * Add data for error code.695 *696 * The error code can only contain one error data.697 *698 * @since 2.1.0699 *700 * @param mixed $data Error data.701 * @param string|int $code Error code.702 */703 function add_data($data, $code = '') {704 if ( empty($code) )705 $code = $this->get_error_code();706 707 $this->error_data[$code] = $data;708 }709 }710 711 /**712 * Check whether variable is a WordPress Error.713 *714 * Looks at the object and if a WP_Error class. Does not check to see if the715 * parent is also WP_Error, so can't inherit WP_Error and still use this716 * function.717 *718 * @since 2.1.0719 *720 * @param mixed $thing Check if unknown variable is WordPress Error object.721 * @return bool True, if WP_Error. False, if not WP_Error.722 */723 function is_wp_error($thing) {724 if ( is_object($thing) && is_a($thing, 'WP_Error') )725 return true;726 return false;727 }728 729 /**730 * A class for displaying various tree-like structures.731 *732 * Extend the Walker class to use it, see examples at the below. Child classes733 * do not need to implement all of the abstract methods in the class. The child734 * only needs to implement the methods that are needed. Also, the methods are735 * not strictly abstract in that the parameter definition needs to be followed.736 * The child classes can have additional parameters.737 *738 * @package WordPress739 * @since 2.1.0740 * @abstract741 */742 class Walker {743 /**744 * What the class handles.745 *746 * @since 2.1.0747 * @var string748 * @access public749 */750 var $tree_type;751 752 /**753 * DB fields to use.754 *755 * @since 2.1.0756 * @var array757 * @access protected758 */759 var $db_fields;760 761 /**762 * Max number of pages walked by the paged walker763 *764 * @since 2.7.0765 * @var int766 * @access protected767 */768 var $max_pages = 1;769 770 /**771 * Starts the list before the elements are added.772 *773 * Additional parameters are used in child classes. The args parameter holds774 * additional values that may be used with the child class methods. This775 * method is called at the start of the output list.776 *777 * @since 2.1.0778 * @abstract779 *780 * @param string $output Passed by reference. Used to append additional content.781 */782 function start_lvl(&$output) {}783 784 /**785 * Ends the list of after the elements are added.786 *787 * Additional parameters are used in child classes. The args parameter holds788 * additional values that may be used with the child class methods. This789 * method finishes the list at the end of output of the elements.790 *791 * @since 2.1.0792 * @abstract793 *794 * @param string $output Passed by reference. Used to append additional content.795 */796 function end_lvl(&$output) {}797 798 /**799 * Start the element output.800 *801 * Additional parameters are used in child classes. The args parameter holds802 * additional values that may be used with the child class methods. Includes803 * the element output also.804 *805 * @since 2.1.0806 * @abstract807 *808 * @param string $output Passed by reference. Used to append additional content.809 */810 function start_el(&$output) {}811 812 /**813 * Ends the element output, if needed.814 *815 * Additional parameters are used in child classes. The args parameter holds816 * additional values that may be used with the child class methods.817 *818 * @since 2.1.0819 * @abstract820 *821 * @param string $output Passed by reference. Used to append additional content.822 */823 function end_el(&$output) {}824 825 /**826 * Traverse elements to create list from elements.827 *828 * Display one element if the element doesn't have any children otherwise,829 * display the element and its children. Will only traverse up to the max830 * depth and no ignore elements under that depth. It is possible to set the831 * max depth to include all depths, see walk() method.832 *833 * This method shouldn't be called directly, use the walk() method instead.834 *835 * @since 2.5.0836 *837 * @param object $element Data object838 * @param array $children_elements List of elements to continue traversing.839 * @param int $max_depth Max depth to traverse.840 * @param int $depth Depth of current element.841 * @param array $args842 * @param string $output Passed by reference. Used to append additional content.843 * @return null Null on failure with no changes to parameters.844 */845 function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {846 847 if ( !$element )848 return;849 850 $id_field = $this->db_fields['id'];851 852 //display this element853 if ( is_array( $args[0] ) )854 $args[0]['has_children'] = ! empty( $children_elements[$element->$id_field] );855 $cb_args = array_merge( array(&$output, $element, $depth), $args);856 call_user_func_array(array(&$this, 'start_el'), $cb_args);857 858 $id = $element->$id_field;859 860 // descend only when the depth is right and there are childrens for this element861 if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) {862 863 foreach( $children_elements[ $id ] as $child ){864 865 if ( !isset($newlevel) ) {866 $newlevel = true;867 //start the child delimiter868 $cb_args = array_merge( array(&$output, $depth), $args);869 call_user_func_array(array(&$this, 'start_lvl'), $cb_args);870 }871 $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );872 }873 unset( $children_elements[ $id ] );874 }875 876 if ( isset($newlevel) && $newlevel ){877 //end the child delimiter878 $cb_args = array_merge( array(&$output, $depth), $args);879 call_user_func_array(array(&$this, 'end_lvl'), $cb_args);880 }881 882 //end this element883 $cb_args = array_merge( array(&$output, $element, $depth), $args);884 call_user_func_array(array(&$this, 'end_el'), $cb_args);885 }886 887 /**888 * Display array of elements hierarchically.889 *890 * It is a generic function which does not assume any existing order of891 * elements. max_depth = -1 means flatly display every element. max_depth =892 * 0 means display all levels. max_depth > 0 specifies the number of893 * display levels.894 *895 * @since 2.1.0896 *897 * @param array $elements898 * @param int $max_depth899 * @return string900 */901 function walk( $elements, $max_depth) {902 903 $args = array_slice(func_get_args(), 2);904 $output = '';905 906 if ($max_depth < -1) //invalid parameter907 return $output;908 909 if (empty($elements)) //nothing to walk910 return $output;911 912 $id_field = $this->db_fields['id'];913 $parent_field = $this->db_fields['parent'];914 915 // flat display916 if ( -1 == $max_depth ) {917 $empty_array = array();918 foreach ( $elements as $e )919 $this->display_element( $e, $empty_array, 1, 0, $args, $output );920 return $output;921 }922 923 /*924 * need to display in hierarchical order925 * separate elements into two buckets: top level and children elements926 * children_elements is two dimensional array, eg.927 * children_elements[10][] contains all sub-elements whose parent is 10.928 */929 $top_level_elements = array();930 $children_elements = array();931 foreach ( $elements as $e) {932 if ( 0 == $e->$parent_field )933 $top_level_elements[] = $e;934 else935 $children_elements[ $e->$parent_field ][] = $e;936 }937 938 /*939 * when none of the elements is top level940 * assume the first one must be root of the sub elements941 */942 if ( empty($top_level_elements) ) {943 944 $first = array_slice( $elements, 0, 1 );945 $root = $first[0];946 947 $top_level_elements = array();948 $children_elements = array();949 foreach ( $elements as $e) {950 if ( $root->$parent_field == $e->$parent_field )951 $top_level_elements[] = $e;952 else953 $children_elements[ $e->$parent_field ][] = $e;954 }955 }956 957 foreach ( $top_level_elements as $e )958 $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );959 960 /*961 * if we are displaying all levels, and remaining children_elements is not empty,962 * then we got orphans, which should be displayed regardless963 */964 if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {965 $empty_array = array();966 foreach ( $children_elements as $orphans )967 foreach( $orphans as $op )968 $this->display_element( $op, $empty_array, 1, 0, $args, $output );969 }970 971 return $output;972 }973 974 /**975 * paged_walk() - produce a page of nested elements976 *977 * Given an array of hierarchical elements, the maximum depth, a specific page number,978 * and number of elements per page, this function first determines all top level root elements979 * belonging to that page, then lists them and all of their children in hierarchical order.980 *981 * @package WordPress982 * @since 2.7983 * @param int $max_depth = 0 means display all levels; $max_depth > 0 specifies the number of display levels.984 * @param int $page_num the specific page number, beginning with 1.985 * @return XHTML of the specified page of elements986 */987 function paged_walk( $elements, $max_depth, $page_num, $per_page ) {988 989 /* sanity check */990 if ( empty($elements) || $max_depth < -1 )991 return '';992 993 $args = array_slice( func_get_args(), 4 );994 $output = '';995 996 $id_field = $this->db_fields['id'];997 $parent_field = $this->db_fields['parent'];998 999 $count = -1;1000 if ( -1 == $max_depth )1001 $total_top = count( $elements );1002 if ( $page_num < 1 || $per_page < 0 ) {1003 // No paging1004 $paging = false;1005 $start = 0;1006 if ( -1 == $max_depth )1007 $end = $total_top;1008 $this->max_pages = 1;1009 } else {1010 $paging = true;1011 $start = ( (int)$page_num - 1 ) * (int)$per_page;1012 $end = $start + $per_page;1013 if ( -1 == $max_depth )1014 $this->max_pages = ceil($total_top / $per_page);1015 }1016 1017 // flat display1018 if ( -1 == $max_depth ) {1019 if ( !empty($args[0]['reverse_top_level']) ) {1020 $elements = array_reverse( $elements );1021 $oldstart = $start;1022 $start = $total_top - $end;1023 $end = $total_top - $oldstart;1024 }1025 1026 $empty_array = array();1027 foreach ( $elements as $e ) {1028 $count++;1029 if ( $count < $start )1030 continue;1031 if ( $count >= $end )1032 break;1033 $this->display_element( $e, $empty_array, 1, 0, $args, $output );1034 }1035 return $output;1036 }1037 1038 /*1039 * separate elements into two buckets: top level and children elements1040 * children_elements is two dimensional array, eg.1041 * children_elements[10][] contains all sub-elements whose parent is 10.1042 */1043 $top_level_elements = array();1044 $children_elements = array();1045 foreach ( $elements as $e) {1046 if ( 0 == $e->$parent_field )1047 $top_level_elements[] = $e;1048 else1049 $children_elements[ $e->$parent_field ][] = $e;1050 }1051 1052 $total_top = count( $top_level_elements );1053 if ( $paging )1054 $this->max_pages = ceil($total_top / $per_page);1055 else1056 $end = $total_top;1057 1058 if ( !empty($args[0]['reverse_top_level']) ) {1059 $top_level_elements = array_reverse( $top_level_elements );1060 $oldstart = $start;1061 $start = $total_top - $end;1062 $end = $total_top - $oldstart;1063 }1064 if ( !empty($args[0]['reverse_children']) ) {1065 foreach ( $children_elements as $parent => $children )1066 $children_elements[$parent] = array_reverse( $children );1067 }1068 1069 foreach ( $top_level_elements as $e ) {1070 $count++;1071 1072 //for the last page, need to unset earlier children in order to keep track of orphans1073 if ( $end >= $total_top && $count < $start )1074 $this->unset_children( $e, $children_elements );1075 1076 if ( $count < $start )1077 continue;1078 1079 if ( $count >= $end )1080 break;1081 1082 $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );1083 }1084 1085 if ( $end >= $total_top && count( $children_elements ) > 0 ) {1086 $empty_array = array();1087 foreach ( $children_elements as $orphans )1088 foreach( $orphans as $op )1089 $this->display_element( $op, $empty_array, 1, 0, $args, $output );1090 }1091 1092 return $output;1093 }1094 1095 function get_number_of_root_elements( $elements ){1096 1097 $num = 0;1098 $parent_field = $this->db_fields['parent'];1099 1100 foreach ( $elements as $e) {1101 if ( 0 == $e->$parent_field )1102 $num++;1103 }1104 return $num;1105 }1106 1107 // unset all the children for a given top level element1108 function unset_children( $e, &$children_elements ){1109 1110 if ( !$e || !$children_elements )1111 return;1112 1113 $id_field = $this->db_fields['id'];1114 $id = $e->$id_field;1115 1116 if ( !empty($children_elements[$id]) && is_array($children_elements[$id]) )1117 foreach ( (array) $children_elements[$id] as $child )1118 $this->unset_children( $child, $children_elements );1119 1120 if ( isset($children_elements[$id]) )1121 unset( $children_elements[$id] );1122 1123 }1124 }1125 1126 /**1127 * Create HTML list of pages.1128 *1129 * @package WordPress1130 * @since 2.1.01131 * @uses Walker1132 */1133 class Walker_Page extends Walker {1134 /**1135 * @see Walker::$tree_type1136 * @since 2.1.01137 * @var string1138 */1139 var $tree_type = 'page';1140 1141 /**1142 * @see Walker::$db_fields1143 * @since 2.1.01144 * @todo Decouple this.1145 * @var array1146 */1147 var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID');1148 1149 /**1150 * @see Walker::start_lvl()1151 * @since 2.1.01152 *1153 * @param string $output Passed by reference. Used to append additional content.1154 * @param int $depth Depth of page. Used for padding.1155 */1156 function start_lvl(&$output, $depth) {1157 $indent = str_repeat("\t", $depth);1158 $output .= "\n$indent<ul class='children'>\n";1159 }1160 1161 /**1162 * @see Walker::end_lvl()1163 * @since 2.1.01164 *1165 * @param string $output Passed by reference. Used to append additional content.1166 * @param int $depth Depth of page. Used for padding.1167 */1168 function end_lvl(&$output, $depth) {1169 $indent = str_repeat("\t", $depth);1170 $output .= "$indent</ul>\n";1171 }1172 1173 /**1174 * @see Walker::start_el()1175 * @since 2.1.01176 *1177 * @param string $output Passed by reference. Used to append additional content.1178 * @param object $page Page data object.1179 * @param int $depth Depth of page. Used for padding.1180 * @param int $current_page Page ID.1181 * @param array $args1182 */1183 function start_el(&$output, $page, $depth, $args, $current_page) {1184 if ( $depth )1185 $indent = str_repeat("\t", $depth);1186 else1187 $indent = '';1188 1189 extract($args, EXTR_SKIP);1190 $css_class = array('page_item', 'page-item-'.$page->ID);1191 if ( !empty($current_page) ) {1192 $_current_page = get_page( $current_page );1193 if ( isset($_current_page->ancestors) && in_array($page->ID, (array) $_current_page->ancestors) )1194 $css_class[] = 'current_page_ancestor';1195 if ( $page->ID == $current_page )1196 $css_class[] = 'current_page_item';1197 elseif ( $_current_page && $page->ID == $_current_page->post_parent )1198 $css_class[] = 'current_page_parent';1199 } elseif ( $page->ID == get_option('page_for_posts') ) {1200 $css_class[] = 'current_page_parent';1201 }1202 1203 $css_class = implode(' ', apply_filters('page_css_class', $css_class, $page));1204 1205 $output .= $indent . '<li class="' . $css_class . '"><a href="' . get_permalink($page->ID) . '" title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';1206 1207 if ( !empty($show_date) ) {1208 if ( 'modified' == $show_date )1209 $time = $page->post_modified;1210 else1211 $time = $page->post_date;1212 1213 $output .= " " . mysql2date($date_format, $time);1214 }1215 }1216 1217 /**1218 * @see Walker::end_el()1219 * @since 2.1.01220 *1221 * @param string $output Passed by reference. Used to append additional content.1222 * @param object $page Page data object. Not used.1223 * @param int $depth Depth of page. Not Used.1224 */1225 function end_el(&$output, $page, $depth) {1226 $output .= "</li>\n";1227 }1228 1229 }1230 1231 /**1232 * Create HTML dropdown list of pages.1233 *1234 * @package WordPress1235 * @since 2.1.01236 * @uses Walker1237 */1238 class Walker_PageDropdown extends Walker {1239 /**1240 * @see Walker::$tree_type1241 * @since 2.1.01242 * @var string1243 */1244 var $tree_type = 'page';1245 1246 /**1247 * @see Walker::$db_fields1248 * @since 2.1.01249 * @todo Decouple this1250 * @var array1251 */1252 var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID');1253 1254 /**1255 * @see Walker::start_el()1256 * @since 2.1.01257 *1258 * @param string $output Passed by reference. Used to append additional content.1259 * @param object $page Page data object.1260 * @param int $depth Depth of page in reference to parent pages. Used for padding.1261 * @param array $args Uses 'selected' argument for selected page to set selected HTML attribute for option element.1262 */1263 function start_el(&$output, $page, $depth, $args) {1264 $pad = str_repeat(' ', $depth * 3);1265 1266 $output .= "\t<option class=\"level-$depth\" value=\"$page->ID\"";1267 if ( $page->ID == $args['selected'] )1268 $output .= ' selected="selected"';1269 $output .= '>';1270 $title = esc_html($page->post_title);1271 $output .= "$pad$title";1272 $output .= "</option>\n";1273 }1274 }1275 1276 /**1277 * Create HTML list of categories.1278 *1279 * @package WordPress1280 * @since 2.1.01281 * @uses Walker1282 */1283 class Walker_Category extends Walker {1284 /**1285 * @see Walker::$tree_type1286 * @since 2.1.01287 * @var string1288 */1289 var $tree_type = 'category';1290 1291 /**1292 * @see Walker::$db_fields1293 * @since 2.1.01294 * @todo Decouple this1295 * @var array1296 */1297 var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');1298 1299 /**1300 * @see Walker::start_lvl()1301 * @since 2.1.01302 *1303 * @param string $output Passed by reference. Used to append additional content.1304 * @param int $depth Depth of category. Used for tab indentation.1305 * @param array $args Will only append content if style argument value is 'list'.1306 */1307 function start_lvl(&$output, $depth, $args) {1308 if ( 'list' != $args['style'] )1309 return;1310 1311 $indent = str_repeat("\t", $depth);1312 $output .= "$indent<ul class='children'>\n";1313 }1314 1315 /**1316 * @see Walker::end_lvl()1317 * @since 2.1.01318 *1319 * @param string $output Passed by reference. Used to append additional content.1320 * @param int $depth Depth of category. Used for tab indentation.1321 * @param array $args Will only append content if style argument value is 'list'.1322 */1323 function end_lvl(&$output, $depth, $args) {1324 if ( 'list' != $args['style'] )1325 return;1326 1327 $indent = str_repeat("\t", $depth);1328 $output .= "$indent</ul>\n";1329 }1330 1331 /**1332 * @see Walker::start_el()1333 * @since 2.1.01334 *1335 * @param string $output Passed by reference. Used to append additional content.1336 * @param object $category Category data object.1337 * @param int $depth Depth of category in reference to parents.1338 * @param array $args1339 */1340 function start_el(&$output, $category, $depth, $args) {1341 extract($args);1342 1343 $cat_name = esc_attr( $category->name );1344 $cat_name = apply_filters( 'list_cats', $cat_name, $category );1345 $link = '<a href="' . esc_attr( get_term_link($category) ) . '" ';1346 if ( $use_desc_for_title == 0 || empty($category->description) )1347 $link .= 'title="' . sprintf(__( 'View all posts filed under %s' ), $cat_name) . '"';1348 else1349 $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"';1350 $link .= '>';1351 $link .= $cat_name . '</a>';1352 1353 if ( !empty($feed_image) || !empty($feed) ) {1354 $link .= ' ';1355 1356 if ( empty($feed_image) )1357 $link .= '(';1358 1359 $link .= '<a href="' . get_term_feed_link( $category->term_id, $category->taxonomy, $feed_type ) . '"';1360 1361 if ( empty($feed) ) {1362 $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"';1363 } else {1364 $title = ' title="' . $feed . '"';1365 $alt = ' alt="' . $feed . '"';1366 $name = $feed;1367 $link .= $title;1368 }1369 1370 $link .= '>';1371 1372 if ( empty($feed_image) )1373 $link .= $name;1374 else1375 $link .= "<img src='$feed_image'$alt$title" . ' />';1376 1377 $link .= '</a>';1378 1379 if ( empty($feed_image) )1380 $link .= ')';1381 }1382 1383 if ( !empty($show_count) )1384 $link .= ' (' . intval($category->count) . ')';1385 1386 if ( !empty($show_date) )1387 $link .= ' ' . gmdate('Y-m-d', $category->last_update_timestamp);1388 1389 if ( 'list' == $args['style'] ) {1390 $output .= "\t<li";1391 $class = 'cat-item cat-item-' . $category->term_id;1392 if ( !empty($current_category) ) {1393 $_current_category = get_term( $current_category, $category->taxonomy );1394 if ( $category->term_id == $current_category )1395 $class .= ' current-cat';1396 elseif ( $category->term_id == $_current_category->parent )1397 $class .= ' current-cat-parent';1398 }1399 $output .= ' class="' . $class . '"';1400 $output .= ">$link\n";1401 } else {1402 $output .= "\t$link<br />\n";1403 }1404 }1405 1406 /**1407 * @see Walker::end_el()1408 * @since 2.1.01409 *1410 * @param string $output Passed by reference. Used to append additional content.1411 * @param object $page Not used.1412 * @param int $depth Depth of category. Not used.1413 * @param array $args Only uses 'list' for whether should append to output.1414 */1415 function end_el(&$output, $page, $depth, $args) {1416 if ( 'list' != $args['style'] )1417 return;1418 1419 $output .= "</li>\n";1420 }1421 1422 }1423 1424 /**1425 * Create HTML dropdown list of Categories.1426 *1427 * @package WordPress1428 * @since 2.1.01429 * @uses Walker1430 */1431 class Walker_CategoryDropdown extends Walker {1432 /**1433 * @see Walker::$tree_type1434 * @since 2.1.01435 * @var string1436 */1437 var $tree_type = 'category';1438 1439 /**1440 * @see Walker::$db_fields1441 * @since 2.1.01442 * @todo Decouple this1443 * @var array1444 */1445 var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');1446 1447 /**1448 * @see Walker::start_el()1449 * @since 2.1.01450 *1451 * @param string $output Passed by reference. Used to append additional content.1452 * @param object $category Category data object.1453 * @param int $depth Depth of category. Used for padding.1454 * @param array $args Uses 'selected', 'show_count', and 'show_last_update' keys, if they exist.1455 */1456 function start_el(&$output, $category, $depth, $args) {1457 $pad = str_repeat(' ', $depth * 3);1458 1459 $cat_name = apply_filters('list_cats', $category->name, $category);1460 $output .= "\t<option class=\"level-$depth\" value=\"".$category->term_id."\"";1461 if ( $category->term_id == $args['selected'] )1462 $output .= ' selected="selected"';1463 $output .= '>';1464 $output .= $pad.$cat_name;1465 if ( $args['show_count'] )1466 $output .= ' ('. $category->count .')';1467 if ( $args['show_last_update'] ) {1468 $format = 'Y-m-d';1469 $output .= ' ' . gmdate($format, $category->last_update_timestamp);1470 }1471 $output .= "</option>\n";1472 }1473 }1474 1475 /**1476 * Send XML response back to AJAX request.1477 *1478 * @package WordPress1479 * @since 2.1.01480 */1481 class WP_Ajax_Response {1482 /**1483 * Store XML responses to send.1484 *1485 * @since 2.1.01486 * @var array1487 * @access private1488 */1489 var $responses = array();1490 1491 /**1492 * PHP4 Constructor - Passes args to {@link WP_Ajax_Response::add()}.1493 *1494 * @since 2.1.01495 * @see WP_Ajax_Response::add()1496 *1497 * @param string|array $args Optional. Will be passed to add() method.1498 * @return WP_Ajax_Response1499 */1500 function WP_Ajax_Response( $args = '' ) {1501 if ( !empty($args) )1502 $this->add($args);1503 }1504 1505 /**1506 * Append to XML response based on given arguments.1507 *1508 * The arguments that can be passed in the $args parameter are below. It is1509 * also possible to pass a WP_Error object in either the 'id' or 'data'1510 * argument. The parameter isn't actually optional, content should be given1511 * in order to send the correct response.1512 *1513 * 'what' argument is a string that is the XMLRPC response type.1514 * 'action' argument is a boolean or string that acts like a nonce.1515 * 'id' argument can be WP_Error or an integer.1516 * 'old_id' argument is false by default or an integer of the previous ID.1517 * 'position' argument is an integer or a string with -1 = top, 1 = bottom,1518 * html ID = after, -html ID = before.1519 * 'data' argument is a string with the content or message.1520 * 'supplemental' argument is an array of strings that will be children of1521 * the supplemental element.1522 *1523 * @since 2.1.01524 *1525 * @param string|array $args Override defaults.1526 * @return string XML response.1527 */1528 function add( $args = '' ) {1529 $defaults = array(1530 'what' => 'object', 'action' => false,1531 'id' => '0', 'old_id' => false,1532 'position' => 1,1533 'data' => '', 'supplemental' => array()1534 );1535 1536 $r = wp_parse_args( $args, $defaults );1537 extract( $r, EXTR_SKIP );1538 $position = preg_replace( '/[^a-z0-9:_-]/i', '', $position );1539 1540 if ( is_wp_error($id) ) {1541 $data = $id;1542 $id = 0;1543 }1544 1545 $response = '';1546 if ( is_wp_error($data) ) {1547 foreach ( (array) $data->get_error_codes() as $code ) {1548 $response .= "<wp_error code='$code'><![CDATA[" . $data->get_error_message($code) . "]]></wp_error>";1549 if ( !$error_data = $data->get_error_data($code) )1550 continue;1551 $class = '';1552 if ( is_object($error_data) ) {1553 $class = ' class="' . get_class($error_data) . '"';1554 $error_data = get_object_vars($error_data);1555 }1556 1557 $response .= "<wp_error_data code='$code'$class>";1558 1559 if ( is_scalar($error_data) ) {1560 $response .= "<![CDATA[$error_data]]>";1561 } elseif ( is_array($error_data) ) {1562 foreach ( $error_data as $k => $v )1563 $response .= "<$k><![CDATA[$v]]></$k>";1564 }1565 1566 $response .= "</wp_error_data>";1567 }1568 } else {1569 $response = "<response_data><![CDATA[$data]]></response_data>";1570 }1571 1572 $s = '';1573 if ( is_array($supplemental) ) {1574 foreach ( $supplemental as $k => $v )1575 $s .= "<$k><![CDATA[$v]]></$k>";1576 $s = "<supplemental>$s</supplemental>";1577 }1578 1579 if ( false === $action )1580 $action = $_POST['action'];1581 1582 $x = '';1583 $x .= "<response action='{$action}_$id'>"; // The action attribute in the xml output is formatted like a nonce action1584 $x .= "<$what id='$id' " . ( false === $old_id ? '' : "old_id='$old_id' " ) . "position='$position'>";1585 $x .= $response;1586 $x .= $s;1587 $x .= "</$what>";1588 $x .= "</response>";1589 1590 $this->responses[] = $x;1591 return $x;1592 }1593 1594 /**1595 * Display XML formatted responses.1596 *1597 * Sets the content type header to text/xml.1598 *1599 * @since 2.1.01600 */1601 function send() {1602 header('Content-Type: text/xml');1603 echo "<?xml version='1.0' standalone='yes'?><wp_ajax>";1604 foreach ( (array) $this->responses as $response )1605 echo $response;1606 echo '</wp_ajax>';1607 die();1608 }1609 }1610 1611 /**1612 528 * Helper class to remove the need to use eval to replace $matches[] in query strings. 1613 529 *
Note: See TracChangeset
for help on using the changeset viewer.