「 Wordpress 」 一覧
WordPressを読む 78 /blog/wp-content/plugins/crayon-syntax-highlighter/global.php
/blog/wp-content/plugins/crayon-syntax-h …
WordPressを読む 77 /blog/wp-content/plugins/crayon-syntax-highlighter/crayon_wp.class.php
/blog/wp-content/plugins/crayon-syntax-h …
WordPressを読む 76 /blog/wp-content/plugins/akismet/wrapper.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293<?phpglobal $wpcom_api_key, $akismet_api_host, $akismet_api_port;$wpcom_api_key = defined( 'WPCOM_API_KEY' ) ? constant( 'WPCOM_API_KEY' ) : '';$akismet_api_host = Akismet::get_api_key() . '.rest.akismet.com';$akismet_api_port = 80;function akismet_test_mode() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::is_test_mode()' );return Akismet::is_test_mode();}function akismet_http_post( $request, $host, $path, $port = 80, $ip = null ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::http_post()' );$path = str_replace( '/1.1/', '', $path );return Akismet::http_post( $request, $path, $ip );}function akismet_microtime() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::_get_microtime()' );return Akismet::_get_microtime();}function akismet_delete_old() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::delete_old_comments()' );return Akismet::delete_old_comments();}function akismet_delete_old_metadata() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::delete_old_comments_meta()' );return Akismet::delete_old_comments_meta();}function akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::check_db_comment()' );return Akismet::check_db_comment( $id, $recheck_reason );}function akismet_rightnow() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::rightnow_stats()' );if ( !class_exists( 'Akismet_Admin' ) )return false;return Akismet_Admin::rightnow_stats();}function akismet_admin_init() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_version_warning() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_load_js_and_css() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_nonce_field( $action = -1 ) {_deprecated_function( __FUNCTION__, '3.0', 'wp_nonce_field' );return wp_nonce_field( $action );}function akismet_plugin_action_links( $links, $file ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::plugin_action_links()' );return Akismet_Admin::plugin_action_links( $links, $file );}function akismet_conf() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_stats_display() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_stats() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::dashboard_stats()' );return Akismet_Admin::dashboard_stats();}function akismet_admin_warnings() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_comment_row_action( $a, $comment ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::comment_row_action()' );return Akismet_Admin::comment_row_actions( $a, $comment );}function akismet_comment_status_meta_box( $comment ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::comment_status_meta_box()' );return Akismet_Admin::comment_status_meta_box( $comment );}function akismet_comments_columns( $columns ) {_deprecated_function( __FUNCTION__, '3.0' );return $columns;}function akismet_comment_column_row( $column, $comment_id ) {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_text_add_link_callback( $m ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::text_add_link_callback()' );return Akismet_Admin::text_add_link_callback( $m );}function akismet_text_add_link_class( $comment_text ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::text_add_link_class()' );return Akismet_Admin::text_add_link_class( $comment_text );}function akismet_check_for_spam_button( $comment_status ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::check_for_spam_button()' );return Akismet_Admin::check_for_spam_button( $comment_status );}function akismet_submit_nonspam_comment( $comment_id ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::submit_nonspam_comment()' );return Akismet::submit_nonspam_comment( $comment_id );}function akismet_submit_spam_comment( $comment_id ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::submit_spam_comment()' );return Akismet::submit_spam_comment( $comment_id );}function akismet_transition_comment_status( $new_status, $old_status, $comment ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::transition_comment_status()' );return Akismet::transition_comment_status( $new_status, $old_status, $comment );}function akismet_spam_count( $type = false ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::get_spam_count()' );return Akismet_Admin::get_spam_count( $type );}function akismet_recheck_queue() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::recheck_queue()' );return Akismet_Admin::recheck_queue();}function akismet_remove_comment_author_url() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::remove_comment_author_url()' );return Akismet_Admin::remove_comment_author_url();}function akismet_add_comment_author_url() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::add_comment_author_url()' );return Akismet_Admin::add_comment_author_url();}function akismet_check_server_connectivity() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::check_server_connectivity()' );return Akismet_Admin::check_server_connectivity();}function akismet_get_server_connectivity( $cache_timeout = 86400 ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::()' );return Akismet_Admin::get_server_connectivity( $cache_timeout );}function akismet_server_connectivity_ok() {_deprecated_function( __FUNCTION__, '3.0' );return true;}function akismet_admin_menu() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::admin_menu()' );return Akismet_Admin::admin_menu();}function akismet_load_menu() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet_Admin::load_menu()' );return Akismet_Admin::load_menu();}function akismet_init() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_get_key() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_api_key()' );return Akismet::get_api_key();}function akismet_check_key_status( $key, $ip = null ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::check_key_status()' );return Akismet::check_key_status( $key, $ip );}function akismet_update_alert( $response ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::update_alert()' );return Akismet::update_alert( $response );}function akismet_verify_key( $key, $ip = null ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::verify_key()' );return Akismet::verify_key( $key, $ip );}function akismet_get_user_roles( $user_id ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_user_roles()' );return Akismet::get_user_roles( $user_id );}function akismet_result_spam( $approved ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::comment_is_spam()' );return Akismet::comment_is_spam( $approved );}function akismet_result_hold( $approved ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::comment_needs_moderation()' );return Akismet::comment_needs_moderation( $approved );}function akismet_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_user_comments_approved()' );return Akismet::get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url );}function akismet_update_comment_history( $comment_id, $message, $event = null ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::update_comment_history()' );return Akismet::update_comment_history( $comment_id, $message, $event );}function akismet_get_comment_history( $comment_id ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_comment_history()' );return Akismet::get_comment_history( $comment_id );}function akismet_cmp_time( $a, $b ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::_cmp_time()' );return Akismet::_cmp_time( $a, $b );}function akismet_auto_check_update_meta( $id, $comment ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::auto_check_update_meta()' );return Akismet::auto_check_update_meta( $id, $comment );}function akismet_auto_check_comment( $commentdata ) {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::auto_check_comment()' );return Akismet::auto_check_comment( $commentdata );}function akismet_get_ip_address() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::get_ip_address()' );return Akismet::get_ip_address();}function akismet_cron_recheck() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::cron_recheck()' );return Akismet::cron_recheck();}function akismet_add_comment_nonce() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::add_comment_nonce()' );return Akismet::add_comment_nonce( $post_id );}function akismet_fix_scheduled_recheck() {_deprecated_function( __FUNCTION__, '3.0', 'Akismet::fix_scheduled_recheck()' );return Akismet::fix_scheduled_recheck();}function akismet_spam_comments() {_deprecated_function( __FUNCTION__, '3.0' );return array();}function akismet_spam_totals() {_deprecated_function( __FUNCTION__, '3.0' );return array();}function akismet_manage_page() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_caught() {_deprecated_function( __FUNCTION__, '3.0' );}function redirect_old_akismet_urls() {_deprecated_function( __FUNCTION__, '3.0' );}function akismet_kill_proxy_check( $option ) {_deprecated_function( __FUNCTION__, '3.0' );return 0;}
WordPressを読む 75 /blog/wp-content/plugins/akismet/class.akismet-widget.php
/blog/wp-content/plugins/akismet/class.a …
WordPressを読む 74 /blog/wp-content/plugins/akismet/class.akismet.php
/blog/wp-content/plugins/akismet/class.a …
WordPressを読む 73 /blog/wp-content/plugins/akismet/akismet.php
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758<?php/*** @package Akismet*//*Plugin Name: AkismetPlugin URI: http://akismet.com/Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and trackback spam</strong>. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) <a href="http://akismet.com/get/">Sign up for an Akismet API key</a>, and 3) Go to your Akismet configuration page, and save your API key.Version: 3.0.3Author: AutomatticAuthor URI: http://automattic.com/wordpress-plugins/License: GPLv2 or laterText Domain: akismet*//*This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/// Make sure we don't expose any info if called directlyif ( !function_exists( 'add_action' ) ) {echo 'Hi there! I\'m just a plugin, not much I can do when called directly.';exit;}define( 'AKISMET_VERSION', '3.0.3' );define( 'AKISMET__MINIMUM_WP_VERSION', '3.1' );define( 'AKISMET__PLUGIN_URL', plugin_dir_url( __FILE__ ) );define( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) );define( 'AKISMET_DELETE_LIMIT', 100000 );register_activation_hook( __FILE__, array( 'Akismet', 'plugin_activation' ) );register_deactivation_hook( __FILE__, array( 'Akismet', 'plugin_deactivation' ) );require_once( AKISMET__PLUGIN_DIR . 'class.akismet.php' );require_once( AKISMET__PLUGIN_DIR . 'class.akismet-widget.php' );add_action( 'init', array( 'Akismet', 'init' ) );if ( is_admin() ) {require_once( AKISMET__PLUGIN_DIR . 'class.akismet-admin.php' );add_action( 'init', array( 'Akismet_Admin', 'init' ) );}//add wrapper class around deprecated akismet functions that are referenced elsewhererequire_once( AKISMET__PLUGIN_DIR . 'wrapper.php' );
WordPressを読む 72 /blog/wp-includes/vars.php
2014/12/04 Wordpress
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144<?php/*** Creates common globals for the rest of WordPress** Sets $pagenow global which is the current page. Checks* for the browser to set which one is currently being used.** Detects which user environment WordPress is being used on.* Only attempts to check for Apache, Nginx and IIS -- three web* servers with known pretty permalink capability.** Note: Though Nginx is detected, WordPress does not currently* generate rewrite rules for it. See http://codex.wordpress.org/Nginx** @package WordPress*/global $pagenow,$is_lynx, $is_gecko, $is_winIE, $is_macIE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $is_IE,$is_apache, $is_IIS, $is_iis7, $is_nginx;// On which page are we ?if ( is_admin() ) {// wp-admin pages are checked more carefullyif ( is_network_admin() )preg_match('#/wp-admin/network/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);elseif ( is_user_admin() )preg_match('#/wp-admin/user/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);elsepreg_match('#/wp-admin/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);$pagenow = $self_matches[1];$pagenow = trim($pagenow, '/');$pagenow = preg_replace('#\?.*?$#', '', $pagenow);if ( '' === $pagenow || 'index' === $pagenow || 'index.php' === $pagenow ) {$pagenow = 'index.php';} else {preg_match('#(.*?)(/|$)#', $pagenow, $self_matches);$pagenow = strtolower($self_matches[1]);if ( '.php' !== substr($pagenow, -4, 4) )$pagenow .= '.php'; // for Options +Multiviews: /wp-admin/themes/index.php (themes.php is queried)}} else {if ( preg_match('#([^/]+\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'], $self_matches) )$pagenow = strtolower($self_matches[1]);else$pagenow = 'index.php';}unset($self_matches);// Simple browser detection$is_lynx = $is_gecko = $is_winIE = $is_macIE = $is_opera = $is_NS4 = $is_safari = $is_chrome = $is_iphone = false;if ( isset($_SERVER['HTTP_USER_AGENT']) ) {if ( strpos($_SERVER['HTTP_USER_AGENT'], 'Lynx') !== false ) {$is_lynx = true;} elseif ( stripos($_SERVER['HTTP_USER_AGENT'], 'chrome') !== false ) {if ( stripos( $_SERVER['HTTP_USER_AGENT'], 'chromeframe' ) !== false ) {$is_admin = is_admin();/*** Filter whether Google Chrome Frame should be used, if available.** @since 3.2.0** @param bool $is_admin Whether to use the Google Chrome Frame. Default is the value of is_admin().*/if ( $is_chrome = apply_filters( 'use_google_chrome_frame', $is_admin ) )header( 'X-UA-Compatible: chrome=1' );$is_winIE = ! $is_chrome;} else {$is_chrome = true;}} elseif ( stripos($_SERVER['HTTP_USER_AGENT'], 'safari') !== false ) {$is_safari = true;} elseif ( ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false ) && strpos($_SERVER['HTTP_USER_AGENT'], 'Win') !== false ) {$is_winIE = true;} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false ) {$is_macIE = true;} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Gecko') !== false ) {$is_gecko = true;} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== false ) {$is_opera = true;} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Nav') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla/4.') !== false ) {$is_NS4 = true;}}if ( $is_safari && stripos($_SERVER['HTTP_USER_AGENT'], 'mobile') !== false )$is_iphone = true;$is_IE = ( $is_macIE || $is_winIE );// Server detection/*** Whether the server software is Apache or something else* @global bool $is_apache*/$is_apache = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);/*** Whether the server software is Nginx or something else* @global bool $is_nginx*/$is_nginx = (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false);/*** Whether the server software is IIS or something else* @global bool $is_IIS*/$is_IIS = !$is_apache && (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer') !== false);/*** Whether the server software is IIS 7.X or greater* @global bool $is_iis7*/$is_iis7 = $is_IIS && intval( substr( $_SERVER['SERVER_SOFTWARE'], strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/' ) + 14 ) ) >= 7;/*** Test if the current browser runs on a mobile device (smart phone, tablet, etc.)** @return bool true|false*/function wp_is_mobile() {static $is_mobile;if ( isset($is_mobile) )return $is_mobile;if ( empty($_SERVER['HTTP_USER_AGENT']) ) {$is_mobile = false;} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false // many mobile devices (all iPhone, iPad, etc.)|| strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false|| strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false|| strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false|| strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {$is_mobile = true;} else {$is_mobile = false;}return $is_mobile;}
WordPressを読む 71 /blog/wp-includes/admin-bar.php
2014/12/04 Wordpress
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868<?php/*** Admin Bar** This code handles the building and rendering of the press bar.*//*** Instantiate the admin bar object and set it up as a global for access elsewhere.** UNHOOKING THIS FUNCTION WILL NOT PROPERLY REMOVE THE ADMIN BAR.* For that, use show_admin_bar(false) or the 'show_admin_bar' filter.** @since 3.1.0* @access private* @return bool Whether the admin bar was successfully initialized.*/function _wp_admin_bar_init() {global $wp_admin_bar;if ( ! is_admin_bar_showing() )return false;/* Load the admin bar class code ready for instantiation */require( ABSPATH . WPINC . '/class-wp-admin-bar.php' );/* Instantiate the admin bar *//*** Filter the admin bar class to instantiate.** @since 3.1.0** @param string $wp_admin_bar_class Admin bar class to use. Default 'WP_Admin_Bar'.*/$admin_bar_class = apply_filters( 'wp_admin_bar_class', 'WP_Admin_Bar' );if ( class_exists( $admin_bar_class ) )$wp_admin_bar = new $admin_bar_class;elsereturn false;$wp_admin_bar->initialize();$wp_admin_bar->add_menus();return true;}// Don't remove. Wrong way to disable.add_action( 'template_redirect', '_wp_admin_bar_init', 0 );add_action( 'admin_init', '_wp_admin_bar_init' );/*** Render the admin bar to the page based on the $wp_admin_bar->menu member var.* This is called very late on the footer actions so that it will render after anything else being* added to the footer.** It includes the action "admin_bar_menu" which should be used to hook in and* add new menus to the admin bar. That way you can be sure that you are adding at most optimal point,* right before the admin bar is rendered. This also gives you access to the $post global, among others.** @since 3.1.0*/function wp_admin_bar_render() {global $wp_admin_bar;if ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) )return false;/*** Load all necessary admin bar items.** This is the hook used to add, remove, or manipulate admin bar items.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference*/do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) );/*** Fires before the admin bar is rendered.** @since 3.1.0*/do_action( 'wp_before_admin_bar_render' );$wp_admin_bar->render();/*** Fires after the admin bar is rendered.** @since 3.1.0*/do_action( 'wp_after_admin_bar_render' );}add_action( 'wp_footer', 'wp_admin_bar_render', 1000 );add_action( 'in_admin_header', 'wp_admin_bar_render', 0 );/*** Add the WordPress logo menu.** @since 3.3.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_wp_menu( $wp_admin_bar ) {$wp_admin_bar->add_menu( array('id' => 'wp-logo','title' => '<span class="ab-icon"></span>','href' => self_admin_url( 'about.php' ),'meta' => array('title' => __('About WordPress'),),) );if ( is_user_logged_in() ) {// Add "About WordPress" link$wp_admin_bar->add_menu( array('parent' => 'wp-logo','id' => 'about','title' => __('About WordPress'),'href' => self_admin_url( 'about.php' ),) );}// Add WordPress.org link$wp_admin_bar->add_menu( array('parent' => 'wp-logo-external','id' => 'wporg','title' => __('WordPress.org'),'href' => __('https://wordpress.org/'),) );// Add codex link$wp_admin_bar->add_menu( array('parent' => 'wp-logo-external','id' => 'documentation','title' => __('Documentation'),'href' => __('http://codex.wordpress.org/'),) );// Add forums link$wp_admin_bar->add_menu( array('parent' => 'wp-logo-external','id' => 'support-forums','title' => __('Support Forums'),'href' => __('https://wordpress.org/support/'),) );// Add feedback link$wp_admin_bar->add_menu( array('parent' => 'wp-logo-external','id' => 'feedback','title' => __('Feedback'),'href' => __('https://wordpress.org/support/forum/requests-and-feedback'),) );}/*** Add the sidebar toggle button.** @since 3.8.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_sidebar_toggle( $wp_admin_bar ) {if ( is_admin() ) {$wp_admin_bar->add_menu( array('id' => 'menu-toggle','title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'Menu' ) . '</span>','href' => '#',) );}}/*** Add the "My Account" item.** @since 3.3.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_my_account_item( $wp_admin_bar ) {$user_id = get_current_user_id();$current_user = wp_get_current_user();$profile_url = get_edit_profile_url( $user_id );if ( ! $user_id )return;$avatar = get_avatar( $user_id, 26 );$howdy = sprintf( __('Howdy, %1$s'), $current_user->display_name );$class = empty( $avatar ) ? '' : 'with-avatar';$wp_admin_bar->add_menu( array('id' => 'my-account','parent' => 'top-secondary','title' => $howdy . $avatar,'href' => $profile_url,'meta' => array('class' => $class,'title' => __('My Account'),),) );}/*** Add the "My Account" submenu items.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_my_account_menu( $wp_admin_bar ) {$user_id = get_current_user_id();$current_user = wp_get_current_user();$profile_url = get_edit_profile_url( $user_id );if ( ! $user_id )return;$wp_admin_bar->add_group( array('parent' => 'my-account','id' => 'user-actions',) );$user_info = get_avatar( $user_id, 64 );$user_info .= "<span class='display-name'>{$current_user->display_name}</span>";if ( $current_user->display_name !== $current_user->user_login )$user_info .= "<span class='username'>{$current_user->user_login}</span>";$wp_admin_bar->add_menu( array('parent' => 'user-actions','id' => 'user-info','title' => $user_info,'href' => $profile_url,'meta' => array('tabindex' => -1,),) );$wp_admin_bar->add_menu( array('parent' => 'user-actions','id' => 'edit-profile','title' => __( 'Edit My Profile' ),'href' => $profile_url,) );$wp_admin_bar->add_menu( array('parent' => 'user-actions','id' => 'logout','title' => __( 'Log Out' ),'href' => wp_logout_url(),) );}/*** Add the "Site Name" menu.** @since 3.3.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_site_menu( $wp_admin_bar ) {// Don't show for logged out users.if ( ! is_user_logged_in() )return;// Show only when the user is a member of this site, or they're a super admin.if ( ! is_user_member_of_blog() && ! is_super_admin() )return;$blogname = get_bloginfo('name');if ( empty( $blogname ) )$blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() );if ( is_network_admin() ) {$blogname = sprintf( __('Network Admin: %s'), esc_html( get_current_site()->site_name ) );} elseif ( is_user_admin() ) {$blogname = sprintf( __('Global Dashboard: %s'), esc_html( get_current_site()->site_name ) );}$title = wp_html_excerpt( $blogname, 40, '…' );$wp_admin_bar->add_menu( array('id' => 'site-name','title' => $title,'href' => is_admin() ? home_url( '/' ) : admin_url(),) );// Create submenu items.if ( is_admin() ) {// Add an option to visit the site.$wp_admin_bar->add_menu( array('parent' => 'site-name','id' => 'view-site','title' => __( 'Visit Site' ),'href' => home_url( '/' ),) );if ( is_blog_admin() && is_multisite() && current_user_can( 'manage_sites' ) ) {$wp_admin_bar->add_menu( array('parent' => 'site-name','id' => 'edit-site','title' => __( 'Edit Site' ),'href' => network_admin_url( 'site-info.php?id=' . get_current_blog_id() ),) );}} else {// We're on the front end, link to the Dashboard.$wp_admin_bar->add_menu( array('parent' => 'site-name','id' => 'dashboard','title' => __( 'Dashboard' ),'href' => admin_url(),) );// Add the appearance submenu items.wp_admin_bar_appearance_menu( $wp_admin_bar );}}/*** Add the "My Sites/[Site Name]" menu and all submenus.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_my_sites_menu( $wp_admin_bar ) {// Don't show for logged out users or single site mode.if ( ! is_user_logged_in() || ! is_multisite() )return;// Show only when the user has at least one site, or they're a super admin.if ( count( $wp_admin_bar->user->blogs ) < 1 && ! is_super_admin() )return;$wp_admin_bar->add_menu( array('id' => 'my-sites','title' => __( 'My Sites' ),'href' => admin_url( 'my-sites.php' ),) );if ( is_super_admin() ) {$wp_admin_bar->add_group( array('parent' => 'my-sites','id' => 'my-sites-super-admin',) );$wp_admin_bar->add_menu( array('parent' => 'my-sites-super-admin','id' => 'network-admin','title' => __('Network Admin'),'href' => network_admin_url(),) );$wp_admin_bar->add_menu( array('parent' => 'network-admin','id' => 'network-admin-d','title' => __( 'Dashboard' ),'href' => network_admin_url(),) );$wp_admin_bar->add_menu( array('parent' => 'network-admin','id' => 'network-admin-s','title' => __( 'Sites' ),'href' => network_admin_url( 'sites.php' ),) );$wp_admin_bar->add_menu( array('parent' => 'network-admin','id' => 'network-admin-u','title' => __( 'Users' ),'href' => network_admin_url( 'users.php' ),) );$wp_admin_bar->add_menu( array('parent' => 'network-admin','id' => 'network-admin-t','title' => __( 'Themes' ),'href' => network_admin_url( 'themes.php' ),) );$wp_admin_bar->add_menu( array('parent' => 'network-admin','id' => 'network-admin-p','title' => __( 'Plugins' ),'href' => network_admin_url( 'plugins.php' ),) );}// Add site links$wp_admin_bar->add_group( array('parent' => 'my-sites','id' => 'my-sites-list','meta' => array('class' => is_super_admin() ? 'ab-sub-secondary' : '',),) );foreach ( (array) $wp_admin_bar->user->blogs as $blog ) {switch_to_blog( $blog->userblog_id );$blavatar = '<div class="blavatar"></div>';$blogname = empty( $blog->blogname ) ? $blog->domain : $blog->blogname;$menu_id = 'blog-' . $blog->userblog_id;$wp_admin_bar->add_menu( array('parent' => 'my-sites-list','id' => $menu_id,'title' => $blavatar . $blogname,'href' => admin_url(),) );$wp_admin_bar->add_menu( array('parent' => $menu_id,'id' => $menu_id . '-d','title' => __( 'Dashboard' ),'href' => admin_url(),) );if ( current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {$wp_admin_bar->add_menu( array('parent' => $menu_id,'id' => $menu_id . '-n','title' => __( 'New Post' ),'href' => admin_url( 'post-new.php' ),) );}if ( current_user_can( 'edit_posts' ) ) {$wp_admin_bar->add_menu( array('parent' => $menu_id,'id' => $menu_id . '-c','title' => __( 'Manage Comments' ),'href' => admin_url( 'edit-comments.php' ),) );}$wp_admin_bar->add_menu( array('parent' => $menu_id,'id' => $menu_id . '-v','title' => __( 'Visit Site' ),'href' => home_url( '/' ),) );restore_current_blog();}}/*** Provide a shortlink.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_shortlink_menu( $wp_admin_bar ) {$short = wp_get_shortlink( 0, 'query' );$id = 'get-shortlink';if ( empty( $short ) )return;$html = '<input class="shortlink-input" type="text" readonly="readonly" value="' . esc_attr( $short ) . '" />';$wp_admin_bar->add_menu( array('id' => $id,'title' => __( 'Shortlink' ),'href' => $short,'meta' => array( 'html' => $html ),) );}/*** Provide an edit link for posts and terms.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_edit_menu( $wp_admin_bar ) {global $tag, $wp_the_query;if ( is_admin() ) {$current_screen = get_current_screen();$post = get_post();if ( 'post' == $current_screen->base&& 'add' != $current_screen->action&& ( $post_type_object = get_post_type_object( $post->post_type ) )&& current_user_can( 'read_post', $post->ID )&& ( $post_type_object->public )&& ( $post_type_object->show_in_admin_bar ) ){if( 'draft' == $post->post_status ) {$preview_link = set_url_scheme( get_permalink( $post->ID ) );/** This filter is documented in wp-admin/includes/meta-boxes.php */$preview_link = apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ), $post );$wp_admin_bar->add_menu( array('id' => 'preview','title' => $post_type_object->labels->view_item,'href' => esc_url( $preview_link ),'meta' => array( 'target' => 'wp-preview-' . $post->ID ),) );} else {$wp_admin_bar->add_menu( array('id' => 'view','title' => $post_type_object->labels->view_item,'href' => get_permalink( $post->ID )) );}} elseif ( 'edit-tags' == $current_screen->base&& isset( $tag ) && is_object( $tag )&& ( $tax = get_taxonomy( $tag->taxonomy ) )&& $tax->public ){$wp_admin_bar->add_menu( array('id' => 'view','title' => $tax->labels->view_item,'href' => get_term_link( $tag )) );}} else {$current_object = $wp_the_query->get_queried_object();if ( empty( $current_object ) )return;if ( ! empty( $current_object->post_type )&& ( $post_type_object = get_post_type_object( $current_object->post_type ) )&& current_user_can( 'edit_post', $current_object->ID )&& $post_type_object->show_ui && $post_type_object->show_in_admin_bar ){$wp_admin_bar->add_menu( array('id' => 'edit','title' => $post_type_object->labels->edit_item,'href' => get_edit_post_link( $current_object->ID )) );} elseif ( ! empty( $current_object->taxonomy )&& ( $tax = get_taxonomy( $current_object->taxonomy ) )&& current_user_can( $tax->cap->edit_terms )&& $tax->show_ui ){$wp_admin_bar->add_menu( array('id' => 'edit','title' => $tax->labels->edit_item,'href' => get_edit_term_link( $current_object->term_id, $current_object->taxonomy )) );}}}/*** Add "Add New" menu.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_new_content_menu( $wp_admin_bar ) {$actions = array();$cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' );if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) )$actions[ 'post-new.php' ] = array( $cpts['post']->labels->name_admin_bar, 'new-post' );if ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) )$actions[ 'media-new.php' ] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' );if ( current_user_can( 'manage_links' ) )$actions[ 'link-add.php' ] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' );if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) )$actions[ 'post-new.php?post_type=page' ] = array( $cpts['page']->labels->name_admin_bar, 'new-page' );unset( $cpts['post'], $cpts['page'], $cpts['attachment'] );// Add any additional custom post types.foreach ( $cpts as $cpt ) {if ( ! current_user_can( $cpt->cap->create_posts ) )continue;$key = 'post-new.php?post_type=' . $cpt->name;$actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name );}// Avoid clash with parent node and a 'content' post type.if ( isset( $actions['post-new.php?post_type=content'] ) )$actions['post-new.php?post_type=content'][1] = 'add-new-content';if ( current_user_can( 'create_users' ) || current_user_can( 'promote_users' ) )$actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'new-user' );if ( ! $actions )return;$title = '<span class="ab-icon"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>';$wp_admin_bar->add_menu( array('id' => 'new-content','title' => $title,'href' => admin_url( current( array_keys( $actions ) ) ),'meta' => array('title' => _x( 'Add New', 'admin bar menu group label' ),),) );foreach ( $actions as $link => $action ) {list( $title, $id ) = $action;$wp_admin_bar->add_menu( array('parent' => 'new-content','id' => $id,'title' => $title,'href' => admin_url( $link )) );}}/*** Add edit comments link with awaiting moderation count bubble.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_comments_menu( $wp_admin_bar ) {if ( !current_user_can('edit_posts') )return;$awaiting_mod = wp_count_comments();$awaiting_mod = $awaiting_mod->moderated;$awaiting_title = esc_attr( sprintf( _n( '%s comment awaiting moderation', '%s comments awaiting moderation', $awaiting_mod ), number_format_i18n( $awaiting_mod ) ) );$icon = '<span class="ab-icon"></span>';$title = '<span id="ab-awaiting-mod" class="ab-label awaiting-mod pending-count count-' . $awaiting_mod . '">' . number_format_i18n( $awaiting_mod ) . '</span>';$wp_admin_bar->add_menu( array('id' => 'comments','title' => $icon . $title,'href' => admin_url('edit-comments.php'),'meta' => array( 'title' => $awaiting_title ),) );}/*** Add appearance submenu items to the "Site Name" menu.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_appearance_menu( $wp_admin_bar ) {$wp_admin_bar->add_group( array( 'parent' => 'site-name', 'id' => 'appearance' ) );if ( current_user_can( 'switch_themes' ) || current_user_can( 'edit_theme_options' ) )$wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'themes', 'title' => __('Themes'), 'href' => admin_url('themes.php') ) );if ( ! current_user_can( 'edit_theme_options' ) )return;if ( current_user_can( 'customize' ) ) {$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];$wp_admin_bar->add_menu( array('parent' => 'appearance','id' => 'customize','title' => __('Customize'),'href' => add_query_arg( 'url', urlencode( $current_url ), wp_customize_url() ),'meta' => array('class' => 'hide-if-no-customize',),) );add_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' );}if ( current_theme_supports( 'widgets' ) )$wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'widgets', 'title' => __('Widgets'), 'href' => admin_url('widgets.php') ) );if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) )$wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'menus', 'title' => __('Menus'), 'href' => admin_url('nav-menus.php') ) );if ( current_theme_supports( 'custom-background' ) )$wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'background', 'title' => __('Background'), 'href' => admin_url('themes.php?page=custom-background') ) );if ( current_theme_supports( 'custom-header' ) )$wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'header', 'title' => __('Header'), 'href' => admin_url('themes.php?page=custom-header') ) );}/*** Provide an update link if theme/plugin/core updates are available.** @since 3.1.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_updates_menu( $wp_admin_bar ) {$update_data = wp_get_update_data();if ( !$update_data['counts']['total'] )return;$title = '<span class="ab-icon"></span><span class="ab-label">' . number_format_i18n( $update_data['counts']['total'] ) . '</span>';$title .= '<span class="screen-reader-text">' . $update_data['title'] . '</span>';$wp_admin_bar->add_menu( array('id' => 'updates','title' => $title,'href' => network_admin_url( 'update-core.php' ),'meta' => array('title' => $update_data['title'],),) );}/*** Add search form.** @since 3.3.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_search_menu( $wp_admin_bar ) {if ( is_admin() )return;$form = '<form action="' . esc_url( home_url( '/' ) ) . '" method="get" id="adminbarsearch">';$form .= '<input class="adminbar-input" name="s" id="adminbar-search" type="text" value="" maxlength="150" />';$form .= '<input type="submit" class="adminbar-button" value="' . __('Search') . '"/>';$form .= '</form>';$wp_admin_bar->add_menu( array('parent' => 'top-secondary','id' => 'search','title' => $form,'meta' => array('class' => 'admin-bar-search','tabindex' => -1,)) );}/*** Add secondary menus.** @since 3.3.0** @param WP_Admin_Bar $wp_admin_bar*/function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) {$wp_admin_bar->add_group( array('id' => 'top-secondary','meta' => array('class' => 'ab-top-secondary',),) );$wp_admin_bar->add_group( array('parent' => 'wp-logo','id' => 'wp-logo-external','meta' => array('class' => 'ab-sub-secondary',),) );}/*** Style and scripts for the admin bar.** @since 3.1.0*/function wp_admin_bar_header() { ?><style type="text/css" media="print">#wpadminbar { display:none; }</style><?php}/*** Default admin bar callback.** @since 3.1.0*/function _admin_bar_bump_cb() { ?><style type="text/css" media="screen">html { margin-top: 32px !important; }* html body { margin-top: 32px !important; }@media screen and ( max-width: 782px ) {html { margin-top: 46px !important; }* html body { margin-top: 46px !important; }}</style><?php}/*** Set the display status of the admin bar.** This can be called immediately upon plugin load. It does not need to be called from a function hooked to the init action.** @since 3.1.0** @param bool $show Whether to allow the admin bar to show.* @return void*/function show_admin_bar( $show ) {global $show_admin_bar;$show_admin_bar = (bool) $show;}/*** Determine whether the admin bar should be showing.** @since 3.1.0** @return bool Whether the admin bar should be showing.*/function is_admin_bar_showing() {global $show_admin_bar, $pagenow;// For all these types of requests, we never want an admin bar.if ( defined('XMLRPC_REQUEST') || defined('DOING_AJAX') || defined('IFRAME_REQUEST') )return false;// Integrated into the admin.if ( is_admin() )return true;if ( ! isset( $show_admin_bar ) ) {if ( ! is_user_logged_in() || 'wp-login.php' == $pagenow ) {$show_admin_bar = false;} else {$show_admin_bar = _get_admin_bar_pref();}}/*** Filter whether to show the admin bar.** Returning false to this hook is the recommended way to hide the admin bar.* The user's display preference is used for logged in users.** @since 3.1.0** @param bool $show_admin_bar Whether the admin bar should be shown. Default false.*/$show_admin_bar = apply_filters( 'show_admin_bar', $show_admin_bar );return $show_admin_bar;}/*** Retrieve the admin bar display preference of a user.** @since 3.1.0* @access private** @param string $context Context of this preference check. Defaults to 'front'. The 'admin'* preference is no longer used.* @param int $user Optional. ID of the user to check, defaults to 0 for current user.* @return bool Whether the admin bar should be showing for this user.*/function _get_admin_bar_pref( $context = 'front', $user = 0 ) {$pref = get_user_option( "show_admin_bar_{$context}", $user );if ( false === $pref )return true;return 'true' === $pref;}
WordPressを読む 70 /blog/wp-includes/nav-menu-template.php
2014/12/04 Wordpress
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678<?php/*** Navigation Menu template functions** @package WordPress* @subpackage Nav_Menus* @since 3.0.0*//*** Create HTML list of nav menu items.** @since 3.0.0* @uses Walker*/class Walker_Nav_Menu extends Walker {/*** What the class handles.** @see Walker::$tree_type* @since 3.0.0* @var string*/public $tree_type = array( 'post_type', 'taxonomy', 'custom' );/*** Database fields to use.** @see Walker::$db_fields* @since 3.0.0* @todo Decouple this.* @var array*/public $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );/*** Starts the list before the elements are added.** @see Walker::start_lvl()** @since 3.0.0** @param string $output Passed by reference. Used to append additional content.* @param int $depth Depth of menu item. Used for padding.* @param array $args An array of arguments. @see wp_nav_menu()*/public function start_lvl( &$output, $depth = 0, $args = array() ) {$indent = str_repeat("\t", $depth);$output .= "\n$indent<ul class=\"sub-menu\">\n";}/*** Ends the list of after the elements are added.** @see Walker::end_lvl()** @since 3.0.0** @param string $output Passed by reference. Used to append additional content.* @param int $depth Depth of menu item. Used for padding.* @param array $args An array of arguments. @see wp_nav_menu()*/public function end_lvl( &$output, $depth = 0, $args = array() ) {$indent = str_repeat("\t", $depth);$output .= "$indent</ul>\n";}/*** Start the element output.** @see Walker::start_el()** @since 3.0.0** @param string $output Passed by reference. Used to append additional content.* @param object $item Menu item data object.* @param int $depth Depth of menu item. Used for padding.* @param array $args An array of arguments. @see wp_nav_menu()* @param int $id Current item ID.*/public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';$classes = empty( $item->classes ) ? array() : (array) $item->classes;$classes[] = 'menu-item-' . $item->ID;/*** Filter the CSS class(es) applied to a menu item's <li>.** @since 3.0.0** @see wp_nav_menu()** @param array $classes The CSS classes that are applied to the menu item's <li>.* @param object $item The current menu item.* @param array $args An array of wp_nav_menu() arguments.*/$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );$class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';/*** Filter the ID applied to a menu item's <li>.** @since 3.0.1** @see wp_nav_menu()** @param string $menu_id The ID that is applied to the menu item's <li>.* @param object $item The current menu item.* @param array $args An array of wp_nav_menu() arguments.*/$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );$id = $id ? ' id="' . esc_attr( $id ) . '"' : '';$output .= $indent . '<li' . $id . $class_names .'>';$atts = array();$atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : '';$atts['target'] = ! empty( $item->target ) ? $item->target : '';$atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : '';$atts['href'] = ! empty( $item->url ) ? $item->url : '';/*** Filter the HTML attributes applied to a menu item's <a>.** @since 3.6.0** @see wp_nav_menu()** @param array $atts {* The HTML attributes applied to the menu item's <a>, empty strings are ignored.** @type string $title Title attribute.* @type string $target Target attribute.* @type string $rel The rel attribute.* @type string $href The href attribute.* }* @param object $item The current menu item.* @param array $args An array of wp_nav_menu() arguments.*/$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );$attributes = '';foreach ( $atts as $attr => $value ) {if ( ! empty( $value ) ) {$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );$attributes .= ' ' . $attr . '="' . $value . '"';}}$item_output = $args->before;$item_output .= '<a'. $attributes .'>';/** This filter is documented in wp-includes/post-template.php */$item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;$item_output .= '</a>';$item_output .= $args->after;/*** Filter a menu item's starting output.** The menu item's starting output only includes $args->before, the opening <a>,* the menu item's title, the closing </a>, and $args->after. Currently, there is* no filter for modifying the opening and closing <li> for a menu item.** @since 3.0.0** @see wp_nav_menu()** @param string $item_output The menu item's starting HTML output.* @param object $item Menu item data object.* @param int $depth Depth of menu item. Used for padding.* @param array $args An array of wp_nav_menu() arguments.*/$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );}/*** Ends the element output, if needed.** @see Walker::end_el()** @since 3.0.0** @param string $output Passed by reference. Used to append additional content.* @param object $item Page data object. Not used.* @param int $depth Depth of page. Not Used.* @param array $args An array of arguments. @see wp_nav_menu()*/public function end_el( &$output, $item, $depth = 0, $args = array() ) {$output .= "</li>\n";}} // Walker_Nav_Menu/*** Displays a navigation menu.** @since 3.0.0** @param array $args {* Optional. Array of nav menu arguments.** @type string $menu Desired menu. Accepts (matching in order) id, slug, name. Default empty.* @type string $menu_class CSS class to use for the ul element which forms the menu. Default 'menu'.* @type string $menu_id The ID that is applied to the ul element which forms the menu.* Default is the menu slug, incremented.* @type string $container Whether to wrap the ul, and what to wrap it with. Default 'div'.* @type string $container_class Class that is applied to the container. Default 'menu-{menu slug}-container'.* @type string $container_id The ID that is applied to the container. Default empty.* @type callback|bool $fallback_cb If the menu doesn't exists, a callback function will fire.* Default is 'wp_page_menu'. Set to false for no fallback.* @type string $before Text before the link text. Default empty.* @type string $after Text after the link text. Default empty.* @type string $link_before Text before the link. Default empty.* @type string $link_after Text after the link. Default empty.* @type bool $echo Whether to echo the menu or return it. Default true.* @type int $depth How many levels of the hierarchy are to be included. 0 means all. Default 0.* @type object $walker Instance of a custom walker class. Default empty.* @type string $theme_location Theme location to be used. Must be registered with register_nav_menu()* in order to be selectable by the user.* @type string $items_wrap How the list items should be wrapped. Default is a ul with an id and class.* Uses printf() format with numbered placeholders.* }* @return mixed Menu output if $echo is false, false if there are no items or no menu was found.*/function wp_nav_menu( $args = array() ) {static $menu_id_slugs = array();$defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '','echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id="%1$s" class="%2$s">%3$s</ul>','depth' => 0, 'walker' => '', 'theme_location' => '' );$args = wp_parse_args( $args, $defaults );/*** Filter the arguments used to display a navigation menu.** @since 3.0.0** @see wp_nav_menu()** @param array $args Array of wp_nav_menu() arguments.*/$args = apply_filters( 'wp_nav_menu_args', $args );$args = (object) $args;/*** Filter whether to short-circuit the wp_nav_menu() output.** Returning a non-null value to the filter will short-circuit* wp_nav_menu(), echoing that value if $args->echo is true,* returning that value otherwise.** @since 3.9.0** @see wp_nav_menu()** @param string|null $output Nav menu output to short-circuit with. Default null.* @param object $args An object containing wp_nav_menu() arguments.*/$nav_menu = apply_filters( 'pre_wp_nav_menu', null, $args );if ( null !== $nav_menu ) {if ( $args->echo ) {echo $nav_menu;return;}return $nav_menu;}// Get the nav menu based on the requested menu$menu = wp_get_nav_menu_object( $args->menu );// Get the nav menu based on the theme_locationif ( ! $menu && $args->theme_location && ( $locations = get_nav_menu_locations() ) && isset( $locations[ $args->theme_location ] ) )$menu = wp_get_nav_menu_object( $locations[ $args->theme_location ] );// get the first menu that has items if we still can't find a menuif ( ! $menu && !$args->theme_location ) {$menus = wp_get_nav_menus( array( 'orderby' => 'name' ) );foreach ( $menus as $menu_maybe ) {if ( $menu_items = wp_get_nav_menu_items( $menu_maybe->term_id, array( 'update_post_term_cache' => false ) ) ) {$menu = $menu_maybe;break;}}}// If the menu exists, get its items.if ( $menu && ! is_wp_error($menu) && !isset($menu_items) )$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) );/** If no menu was found:* - Fall back (if one was specified), or bail.** If no menu items were found:* - Fall back, but only if no theme location was specified.* - Otherwise, bail.*/if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )&& $args->fallback_cb && is_callable( $args->fallback_cb ) )return call_user_func( $args->fallback_cb, (array) $args );if ( ! $menu || is_wp_error( $menu ) )return false;$nav_menu = $items = '';$show_container = false;if ( $args->container ) {/*** Filter the list of HTML tags that are valid for use as menu containers.** @since 3.0.0** @param array $tags The acceptable HTML tags for use as menu containers.* Default is array containing 'div' and 'nav'.*/$allowed_tags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'nav' ) );if ( in_array( $args->container, $allowed_tags ) ) {$show_container = true;$class = $args->container_class ? ' class="' . esc_attr( $args->container_class ) . '"' : ' class="menu-'. $menu->slug .'-container"';$id = $args->container_id ? ' id="' . esc_attr( $args->container_id ) . '"' : '';$nav_menu .= '<'. $args->container . $id . $class . '>';}}// Set up the $menu_item variables_wp_menu_item_classes_by_context( $menu_items );$sorted_menu_items = $menu_items_with_children = array();foreach ( (array) $menu_items as $menu_item ) {$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;if ( $menu_item->menu_item_parent )$menu_items_with_children[ $menu_item->menu_item_parent ] = true;}// Add the menu-item-has-children class where applicableif ( $menu_items_with_children ) {foreach ( $sorted_menu_items as &$menu_item ) {if ( isset( $menu_items_with_children[ $menu_item->ID ] ) )$menu_item->classes[] = 'menu-item-has-children';}}unset( $menu_items, $menu_item );/*** Filter the sorted list of menu item objects before generating the menu's HTML.** @since 3.1.0** @param array $sorted_menu_items The menu items, sorted by each menu item's menu order.* @param object $args An object containing wp_nav_menu() arguments.*/$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );$items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );unset($sorted_menu_items);// Attributesif ( ! empty( $args->menu_id ) ) {$wrap_id = $args->menu_id;} else {$wrap_id = 'menu-' . $menu->slug;while ( in_array( $wrap_id, $menu_id_slugs ) ) {if ( preg_match( '#-(\d+)$#', $wrap_id, $matches ) )$wrap_id = preg_replace('#-(\d+)$#', '-' . ++$matches[1], $wrap_id );else$wrap_id = $wrap_id . '-1';}}$menu_id_slugs[] = $wrap_id;$wrap_class = $args->menu_class ? $args->menu_class : '';/*** Filter the HTML list content for navigation menus.** @since 3.0.0** @see wp_nav_menu()** @param string $items The HTML list content for the menu items.* @param object $args An object containing wp_nav_menu() arguments.*/$items = apply_filters( 'wp_nav_menu_items', $items, $args );/*** Filter the HTML list content for a specific navigation menu.** @since 3.0.0** @see wp_nav_menu()** @param string $items The HTML list content for the menu items.* @param object $args An object containing wp_nav_menu() arguments.*/$items = apply_filters( "wp_nav_menu_{$menu->slug}_items", $items, $args );// Don't print any markup if there are no items at this point.if ( empty( $items ) )return false;$nav_menu .= sprintf( $args->items_wrap, esc_attr( $wrap_id ), esc_attr( $wrap_class ), $items );unset( $items );if ( $show_container )$nav_menu .= '</' . $args->container . '>';/*** Filter the HTML content for navigation menus.** @since 3.0.0** @see wp_nav_menu()** @param string $nav_menu The HTML content for the navigation menu.* @param object $args An object containing wp_nav_menu() arguments.*/$nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args );if ( $args->echo )echo $nav_menu;elsereturn $nav_menu;}/*** Add the class property classes for the current context, if applicable.** @access private* @since 3.0.0** @param array $menu_items The current menu item objects to which to add the class property information.*/function _wp_menu_item_classes_by_context( &$menu_items ) {global $wp_query, $wp_rewrite;$queried_object = $wp_query->get_queried_object();$queried_object_id = (int) $wp_query->queried_object_id;$active_object = '';$active_ancestor_item_ids = array();$active_parent_item_ids = array();$active_parent_object_ids = array();$possible_taxonomy_ancestors = array();$possible_object_parents = array();$home_page_id = (int) get_option( 'page_for_posts' );if ( $wp_query->is_singular && ! empty( $queried_object->post_type ) && ! is_post_type_hierarchical( $queried_object->post_type ) ) {foreach ( (array) get_object_taxonomies( $queried_object->post_type ) as $taxonomy ) {if ( is_taxonomy_hierarchical( $taxonomy ) ) {$term_hierarchy = _get_term_hierarchy( $taxonomy );$terms = wp_get_object_terms( $queried_object_id, $taxonomy, array( 'fields' => 'ids' ) );if ( is_array( $terms ) ) {$possible_object_parents = array_merge( $possible_object_parents, $terms );$term_to_ancestor = array();foreach ( (array) $term_hierarchy as $anc => $descs ) {foreach ( (array) $descs as $desc )$term_to_ancestor[ $desc ] = $anc;}foreach ( $terms as $desc ) {do {$possible_taxonomy_ancestors[ $taxonomy ][] = $desc;if ( isset( $term_to_ancestor[ $desc ] ) ) {$_desc = $term_to_ancestor[ $desc ];unset( $term_to_ancestor[ $desc ] );$desc = $_desc;} else {$desc = 0;}} while ( ! empty( $desc ) );}}}}} elseif ( ! empty( $queried_object->taxonomy ) && is_taxonomy_hierarchical( $queried_object->taxonomy ) ) {$term_hierarchy = _get_term_hierarchy( $queried_object->taxonomy );$term_to_ancestor = array();foreach ( (array) $term_hierarchy as $anc => $descs ) {foreach ( (array) $descs as $desc )$term_to_ancestor[ $desc ] = $anc;}$desc = $queried_object->term_id;do {$possible_taxonomy_ancestors[ $queried_object->taxonomy ][] = $desc;if ( isset( $term_to_ancestor[ $desc ] ) ) {$_desc = $term_to_ancestor[ $desc ];unset( $term_to_ancestor[ $desc ] );$desc = $_desc;} else {$desc = 0;}} while ( ! empty( $desc ) );}$possible_object_parents = array_filter( $possible_object_parents );$front_page_url = home_url();foreach ( (array) $menu_items as $key => $menu_item ) {$menu_items[$key]->current = false;$classes = (array) $menu_item->classes;$classes[] = 'menu-item';$classes[] = 'menu-item-type-' . $menu_item->type;$classes[] = 'menu-item-object-' . $menu_item->object;// if the menu item corresponds to a taxonomy term for the currently-queried non-hierarchical post objectif ( $wp_query->is_singular && 'taxonomy' == $menu_item->type && in_array( $menu_item->object_id, $possible_object_parents ) ) {$active_parent_object_ids[] = (int) $menu_item->object_id;$active_parent_item_ids[] = (int) $menu_item->db_id;$active_object = $queried_object->post_type;// if the menu item corresponds to the currently-queried post or taxonomy object} elseif ($menu_item->object_id == $queried_object_id &&(( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) ||( 'post_type' == $menu_item->type && $wp_query->is_singular ) ||( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) && $queried_object->taxonomy == $menu_item->object ))) {$classes[] = 'current-menu-item';$menu_items[$key]->current = true;$_anc_id = (int) $menu_item->db_id;while(( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&! in_array( $_anc_id, $active_ancestor_item_ids )) {$active_ancestor_item_ids[] = $_anc_id;}if ( 'post_type' == $menu_item->type && 'page' == $menu_item->object ) {// Back compat classes for pages to match wp_page_menu()$classes[] = 'page_item';$classes[] = 'page-item-' . $menu_item->object_id;$classes[] = 'current_page_item';}$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;$active_parent_object_ids[] = (int) $menu_item->post_parent;$active_object = $menu_item->object;// if the menu item corresponds to the currently-requested URL} elseif ( 'custom' == $menu_item->object ) {$_root_relative_current = untrailingslashit( $_SERVER['REQUEST_URI'] );$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_root_relative_current );$raw_item_url = strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url;$item_url = untrailingslashit( $raw_item_url );$_indexless_current = untrailingslashit( preg_replace( '/' . preg_quote( $wp_rewrite->index, '/' ) . '$/', '', $current_url ) );if ( $raw_item_url && in_array( $item_url, array( $current_url, $_indexless_current, $_root_relative_current ) ) ) {$classes[] = 'current-menu-item';$menu_items[$key]->current = true;$_anc_id = (int) $menu_item->db_id;while(( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&! in_array( $_anc_id, $active_ancestor_item_ids )) {$active_ancestor_item_ids[] = $_anc_id;}if ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ) ) ) {// Back compat for home link to match wp_page_menu()$classes[] = 'current_page_item';}$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;$active_parent_object_ids[] = (int) $menu_item->post_parent;$active_object = $menu_item->object;// give front page item current-menu-item class when extra query arguments involved} elseif ( $item_url == $front_page_url && is_front_page() ) {$classes[] = 'current-menu-item';}if ( untrailingslashit($item_url) == home_url() )$classes[] = 'menu-item-home';}// back-compat with wp_page_menu: add "current_page_parent" to static home page link for any non-page queryif ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id )$classes[] = 'current_page_parent';$menu_items[$key]->classes = array_unique( $classes );}$active_ancestor_item_ids = array_filter( array_unique( $active_ancestor_item_ids ) );$active_parent_item_ids = array_filter( array_unique( $active_parent_item_ids ) );$active_parent_object_ids = array_filter( array_unique( $active_parent_object_ids ) );// set parent's classforeach ( (array) $menu_items as $key => $parent_item ) {$classes = (array) $parent_item->classes;$menu_items[$key]->current_item_ancestor = false;$menu_items[$key]->current_item_parent = false;if (isset( $parent_item->type ) &&(// ancestral post object('post_type' == $parent_item->type &&! empty( $queried_object->post_type ) &&is_post_type_hierarchical( $queried_object->post_type ) &&in_array( $parent_item->object_id, $queried_object->ancestors ) &&$parent_item->object != $queried_object->ID) ||// ancestral term('taxonomy' == $parent_item->type &&isset( $possible_taxonomy_ancestors[ $parent_item->object ] ) &&in_array( $parent_item->object_id, $possible_taxonomy_ancestors[ $parent_item->object ] ) &&(! isset( $queried_object->term_id ) ||$parent_item->object_id != $queried_object->term_id)))) {$classes[] = empty( $queried_object->taxonomy ) ? 'current-' . $queried_object->post_type . '-ancestor' : 'current-' . $queried_object->taxonomy . '-ancestor';}if ( in_array( intval( $parent_item->db_id ), $active_ancestor_item_ids ) ) {$classes[] = 'current-menu-ancestor';$menu_items[$key]->current_item_ancestor = true;}if ( in_array( $parent_item->db_id, $active_parent_item_ids ) ) {$classes[] = 'current-menu-parent';$menu_items[$key]->current_item_parent = true;}if ( in_array( $parent_item->object_id, $active_parent_object_ids ) )$classes[] = 'current-' . $active_object . '-parent';if ( 'post_type' == $parent_item->type && 'page' == $parent_item->object ) {// Back compat classes for pages to match wp_page_menu()if ( in_array('current-menu-parent', $classes) )$classes[] = 'current_page_parent';if ( in_array('current-menu-ancestor', $classes) )$classes[] = 'current_page_ancestor';}$menu_items[$key]->classes = array_unique( $classes );}}/*** Retrieve the HTML list content for nav menu items.** @uses Walker_Nav_Menu to create HTML list content.* @since 3.0.0* @see Walker::walk() for parameters and return description.*/function walk_nav_menu_tree( $items, $depth, $r ) {$walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;$args = array( $items, $depth, $r );return call_user_func_array( array($walker, 'walk'), $args );}/*** Prevents a menu item ID from being used more than once.** @since 3.0.1* @access private*/function _nav_menu_item_id_use_once( $id, $item ) {static $_used_ids = array();if ( in_array( $item->ID, $_used_ids ) )return '';$_used_ids[] = $item->ID;return $id;}add_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 );
WordPressを読む 69 /blog/wp-includes/nav-menu.php
2014/12/04 Wordpress
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895<?php/*** 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] );if ( empty( $_wp_registered_nav_menus ) ) {_remove_theme_support( 'menus' );}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() {$locations = get_theme_mod( 'nav_menu_locations' );return ( is_array( $locations ) ) ? $locations : array();}/*** 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 ) {global $_wp_registered_nav_menus;if ( ! isset( $_wp_registered_nav_menus[ $location ] ) ) {return false;}$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 int|WP_Error Menu ID on success, WP_Error object 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 Menu ID, slug, or name.* @return bool|WP_Error True on success, false or WP_Error object 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' );// Remove this menu from any locations.$locations = get_nav_menu_locations();foreach ( $locations as $location => $menu_id ) {if ( $menu_id == $menu->term_id )$locations[ $location ] = 0;}set_theme_mod( 'nav_menu_locations', $locations );if ( $result && !is_wp_error($result) )/*** Fires after a navigation menu has been successfully deleted.** @since 3.0.0** @param int $term_id ID of the deleted menu.*/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|WP_Error Menu ID on success, WP_Error object on failure.*/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 <strong>%s</strong> conflicts with another menu name. Please try another.'), esc_html( $menu_data['menu-name'] ) ) );// menu doesn't already exist, so create a new menuif ( ! $_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 <strong>%s</strong> 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;/*** Fires after a navigation menu is successfully created.** @since 3.0.0** @param int $term_id ID of the new menu.* @param array $menu_data An array of menu data.*/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;/*** Fires after a navigation menu has been successfully updated.** @since 3.0.0** @param int $menu_id ID of the updated menu.* @param array $menu_data An array of menu data.*/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|WP_Error 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 objectsif ( ! 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 ) {return new WP_Error( 'invalid_menu_id', __( 'Invalid menu ID.' ) );}if ( 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 ( $args['menu-item-title'] == $original_title )$args['menu-item-title'] = '';// hack to get wp to create a post object when too many properties are emptyif ( '' == $args['menu-item-title'] && '' == $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;// New menu item. Default is draft statusif ( ! $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;}// Associate the menu item with the menu term// 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 ) ) ) {wp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' );}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 statusif ( $update ) {$post['ID'] = $menu_item_db_id;$post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish';wp_update_post( $post );}/*** Fires after a navigation menu item has been updated.** @since 3.0.0** @see wp_update_nav_menu_items()** @param int $menu_id ID of the updated menu.* @param int $menu_item_db_id ID of the updated menu item.* @param array $args An array of arguments used to update a menu item.*/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 );/*** Filter the navigation menu objects being returned.** @since 3.0.0** @see get_terms()** @param array $menus An array of menu objects.* @param array $args An array of arguments used to retrieve menu objects.*/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;elsereturn 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() ) {$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 );$args['include'] = $items;$items = get_posts( $args );if ( is_wp_error( $items ) || ! is_array( $items ) )return false;// Get all posts and terms at once to prime the cachesif ( 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++;}}/*** Filter the navigation menu items being returned.** @since 3.0.0** @param array $items An array of menu item post objects.* @param object $menu The menu object.* @param array $args An array of arguments used to retrieve menu item objects.*/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;/*** Filter a navigation menu item's title attribute.** @since 3.0.0** @param string $item_title The menu item title attribute.*/$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 ) ) {/*** Filter a navigation menu item's description.** @since 3.0.0** @param string $description The 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;if ( '' === $menu_item->post_title )$menu_item->post_title = sprintf( __( '#%d (no title)' ), $menu_item->ID );$menu_item->title = $menu_item->post_title;$menu_item->url = get_permalink( $menu_item->ID );$menu_item->target = '';/** This filter is documented in wp-includes/nav-menu.php */$menu_item->attr_title = apply_filters( 'nav_menu_attr_title', '' );/** This filter is documented in wp-includes/nav-menu.php */$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 = '';}/*** Filter a navigation menu item object.** @since 3.0.0** @param object $menu_item The menu item object.*/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."* @param string $taxonomy If $object_type is "taxonomy", $taxonomy is the name of the tax that $object_id belongs to* @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', $taxonomy = '' ) {$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 ) ) {$menu_item_type = get_post_meta( $menu_item->ID, '_menu_item_type', true );if ('post_type' == $object_type &&'post_type' == $menu_item_type) {$menu_item_ids[] = (int) $menu_item->ID;} else if ('taxonomy' == $object_type &&'taxonomy' == $menu_item_type &&get_post_meta( $menu_item->ID, '_menu_item_object', true ) == $taxonomy) {$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, $tt_id, $taxonomy ) {$object_id = (int) $object_id;$menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy', $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 );}}