/** * WordPress implementation for PHP functions either missing from older PHP versions or not included by default. * * @package PHP * @access private */ // If gettext isn't available if ( !function_exists('_') ) { function _($string) { return $string; } } if ( !function_exists('mb_substr') ): function mb_substr( $str, $start, $length=null, $encoding=null ) { return _mb_substr($str, $start, $length, $encoding); } endif; function _mb_substr( $str, $start, $length=null, $encoding=null ) { // the solution below, works only for utf-8, so in case of a different // charset, just use built-in substr $charset = get_option( 'blog_charset' ); if ( !in_array( $charset, array('utf8', 'utf-8', 'UTF8', 'UTF-8') ) ) { return is_null( $length )? substr( $str, $start ) : substr( $str, $start, $length); } // use the regex unicode support to separate the UTF-8 characters into an array preg_match_all( '/./us', $str, $match ); $chars = is_null( $length )? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length ); return implode( '', $chars ); } if ( !function_exists('hash_hmac') ): function hash_hmac($algo, $data, $key, $raw_output = false) { return _hash_hmac($algo, $data, $key, $raw_output); } endif; function _hash_hmac($algo, $data, $key, $raw_output = false) { $packs = array('md5' => 'H32', 'sha1' => 'H40'); if ( !isset($packs[$algo]) ) return false; $pack = $packs[$algo]; if (strlen($key) > 64) $key = pack($pack, $algo($key)); $key = str_pad($key, 64, chr(0)); $ipad = (substr($key, 0, 64) ^ str_repeat(chr(0x36), 64)); $opad = (substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64)); $hmac = $algo($opad . pack($pack, $algo($ipad . $data))); if ( $raw_output ) return pack( $pack, $hmac ); return $hmac; } if ( !function_exists('json_encode') ) { function json_encode( $string ) { global $wp_json; if ( !is_a($wp_json, 'Services_JSON') ) { require_once( ABSPATH . WPINC . '/class-json.php' ); $wp_json = new Services_JSON(); } return $wp_json->encodeUnsafe( $string ); } } if ( !function_exists('json_decode') ) { function json_decode( $string, $assoc_array = false ) { global $wp_json; if ( !is_a($wp_json, 'Services_JSON') ) { require_once( ABSPATH . WPINC . '/class-json.php' ); $wp_json = new Services_JSON(); } $res = $wp_json->decode( $string ); if ( $assoc_array ) $res = _json_decode_object_helper( $res ); return $res; } function _json_decode_object_helper($data) { if ( is_object($data) ) $data = get_object_vars($data); return is_array($data) ? array_map(__FUNCTION__, $data) : $data; } } /** * WordPress Post Thumbnail Template Functions. * * Support for post thumbnails * Themes function.php must call add_theme_support( 'post-thumbnails' ) to use these. * * @package WordPress * @subpackage Template */ /** * Check if post has an image attached. * * @since 2.9.0 * * @param int $post_id Optional. Post ID. * @return bool Whether post has an image attached. */ function has_post_thumbnail( $post_id = null ) { return (bool) get_post_thumbnail_id( $post_id ); } /** * Retrieve Post Thumbnail ID. * * @since 2.9.0 * * @param int $post_id Optional. Post ID. * @return int */ function get_post_thumbnail_id( $post_id = null ) { $post_id = ( null === $post_id ) ? get_the_ID() : $post_id; return get_post_meta( $post_id, '_thumbnail_id', true ); } /** * Display Post Thumbnail. * * @since 2.9.0 * * @param int $size Optional. Image size. Defaults to 'post-thumbnail', which theme sets using set_post_thumbnail_size( $width, $height, $crop_flag );. * @param string|array $attr Optional. Query string or array of attributes. */ function the_post_thumbnail( $size = 'post-thumbnail', $attr = '' ) { echo get_the_post_thumbnail( null, $size, $attr ); } /** * Update cache for thumbnails in the current loop * * @since 3.2 * * @param object $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global. */ function update_post_thumbnail_cache( $wp_query = null ) { if ( ! $wp_query ) $wp_query = $GLOBALS['wp_query']; if ( $wp_query->thumbnails_cached ) return; $thumb_ids = array(); foreach ( $wp_query->posts as $post ) { if ( $id = get_post_thumbnail_id( $post->ID ) ) $thumb_ids[] = $id; } if ( ! empty ( $thumb_ids ) ) { _prime_post_caches( $thumb_ids, false, true ); } $wp_query->thumbnails_cached = true; } /** * Retrieve Post Thumbnail. * * @since 2.9.0 * * @param int $post_id Optional. Post ID. * @param string $size Optional. Image size. Defaults to 'post-thumbnail'. * @param string|array $attr Optional. Query string or array of attributes. */ function get_the_post_thumbnail( $post_id = null, $size = 'post-thumbnail', $attr = '' ) { $post_id = ( null === $post_id ) ? get_the_ID() : $post_id; $post_thumbnail_id = get_post_thumbnail_id( $post_id ); $size = apply_filters( 'post_thumbnail_size', $size ); if ( $post_thumbnail_id ) { do_action( 'begin_fetch_post_thumbnail_html', $post_id, $post_thumbnail_id, $size ); // for "Just In Time" filtering of all of wp_get_attachment_image()'s filters if ( in_the_loop() ) update_post_thumbnail_cache(); $html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr ); do_action( 'end_fetch_post_thumbnail_html', $post_id, $post_thumbnail_id, $size ); } else { $html = ''; } return apply_filters( 'post_thumbnail_html', $html, $post_id, $post_thumbnail_id, $size, $attr ); } * Navigation Menu functions * * @package WordPress * @subpackage Nav_Menus * @since 3.0.0 */ /** * Returns a navigation menu object. * * @since 3.0.0 * * @uses get_term * @uses get_term_by * * @param string $menu Menu id, slug or name * @return mixed false if $menu param isn't supplied or term does not exist, menu object if successful. */ function wp_get_nav_menu_object( $menu ) { if ( ! $menu ) return false; $menu_obj = get_term( $menu, 'nav_menu' ); if ( ! $menu_obj ) $menu_obj = get_term_by( 'slug', $menu, 'nav_menu' ); if ( ! $menu_obj ) $menu_obj = get_term_by( 'name', $menu, 'nav_menu' ); if ( ! $menu_obj ) $menu_obj = false; return $menu_obj; } /** * Check if the given ID is a navigation menu. * * Returns true if it is; false otherwise. * * @since 3.0.0 * * @param int|string $menu The menu to check (id, slug, or name) * @return bool Whether the menu exists. */ function is_nav_menu( $menu ) { if ( ! $menu ) return false; $menu_obj = wp_get_nav_menu_object( $menu ); if ( $menu_obj && ! is_wp_error( $menu_obj ) && ! empty( $menu_obj->taxonomy ) && 'nav_menu' == $menu_obj->taxonomy ) return true; return false; } /** * Register navigation menus for a theme. * * @since 3.0.0 * * @param array $locations Associative array of menu location identifiers (like a slug) and descriptive text. */ function register_nav_menus( $locations = array() ) { global $_wp_registered_nav_menus; add_theme_support( 'menus' ); $_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations ); } /** * Unregisters a navigation menu for a theme. * * @param array $location the menu location identifier * * @return bool True on success, false on failure. */ function unregister_nav_menu( $location ) { global $_wp_registered_nav_menus; if ( is_array( $_wp_registered_nav_menus ) && isset( $_wp_registered_nav_menus[$location] ) ) { unset( $_wp_registered_nav_menus[$location] ); return true; } return false; } /** * Register a navigation menu for a theme. * * @since 3.0.0 * * @param string $location Menu location identifier, like a slug. * @param string $description Menu location descriptive text. */ function register_nav_menu( $location, $description ) { register_nav_menus( array( $location => $description ) ); } /** * Returns an array of all registered navigation menus in a theme * * @since 3.0.0 * @return array */ function get_registered_nav_menus() { global $_wp_registered_nav_menus; if ( isset( $_wp_registered_nav_menus ) ) return $_wp_registered_nav_menus; return array(); } /** * Returns an array with the registered navigation menu locations and the menu assigned to it * * @since 3.0.0 * @return array */ function get_nav_menu_locations() { return get_theme_mod( 'nav_menu_locations' ); } /** * Whether a registered nav menu location has a menu assigned to it. * * @since 3.0.0 * @param string $location Menu location identifier. * @return bool Whether location has a menu. */ function has_nav_menu( $location ) { $locations = get_nav_menu_locations(); return ( ! empty( $locations[ $location ] ) ); } /** * Determine whether the given ID is a nav menu item. * * @since 3.0.0 * * @param int $menu_item_id The ID of the potential nav menu item. * @return bool Whether the given ID is that of a nav menu item. */ function is_nav_menu_item( $menu_item_id = 0 ) { return ( ! is_wp_error( $menu_item_id ) && ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) ); } /** * Create a Navigation Menu. * * @since 3.0.0 * * @param string $menu_name Menu Name * @return mixed Menu object on success|WP_Error on failure */ function wp_create_nav_menu( $menu_name ) { return wp_update_nav_menu_object( 0, array( 'menu-name' => $menu_name ) ); } /** * Delete a Navigation Menu. * * @since 3.0.0 * * @param string $menu name|id|slug * @return mixed Menu object on success|WP_Error on failure */ function wp_delete_nav_menu( $menu ) { $menu = wp_get_nav_menu_object( $menu ); if ( ! $menu ) return false; $menu_objects = get_objects_in_term( $menu->term_id, 'nav_menu' ); if ( ! empty( $menu_objects ) ) { foreach ( $menu_objects as $item ) { wp_delete_post( $item ); } } $result = wp_delete_term( $menu->term_id, 'nav_menu' ); if ( $result && !is_wp_error($result) ) do_action( 'wp_delete_nav_menu', $menu->term_id ); return $result; } /** * Save the properties of a menu or create a new menu with those properties. * * @since 3.0.0 * * @param int $menu_id The ID of the menu or "0" to create a new menu. * @param array $menu_data The array of menu data. * @return int|error object The menu's ID or WP_Error object. */ function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) { $menu_id = (int) $menu_id; $_menu = wp_get_nav_menu_object( $menu_id ); $args = array( 'description' => ( isset( $menu_data['description'] ) ? $menu_data['description'] : '' ), 'name' => ( isset( $menu_data['menu-name'] ) ? $menu_data['menu-name'] : '' ), 'parent' => ( isset( $menu_data['parent'] ) ? (int) $menu_data['parent'] : 0 ), 'slug' => null, ); // double-check that we're not going to have one menu take the name of another $_possible_existing = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' ); if ( $_possible_existing && ! is_wp_error( $_possible_existing ) && isset( $_possible_existing->term_id ) && $_possible_existing->term_id != $menu_id ) return new WP_Error( 'menu_exists', sprintf( __('The menu name %s conflicts with another menu name. Please try another.'), esc_html( $menu_data['menu-name'] ) ) ); // menu doesn't already exist, so create a new menu if ( ! $_menu || is_wp_error( $_menu ) ) { $menu_exists = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' ); if ( $menu_exists ) return new WP_Error( 'menu_exists', sprintf( __('The menu name %s conflicts with another menu name. Please try another.'), esc_html( $menu_data['menu-name'] ) ) ); $_menu = wp_insert_term( $menu_data['menu-name'], 'nav_menu', $args ); if ( is_wp_error( $_menu ) ) return $_menu; do_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data ); return (int) $_menu['term_id']; } if ( ! $_menu || ! isset( $_menu->term_id ) ) return 0; $menu_id = (int) $_menu->term_id; $update_response = wp_update_term( $menu_id, 'nav_menu', $args ); if ( is_wp_error( $update_response ) ) return $update_response; do_action( 'wp_update_nav_menu', $menu_id, $menu_data ); return $menu_id; } /** * Save the properties of a menu item or create a new one. * * @since 3.0.0 * * @param int $menu_id The ID of the menu. Required. If "0", makes the menu item a draft orphan. * @param int $menu_item_db_id The ID of the menu item. If "0", creates a new menu item. * @param array $menu_item_data The menu item's data. * @return int The menu item's database ID or WP_Error object on failure. */ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) { $menu_id = (int) $menu_id; $menu_item_db_id = (int) $menu_item_db_id; // make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) ) return new WP_Error('update_nav_menu_item_failed', __('The given object ID is not that of a menu item.')); $menu = wp_get_nav_menu_object( $menu_id ); if ( ( ! $menu && 0 !== $menu_id ) || is_wp_error( $menu ) ) return $menu; $defaults = array( 'menu-item-db-id' => $menu_item_db_id, 'menu-item-object-id' => 0, 'menu-item-object' => '', 'menu-item-parent-id' => 0, 'menu-item-position' => 0, 'menu-item-type' => 'custom', 'menu-item-title' => '', 'menu-item-url' => '', 'menu-item-description' => '', 'menu-item-attr-title' => '', 'menu-item-target' => '', 'menu-item-classes' => '', 'menu-item-xfn' => '', 'menu-item-status' => '', ); $args = wp_parse_args( $menu_item_data, $defaults ); if ( 0 == $menu_id ) { $args['menu-item-position'] = 1; } elseif ( 0 == (int) $args['menu-item-position'] ) { $menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) ); $last_item = array_pop( $menu_items ); $args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items ); } $original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0; if ( 'custom' != $args['menu-item-type'] ) { /* if non-custom menu item, then: * use original object's URL * blank default title to sync with original object's */ $args['menu-item-url'] = ''; $original_title = ''; if ( 'taxonomy' == $args['menu-item-type'] ) { $original_parent = get_term_field( 'parent', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' ); $original_title = get_term_field( 'name', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' ); } elseif ( 'post_type' == $args['menu-item-type'] ) { $original_object = get_post( $args['menu-item-object-id'] ); $original_parent = (int) $original_object->post_parent; $original_title = $original_object->post_title; } if ( empty( $args['menu-item-title'] ) || $args['menu-item-title'] == $original_title ) { $args['menu-item-title'] = ''; // hack to get wp to create a post object when too many properties are empty if ( empty( $args['menu-item-description'] ) ) $args['menu-item-description'] = ' '; } } // Populate the menu item object $post = array( 'menu_order' => $args['menu-item-position'], 'ping_status' => 0, 'post_content' => $args['menu-item-description'], 'post_excerpt' => $args['menu-item-attr-title'], 'post_parent' => $original_parent, 'post_title' => $args['menu-item-title'], 'post_type' => 'nav_menu_item', ); $update = 0 != $menu_item_db_id; // Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms() if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) $post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) ); // New menu item. Default is draft status if ( ! $update ) { $post['ID'] = 0; $post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft'; $menu_item_db_id = wp_insert_post( $post ); if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) return $menu_item_db_id; } if ( 'custom' == $args['menu-item-type'] ) { $args['menu-item-object-id'] = $menu_item_db_id; $args['menu-item-object'] = 'custom'; } $menu_item_db_id = (int) $menu_item_db_id; update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) ); update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', strval( (int) $args['menu-item-parent-id'] ) ); update_post_meta( $menu_item_db_id, '_menu_item_object_id', strval( (int) $args['menu-item-object-id'] ) ); update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) ); update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) ); $args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) ); $args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) ); update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] ); update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] ); update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) ); if ( 0 == $menu_id ) update_post_meta( $menu_item_db_id, '_menu_item_orphaned', (string) time() ); elseif ( get_post_meta( $menu_item_db_id, '_menu_item_orphaned' ) ) delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' ); // Update existing menu item. Default is publish status if ( $update ) { $post['ID'] = $menu_item_db_id; $post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish'; wp_update_post( $post ); } do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args ); return $menu_item_db_id; } /** * Returns all navigation menu objects. * * @since 3.0.0 * * @param array $args Array of arguments passed on to get_terms(). * @return array menu objects */ function wp_get_nav_menus( $args = array() ) { $defaults = array( 'hide_empty' => false, 'orderby' => 'none' ); $args = wp_parse_args( $args, $defaults ); return apply_filters( 'wp_get_nav_menus', get_terms( 'nav_menu', $args), $args ); } /** * Sort menu items by the desired key. * * @since 3.0.0 * @access private * * @param object $a The first object to compare * @param object $b The second object to compare * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b. */ function _sort_nav_menu_items( $a, $b ) { global $_menu_item_sort_prop; if ( empty( $_menu_item_sort_prop ) ) return 0; if ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) ) return 0; $_a = (int) $a->$_menu_item_sort_prop; $_b = (int) $b->$_menu_item_sort_prop; if ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop ) return 0; elseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop ) return $_a < $_b ? -1 : 1; else return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop ); } /** * Returns if a menu item is valid. Bug #13958 * * @since 3.2.0 * @access private * * @param object $menu_item The menu item to check * @return bool false if invalid, else true. */ function _is_valid_nav_menu_item( $item ) { if ( ! empty( $item->_invalid ) ) return false; return true; } /** * Returns all menu items of a navigation menu. * * @since 3.0.0 * * @param string $menu menu name, id, or slug * @param string $args * @return mixed $items array of menu items, else false. */ function wp_get_nav_menu_items( $menu, $args = array() ) { global $_wp_using_ext_object_cache; $menu = wp_get_nav_menu_object( $menu ); if ( ! $menu ) return false; static $fetched = array(); $items = get_objects_in_term( $menu->term_id, 'nav_menu' ); if ( empty( $items ) ) return $items; $defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true ); $args = wp_parse_args( $args, $defaults ); if ( count( $items ) > 1 ) $args['include'] = implode( ',', $items ); else $args['include'] = $items[0]; $items = get_posts( $args ); if ( is_wp_error( $items ) || ! is_array( $items ) ) return false; // Get all posts and terms at once to prime the caches if ( empty( $fetched[$menu->term_id] ) || $_wp_using_ext_object_cache ) { $fetched[$menu->term_id] = true; $posts = array(); $terms = array(); foreach ( $items as $item ) { $object_id = get_post_meta( $item->ID, '_menu_item_object_id', true ); $object = get_post_meta( $item->ID, '_menu_item_object', true ); $type = get_post_meta( $item->ID, '_menu_item_type', true ); if ( 'post_type' == $type ) $posts[$object][] = $object_id; elseif ( 'taxonomy' == $type) $terms[$object][] = $object_id; } if ( ! empty( $posts ) ) { foreach ( array_keys($posts) as $post_type ) { get_posts( array('post__in' => $posts[$post_type], 'post_type' => $post_type, 'nopaging' => true, 'update_post_term_cache' => false) ); } } unset($posts); if ( ! empty( $terms ) ) { foreach ( array_keys($terms) as $taxonomy ) { get_terms($taxonomy, array('include' => $terms[$taxonomy]) ); } } unset($terms); } $items = array_map( 'wp_setup_nav_menu_item', $items ); if ( ! is_admin() ) // Remove invalid items only in frontend $items = array_filter( $items, '_is_valid_nav_menu_item' ); if ( ARRAY_A == $args['output'] ) { $GLOBALS['_menu_item_sort_prop'] = $args['output_key']; usort($items, '_sort_nav_menu_items'); $i = 1; foreach( $items as $k => $item ) { $items[$k]->$args['output_key'] = $i++; } } return apply_filters( 'wp_get_nav_menu_items', $items, $menu, $args ); } /** * Decorates a menu item object with the shared navigation menu item properties. * * Properties: * - db_id: The DB ID of this item as a nav_menu_item object, if it exists (0 if it doesn't exist). * - object_id: The DB ID of the original object this menu item represents, e.g. ID for posts and term_id for categories. * - type: The family of objects originally represented, such as "post_type" or "taxonomy." * - object: The type of object originally represented, such as "category," "post", or "attachment." * - type_label: The singular label used to describe this type of menu item. * - post_parent: The DB ID of the original object's parent object, if any (0 otherwise). * - menu_item_parent: The DB ID of the nav_menu_item that is this item's menu parent, if any. 0 otherwise. * - url: The URL to which this menu item points. * - title: The title of this menu item. * - target: The target attribute of the link element for this menu item. * - attr_title: The title attribute of the link element for this menu item. * - classes: The array of class attribute values for the link element of this menu item. * - xfn: The XFN relationship expressed in the link of this menu item. * - description: The description of this menu item. * * @since 3.0.0 * * @param object $menu_item The menu item to modify. * @return object $menu_item The menu item with standard menu item properties. */ function wp_setup_nav_menu_item( $menu_item ) { if ( isset( $menu_item->post_type ) ) { if ( 'nav_menu_item' == $menu_item->post_type ) { $menu_item->db_id = (int) $menu_item->ID; $menu_item->menu_item_parent = empty( $menu_item->menu_item_parent ) ? get_post_meta( $menu_item->ID, '_menu_item_menu_item_parent', true ) : $menu_item->menu_item_parent; $menu_item->object_id = empty( $menu_item->object_id ) ? get_post_meta( $menu_item->ID, '_menu_item_object_id', true ) : $menu_item->object_id; $menu_item->object = empty( $menu_item->object ) ? get_post_meta( $menu_item->ID, '_menu_item_object', true ) : $menu_item->object; $menu_item->type = empty( $menu_item->type ) ? get_post_meta( $menu_item->ID, '_menu_item_type', true ) : $menu_item->type; if ( 'post_type' == $menu_item->type ) { $object = get_post_type_object( $menu_item->object ); if ( $object ) { $menu_item->type_label = $object->labels->singular_name; } else { $menu_item->type_label = $menu_item->object; $menu_item->_invalid = true; } $menu_item->url = get_permalink( $menu_item->object_id ); $original_object = get_post( $menu_item->object_id ); $original_title = $original_object->post_title; $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title; } elseif ( 'taxonomy' == $menu_item->type ) { $object = get_taxonomy( $menu_item->object ); if ( $object ) { $menu_item->type_label = $object->labels->singular_name; } else { $menu_item->type_label = $menu_item->object; $menu_item->_invalid = true; } $term_url = get_term_link( (int) $menu_item->object_id, $menu_item->object ); $menu_item->url = !is_wp_error( $term_url ) ? $term_url : ''; $original_title = get_term_field( 'name', $menu_item->object_id, $menu_item->object, 'raw' ); if ( is_wp_error( $original_title ) ) $original_title = false; $menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title; } else { $menu_item->type_label = __('Custom'); $menu_item->title = $menu_item->post_title; $menu_item->url = empty( $menu_item->url ) ? get_post_meta( $menu_item->ID, '_menu_item_url', true ) : $menu_item->url; } $menu_item->target = empty( $menu_item->target ) ? get_post_meta( $menu_item->ID, '_menu_item_target', true ) : $menu_item->target; $menu_item->attr_title = empty( $menu_item->attr_title ) ? apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ) : $menu_item->attr_title; if ( empty( $menu_item->description ) ) $menu_item->description = apply_filters( 'nav_menu_description', wp_trim_words( $menu_item->post_content, 200 ) ); $menu_item->classes = empty( $menu_item->classes ) ? (array) get_post_meta( $menu_item->ID, '_menu_item_classes', true ) : $menu_item->classes; $menu_item->xfn = empty( $menu_item->xfn ) ? get_post_meta( $menu_item->ID, '_menu_item_xfn', true ) : $menu_item->xfn; } else { $menu_item->db_id = 0; $menu_item->menu_item_parent = 0; $menu_item->object_id = (int) $menu_item->ID; $menu_item->type = 'post_type'; $object = get_post_type_object( $menu_item->post_type ); $menu_item->object = $object->name; $menu_item->type_label = $object->labels->singular_name; $menu_item->title = $menu_item->post_title; $menu_item->url = get_permalink( $menu_item->ID ); $menu_item->target = ''; $menu_item->attr_title = apply_filters( 'nav_menu_attr_title', '' ); $menu_item->description = apply_filters( 'nav_menu_description', '' ); $menu_item->classes = array(); $menu_item->xfn = ''; } } elseif ( isset( $menu_item->taxonomy ) ) { $menu_item->ID = $menu_item->term_id; $menu_item->db_id = 0; $menu_item->menu_item_parent = 0; $menu_item->object_id = (int) $menu_item->term_id; $menu_item->post_parent = (int) $menu_item->parent; $menu_item->type = 'taxonomy'; $object = get_taxonomy( $menu_item->taxonomy ); $menu_item->object = $object->name; $menu_item->type_label = $object->labels->singular_name; $menu_item->title = $menu_item->name; $menu_item->url = get_term_link( $menu_item, $menu_item->taxonomy ); $menu_item->target = ''; $menu_item->attr_title = ''; $menu_item->description = get_term_field( 'description', $menu_item->term_id, $menu_item->taxonomy ); $menu_item->classes = array(); $menu_item->xfn = ''; } return apply_filters( 'wp_setup_nav_menu_item', $menu_item ); } /** * Get the menu items associated with a particular object. * * @since 3.0.0 * * @param int $object_id The ID of the original object. * @param string $object_type The type of object, such as "taxonomy" or "post_type." * @return array The array of menu item IDs; empty array if none; */ function wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_type' ) { $object_id = (int) $object_id; $menu_item_ids = array(); $query = new WP_Query; $menu_items = $query->query( array( 'meta_key' => '_menu_item_object_id', 'meta_value' => $object_id, 'post_status' => 'any', 'post_type' => 'nav_menu_item', 'posts_per_page' => -1, ) ); foreach( (array) $menu_items as $menu_item ) { if ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) { if ( get_post_meta( $menu_item->ID, '_menu_item_type', true ) != $object_type ) continue; $menu_item_ids[] = (int) $menu_item->ID; } } return array_unique( $menu_item_ids ); } /** * Callback for handling a menu item when its original object is deleted. * * @since 3.0.0 * @access private * * @param int $object_id The ID of the original object being trashed. * */ function _wp_delete_post_menu_item( $object_id = 0 ) { $object_id = (int) $object_id; $menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'post_type' ); foreach( (array) $menu_item_ids as $menu_item_id ) { wp_delete_post( $menu_item_id, true ); } } /** * Callback for handling a menu item when its original object is deleted. * * @since 3.0.0 * @access private * * @param int $object_id The ID of the original object being trashed. * */ function _wp_delete_tax_menu_item( $object_id = 0 ) { $object_id = (int) $object_id; $menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy' ); foreach( (array) $menu_item_ids as $menu_item_id ) { wp_delete_post( $menu_item_id, true ); } } /** * Automatically add newly published page objects to menus with that as an option. * * @since 3.0.0 * @access private * * @param string $new_status The new status of the post object. * @param string $old_status The old status of the post object. * @param object $post The post object being transitioned from one status to another. * @return void */ function _wp_auto_add_pages_to_menu( $new_status, $old_status, $post ) { if ( 'publish' != $new_status || 'publish' == $old_status || 'page' != $post->post_type ) return; if ( ! empty( $post->post_parent ) ) return; $auto_add = get_option( 'nav_menu_options' ); if ( empty( $auto_add ) || ! is_array( $auto_add ) || ! isset( $auto_add['auto_add'] ) ) return; $auto_add = $auto_add['auto_add']; if ( empty( $auto_add ) || ! is_array( $auto_add ) ) return; $args = array( 'menu-item-object-id' => $post->ID, 'menu-item-object' => $post->post_type, 'menu-item-type' => 'post_type', 'menu-item-status' => 'publish', ); foreach ( $auto_add as $menu_id ) { $items = wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) ); if ( ! is_array( $items ) ) continue; foreach ( $items as $item ) { if ( $post->ID == $item->object_id ) continue 2; } wp_update_nav_menu_item( $menu_id, 0, $args ); } } /* $Id: sitemap.php 809744 2013-11-24 18:44:57Z arnee $ Google XML Sitemaps Generator for WordPress ============================================================================== This generator will create a sitemaps.org compliant sitemap of your WordPress blog. Currently homepage, posts, static pages, categories, archives and author pages are supported. The priority of a post depends on its comments. You can choose the way the priority is calculated in the options screen. Feel free to visit my website under www.arnebrachhold.de! For aditional details like installation instructions, please check the readme.txt and documentation.txt files. Have fun! Arne Info for WordPress: ============================================================================== Plugin Name: Google XML Sitemaps Plugin URI: http://www.arnebrachhold.de/redir/sitemap-home/ Description: This plugin will generate a special XML sitemap which will help search engines like Google, Yahoo, Bing and Ask.com to better index your blog. Version: 3.4 Author: Arne Brachhold Author URI: http://www.arnebrachhold.de/ Text Domain: sitemap Domain Path: /lang/ */ /** * Loader class for the Google Sitemap Generator * * This class takes care of the sitemap plugin and tries to load the different parts as late as possible. * On normal requests, only this small class is loaded. When the sitemap needs to be rebuild, the generator itself is loaded. * The last stage is the user interface which is loaded when the administration page is requested. */ class GoogleSitemapGeneratorLoader { /** * Enabled the sitemap plugin with registering all required hooks * * If the sm_command and sm_key GET params are given, the function will init the generator to rebuild the sitemap. */ static function Enable() { //Check for 3.0 multisite, NOT supported yet! if((defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE) || (function_exists('is_multisite') && is_multisite())) { if(function_exists('is_super_admin') && is_super_admin()) { add_action('admin_notices', array('GoogleSitemapGeneratorLoader', 'AddMultisiteWarning')); } return; } //Register the sitemap creator to wordpress... add_action('admin_menu', array('GoogleSitemapGeneratorLoader', 'RegisterAdminPage')); //Nice icon for Admin Menu (requires Ozh Admin Drop Down Plugin) add_filter('ozh_adminmenu_icon', array('GoogleSitemapGeneratorLoader', 'RegisterAdminIcon')); //Additional links on the plugin page add_filter('plugin_row_meta', array('GoogleSitemapGeneratorLoader', 'RegisterPluginLinks'),10,2); //Existing posts was deleted add_action('delete_post', array('GoogleSitemapGeneratorLoader', 'CallCheckForAutoBuild'),9999,1); //Existing post was published add_action('publish_post', array('GoogleSitemapGeneratorLoader', 'CallCheckForAutoBuild'),9999,1); //Existing page was published add_action('publish_page', array('GoogleSitemapGeneratorLoader', 'CallCheckForAutoBuild'),9999,1); //WP Cron hook add_action('sm_build_cron', array('GoogleSitemapGeneratorLoader', 'CallBuildSitemap'),1,0); //External build hook add_action('sm_rebuild', array('GoogleSitemapGeneratorLoader', 'CallBuildNowRequest'),1,0); //Robots.txt request add_action('do_robots', array('GoogleSitemapGeneratorLoader', 'CallDoRobots'),100,0); //Help topics for context sensitive help add_filter('contextual_help_list', array('GoogleSitemapGeneratorLoader', 'CallHtmlShowHelpList'),9999,2); //Check if this is a BUILD-NOW request (key will be checked later) if(!empty($_GET["sm_command"]) && !empty($_GET["sm_key"])) { GoogleSitemapGeneratorLoader::CallCheckForManualBuild(); } //Check if the result of a ping request should be shown if(!empty($_GET["sm_ping_service"])) { GoogleSitemapGeneratorLoader::CallShowPingResult(); } } /** * Outputs the warning bar if multisite mode is activated */ static function AddMultisiteWarning() { echo "

".__('This version of Google XML Sitemaps is not multisite compatible.','sitemap')."
".sprintf(__('Unfortunately this version of the Google XML Sitemaps plugin was not tested with the multisite feature of WordPress 3.0 yet.
The plugin will not be active until you disable the multisite mode.
Or you can try the new beta which supports all the new WordPress features!','sitemap'), "http://www.arnebrachhold.de/redir/sitemap-info-beta/")."

"; } /** * Registers the plugin in the admin menu system */ static function RegisterAdminPage() { if (function_exists('add_options_page')) { $slug = GoogleSitemapGeneratorLoader::GetBaseName(); add_options_page(__('XML-Sitemap Generator','sitemap'), __('XML-Sitemap','sitemap'), 'level_10', $slug, array('GoogleSitemapGeneratorLoader','CallHtmlShowOptionsPage')); } } static function RegisterAdminIcon($hook) { if ( $hook == GoogleSitemapGeneratorLoader::GetBaseName() && function_exists('plugins_url')) { return plugins_url('img/icon-arne.gif',GoogleSitemapGeneratorLoader::GetBaseName()); } return $hook; } static function RegisterPluginLinks($links, $file) { $base = GoogleSitemapGeneratorLoader::GetBaseName(); if ($file == $base) { $links[] = '' . __('Settings','sitemap') . ''; $links[] = '' . __('FAQ','sitemap') . ''; $links[] = '' . __('Support','sitemap') . ''; $links[] = '' . __('Donate','sitemap') . ''; } return $links; } /** * Invokes the HtmlShowOptionsPage method of the generator */ static function CallHtmlShowOptionsPage() { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->HtmlShowOptionsPage(); } } /** * Invokes the CheckForAutoBuild method of the generator */ static function CallCheckForAutoBuild($args) { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->CheckForAutoBuild($args); } } /** * Invokes the CheckForAutoBuild method of the generator */ static function CallBuildNowRequest() { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->BuildNowRequest(); } } /** * Invokes the BuildSitemap method of the generator */ static function CallBuildSitemap() { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->BuildSitemap(); } } /** * Invokes the CheckForManualBuild method of the generator */ static function CallCheckForManualBuild() { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->CheckForManualBuild(); } } /** * Invokes the ShowPingResult method of the generator */ static function CallShowPingResult() { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->ShowPingResult(); } } static function CallHtmlShowHelpList($filterVal,$screen) { $id = get_plugin_page_hookname(GoogleSitemapGeneratorLoader::GetBaseName(),'options-general.php'); if($screen == $id) { $links = array( __('Plugin Homepage','sitemap')=>'http://www.arnebrachhold.de/redir/sitemap-help-home/', __('My Sitemaps FAQ','sitemap')=>'http://www.arnebrachhold.de/redir/sitemap-help-faq/' ); $filterVal[$id] = ''; $i=0; foreach($links AS $text=>$url) { $filterVal[$id].='' . $text . '' . ($i < (count($links)-1)?'
':'') ; $i++; } } return $filterVal; } static function CallDoRobots() { if(GoogleSitemapGeneratorLoader::LoadPlugin()) { $gs = &GoogleSitemapGenerator::GetInstance(); $gs->DoRobots(); } } /** * Loads the actual generator class and tries to raise the memory and time limits if not already done by WP * * @return boolean true if run successfully */ static function LoadPlugin() { $mem = abs(intval(@ini_get('memory_limit'))); if($mem && $mem < 64) { @ini_set('memory_limit', '64M'); } $time = abs(intval(@ini_get("max_execution_time"))); if($time != 0 && $time < 120) { @set_time_limit(120); } if(!class_exists("GoogleSitemapGenerator")) { $path = trailingslashit(dirname(__FILE__)); if(!file_exists( $path . 'sitemap-core.php')) return false; require_once($path. 'sitemap-core.php'); } GoogleSitemapGenerator::Enable(); return true; } /** * Returns the plugin basename of the plugin (using __FILE__) * * @return string The plugin basename, "sitemap" for example */ static function GetBaseName() { //return "sitemap.php"; return plugin_basename(__FILE__); } /** * Returns the name of this loader script, using __FILE__ * * @return string The __FILE__ value of this loader script */ static function GetPluginFile() { return __FILE__; } /** * Returns the plugin version * * Uses the WP API to get the meta data from the top of this file (comment) * * @return string The version like 3.1.1 */ static function GetVersion() { if(!isset($GLOBALS["sm_version"])) { if(!function_exists('get_plugin_data')) { if(file_exists(ABSPATH . 'wp-admin/includes/plugin.php')) require_once(ABSPATH . 'wp-admin/includes/plugin.php'); //2.3+ else if(file_exists(ABSPATH . 'wp-admin/admin-functions.php')) require_once(ABSPATH . 'wp-admin/admin-functions.php'); //2.1 else return "0.ERROR"; } $data = get_plugin_data(__FILE__, false, false); $GLOBALS["sm_version"] = $data['Version']; } return $GLOBALS["sm_version"]; } } //Enable the plugin for the init hook, but only if WP is loaded. Calling this php file directly will do nothing. if(defined('ABSPATH') && defined('WPINC')) { add_action("init",array("GoogleSitemapGeneratorLoader","Enable"),1000,0); }