function fa_get_wpsmiliestrans() { global $wpsmiliestrans; $wpsmilies = array_unique($wpsmiliestrans); foreach ($wpsmilies as $alt => $src_path) { $emoji = str_replace(array('&#x', ';'), '', wp_encode_emoji($src_path)); $output .= '<a class="add-smily" data-smilies="' . $alt . '"><img class="wp-smiley" src="' . get_bloginfo('template_directory') . '/72x72/' . $emoji . 'png" /></a>'; } return $output; }
/** * Insert or update a post. * * If the $postarr parameter has 'ID' set to a value, then post will be updated. * * You can set the post date manually, by setting the values for 'post_date' * and 'post_date_gmt' keys. You can close the comments or open the comments by * setting the value for 'comment_status' key. * * @since 1.0.0 * @since 4.2.0 Support was added for encoding emoji in the post title, content, and excerpt. * @since 4.4.0 A 'meta_input' array can now be passed to `$postarr` to add post meta data. * * @see sanitize_post() * @global wpdb $wpdb WordPress database abstraction object. * * @param array $postarr { * An array of elements that make up a post to update or insert. * * @type int $ID The post ID. If equal to something other than 0, * the post with that ID will be updated. Default 0. * @type int $post_author The ID of the user who added the post. Default is * the current user ID. * @type string $post_date The date of the post. Default is the current time. * @type string $post_date_gmt The date of the post in the GMT timezone. Default is * the value of `$post_date`. * @type mixed $post_content The post content. Default empty. * @type string $post_content_filtered The filtered post content. Default empty. * @type string $post_title The post title. Default empty. * @type string $post_excerpt The post excerpt. Default empty. * @type string $post_status The post status. Default 'draft'. * @type string $post_type The post type. Default 'post'. * @type string $comment_status Whether the post can accept comments. Accepts 'open' or 'closed'. * Default is the value of 'default_comment_status' option. * @type string $ping_status Whether the post can accept pings. Accepts 'open' or 'closed'. * Default is the value of 'default_ping_status' option. * @type string $post_password The password to access the post. Default empty. * @type string $post_name The post name. Default is the sanitized post title. * @type string $to_ping Space or carriage return-separated list of URLs to ping. * Default empty. * @type string $pinged Space or carriage return-separated list of URLs that have * been pinged. Default empty. * @type string $post_modified The date when the post was last modified. Default is * the current time. * @type string $post_modified_gmt The date when the post was last modified in the GMT * timezone. Default is the current time. * @type int $post_parent Set this for the post it belongs to, if any. Default 0. * @type int $menu_order The order the post should be displayed in. Default 0. * @type string $post_mime_type The mime type of the post. Default empty. * @type string $guid Global Unique ID for referencing the post. Default empty. * @type array $tax_input Array of taxonomy terms keyed by their taxonomy name. Default empty. * @type array $meta_input Array of post meta values keyed by their post meta key. Default empty. * } * @param bool $wp_error Optional. Whether to allow return of WP_Error on failure. Default false. * @return int|WP_Error The post ID on success. The value 0 or WP_Error on failure. */ function wp_insert_post($postarr, $wp_error = false) { global $wpdb; $user_id = get_current_user_id(); $defaults = array('post_author' => $user_id, 'post_content' => '', 'post_content_filtered' => '', 'post_title' => '', 'post_excerpt' => '', 'post_status' => 'draft', 'post_type' => 'post', 'comment_status' => '', 'ping_status' => '', 'post_password' => '', 'to_ping' => '', 'pinged' => '', 'post_parent' => 0, 'menu_order' => 0, 'guid' => '', 'import_id' => 0, 'context' => ''); $postarr = wp_parse_args($postarr, $defaults); unset($postarr['filter']); $postarr = sanitize_post($postarr, 'db'); // Are we updating or creating? $post_ID = 0; $update = false; $guid = $postarr['guid']; if (!empty($postarr['ID'])) { $update = true; // Get the post ID and GUID. $post_ID = $postarr['ID']; $post_before = get_post($post_ID); if (is_null($post_before)) { if ($wp_error) { return new WP_Error('invalid_post', __('Invalid post ID.')); } return 0; } $guid = get_post_field('guid', $post_ID); $previous_status = get_post_field('post_status', $post_ID); } else { $previous_status = 'new'; } $post_type = empty($postarr['post_type']) ? 'post' : $postarr['post_type']; $post_title = $postarr['post_title']; $post_content = $postarr['post_content']; $post_excerpt = $postarr['post_excerpt']; if (isset($postarr['post_name'])) { $post_name = $postarr['post_name']; } $maybe_empty = 'attachment' !== $post_type && !$post_content && !$post_title && !$post_excerpt && post_type_supports($post_type, 'editor') && post_type_supports($post_type, 'title') && post_type_supports($post_type, 'excerpt'); /** * Filter whether the post should be considered "empty". * * The post is considered "empty" if both: * 1. The post type supports the title, editor, and excerpt fields * 2. The title, editor, and excerpt fields are all empty * * Returning a truthy value to the filter will effectively short-circuit * the new post being inserted, returning 0. If $wp_error is true, a WP_Error * will be returned instead. * * @since 3.3.0 * * @param bool $maybe_empty Whether the post should be considered "empty". * @param array $postarr Array of post data. */ if (apply_filters('wp_insert_post_empty_content', $maybe_empty, $postarr)) { if ($wp_error) { return new WP_Error('empty_content', __('Content, title, and excerpt are empty.')); } else { return 0; } } $post_status = empty($postarr['post_status']) ? 'draft' : $postarr['post_status']; if ('attachment' === $post_type && !in_array($post_status, array('inherit', 'private', 'trash'))) { $post_status = 'inherit'; } if (!empty($postarr['post_category'])) { // Filter out empty terms. $post_category = array_filter($postarr['post_category']); } // Make sure we set a valid category. if (empty($post_category) || 0 == count($post_category) || !is_array($post_category)) { // 'post' requires at least one category. if ('post' == $post_type && 'auto-draft' != $post_status) { $post_category = array(get_option('default_category')); } else { $post_category = array(); } } // Don't allow contributors to set the post slug for pending review posts. if ('pending' == $post_status && !current_user_can('publish_posts')) { $post_name = ''; } /* * Create a valid post name. Drafts and pending posts are allowed to have * an empty post name. */ if (empty($post_name)) { if (!in_array($post_status, array('draft', 'pending', 'auto-draft'))) { $post_name = sanitize_title($post_title); } else { $post_name = ''; } } else { // On updates, we need to check to see if it's using the old, fixed sanitization context. $check_name = sanitize_title($post_name, '', 'old-save'); if ($update && strtolower(urlencode($post_name)) == $check_name && get_post_field('post_name', $post_ID) == $check_name) { $post_name = $check_name; } else { // new post, or slug has changed. $post_name = sanitize_title($post_name); } } /* * If the post date is empty (due to having been new or a draft) and status * is not 'draft' or 'pending', set date to now. */ if (empty($postarr['post_date']) || '0000-00-00 00:00:00' == $postarr['post_date']) { if (empty($postarr['post_date_gmt']) || '0000-00-00 00:00:00' == $postarr['post_date_gmt']) { $post_date = current_time('mysql'); } else { $post_date = get_date_from_gmt($postarr['post_date_gmt']); } } else { $post_date = $postarr['post_date']; } // Validate the date. $mm = substr($post_date, 5, 2); $jj = substr($post_date, 8, 2); $aa = substr($post_date, 0, 4); $valid_date = wp_checkdate($mm, $jj, $aa, $post_date); if (!$valid_date) { if ($wp_error) { return new WP_Error('invalid_date', __('Whoops, the provided date is invalid.')); } else { return 0; } } if (empty($postarr['post_date_gmt']) || '0000-00-00 00:00:00' == $postarr['post_date_gmt']) { if (!in_array($post_status, array('draft', 'pending', 'auto-draft'))) { $post_date_gmt = get_gmt_from_date($post_date); } else { $post_date_gmt = '0000-00-00 00:00:00'; } } else { $post_date_gmt = $postarr['post_date_gmt']; } if ($update || '0000-00-00 00:00:00' == $post_date) { $post_modified = current_time('mysql'); $post_modified_gmt = current_time('mysql', 1); } else { $post_modified = $post_date; $post_modified_gmt = $post_date_gmt; } if ('attachment' !== $post_type) { if ('publish' == $post_status) { $now = gmdate('Y-m-d H:i:59'); if (mysql2date('U', $post_date_gmt, false) > mysql2date('U', $now, false)) { $post_status = 'future'; } } elseif ('future' == $post_status) { $now = gmdate('Y-m-d H:i:59'); if (mysql2date('U', $post_date_gmt, false) <= mysql2date('U', $now, false)) { $post_status = 'publish'; } } } // Comment status. if (empty($postarr['comment_status'])) { if ($update) { $comment_status = 'closed'; } else { $comment_status = get_default_comment_status($post_type); } } else { $comment_status = $postarr['comment_status']; } // These variables are needed by compact() later. $post_content_filtered = $postarr['post_content_filtered']; $post_author = isset($postarr['post_author']) ? $postarr['post_author'] : $user_id; $ping_status = empty($postarr['ping_status']) ? get_default_comment_status($post_type, 'pingback') : $postarr['ping_status']; $to_ping = isset($postarr['to_ping']) ? sanitize_trackback_urls($postarr['to_ping']) : ''; $pinged = isset($postarr['pinged']) ? $postarr['pinged'] : ''; $import_id = isset($postarr['import_id']) ? $postarr['import_id'] : 0; /* * The 'wp_insert_post_parent' filter expects all variables to be present. * Previously, these variables would have already been extracted */ if (isset($postarr['menu_order'])) { $menu_order = (int) $postarr['menu_order']; } else { $menu_order = 0; } $post_password = isset($postarr['post_password']) ? $postarr['post_password'] : ''; if ('private' == $post_status) { $post_password = ''; } if (isset($postarr['post_parent'])) { $post_parent = (int) $postarr['post_parent']; } else { $post_parent = 0; } /** * Filter the post parent -- used to check for and prevent hierarchy loops. * * @since 3.1.0 * * @param int $post_parent Post parent ID. * @param int $post_ID Post ID. * @param array $new_postarr Array of parsed post data. * @param array $postarr Array of sanitized, but otherwise unmodified post data. */ $post_parent = apply_filters('wp_insert_post_parent', $post_parent, $post_ID, compact(array_keys($postarr)), $postarr); $post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent); // Don't unslash. $post_mime_type = isset($postarr['post_mime_type']) ? $postarr['post_mime_type'] : ''; // Expected_slashed (everything!). $data = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid'); $emoji_fields = array('post_title', 'post_content', 'post_excerpt'); foreach ($emoji_fields as $emoji_field) { if (isset($data[$emoji_field])) { $charset = $wpdb->get_col_charset($wpdb->posts, $emoji_field); if ('utf8' === $charset) { $data[$emoji_field] = wp_encode_emoji($data[$emoji_field]); } } } if ('attachment' === $post_type) { /** * Filter attachment post data before it is updated in or added to the database. * * @since 3.9.0 * * @param array $data An array of sanitized attachment post data. * @param array $postarr An array of unsanitized attachment post data. */ $data = apply_filters('wp_insert_attachment_data', $data, $postarr); } else { /** * Filter slashed post data just before it is inserted into the database. * * @since 2.7.0 * * @param array $data An array of slashed post data. * @param array $postarr An array of sanitized, but otherwise unmodified post data. */ $data = apply_filters('wp_insert_post_data', $data, $postarr); } $data = wp_unslash($data); $where = array('ID' => $post_ID); if ($update) { /** * Fires immediately before an existing post is updated in the database. * * @since 2.5.0 * * @param int $post_ID Post ID. * @param array $data Array of unslashed post data. */ do_action('pre_post_update', $post_ID, $data); if (false === $wpdb->update($wpdb->posts, $data, $where)) { if ($wp_error) { return new WP_Error('db_update_error', __('Could not update post in the database'), $wpdb->last_error); } else { return 0; } } } else { // If there is a suggested ID, use it if not already present. if (!empty($import_id)) { $import_id = (int) $import_id; if (!$wpdb->get_var($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE ID = %d", $import_id))) { $data['ID'] = $import_id; } } if (false === $wpdb->insert($wpdb->posts, $data)) { if ($wp_error) { return new WP_Error('db_insert_error', __('Could not insert post into the database'), $wpdb->last_error); } else { return 0; } } $post_ID = (int) $wpdb->insert_id; // Use the newly generated $post_ID. $where = array('ID' => $post_ID); } if (empty($data['post_name']) && !in_array($data['post_status'], array('draft', 'pending', 'auto-draft'))) { $data['post_name'] = wp_unique_post_slug(sanitize_title($data['post_title'], $post_ID), $post_ID, $data['post_status'], $post_type, $post_parent); $wpdb->update($wpdb->posts, array('post_name' => $data['post_name']), $where); clean_post_cache($post_ID); } if (is_object_in_taxonomy($post_type, 'category')) { wp_set_post_categories($post_ID, $post_category); } if (isset($postarr['tags_input']) && is_object_in_taxonomy($post_type, 'post_tag')) { wp_set_post_tags($post_ID, $postarr['tags_input']); } // New-style support for all custom taxonomies. if (!empty($postarr['tax_input'])) { foreach ($postarr['tax_input'] as $taxonomy => $tags) { $taxonomy_obj = get_taxonomy($taxonomy); if (!$taxonomy_obj) { /* translators: %s: taxonomy name */ _doing_it_wrong(__FUNCTION__, sprintf(__('Invalid taxonomy: %s.'), $taxonomy), '4.4.0'); continue; } // array = hierarchical, string = non-hierarchical. if (is_array($tags)) { $tags = array_filter($tags); } if (current_user_can($taxonomy_obj->cap->assign_terms)) { wp_set_post_terms($post_ID, $tags, $taxonomy); } } } if (!empty($postarr['meta_input'])) { foreach ($postarr['meta_input'] as $field => $value) { update_post_meta($post_ID, $field, $value); } } $current_guid = get_post_field('guid', $post_ID); // Set GUID. if (!$update && '' == $current_guid) { $wpdb->update($wpdb->posts, array('guid' => get_permalink($post_ID)), $where); } if ('attachment' === $postarr['post_type']) { if (!empty($postarr['file'])) { update_attached_file($post_ID, $postarr['file']); } if (!empty($postarr['context'])) { add_post_meta($post_ID, '_wp_attachment_context', $postarr['context'], true); } } clean_post_cache($post_ID); $post = get_post($post_ID); if (!empty($postarr['page_template']) && 'page' == $data['post_type']) { $post->page_template = $postarr['page_template']; $page_templates = wp_get_theme()->get_page_templates($post); if ('default' != $postarr['page_template'] && !isset($page_templates[$postarr['page_template']])) { if ($wp_error) { return new WP_Error('invalid_page_template', __('The page template is invalid.')); } update_post_meta($post_ID, '_wp_page_template', 'default'); } else { update_post_meta($post_ID, '_wp_page_template', $postarr['page_template']); } } if ('attachment' !== $postarr['post_type']) { wp_transition_post_status($data['post_status'], $previous_status, $post); } else { if ($update) { /** * Fires once an existing attachment has been updated. * * @since 2.0.0 * * @param int $post_ID Attachment ID. */ do_action('edit_attachment', $post_ID); $post_after = get_post($post_ID); /** * Fires once an existing attachment has been updated. * * @since 4.4.0 * * @param int $post_ID Post ID. * @param WP_Post $post_after Post object following the update. * @param WP_Post $post_before Post object before the update. */ do_action('attachment_updated', $post_ID, $post_after, $post_before); } else { /** * Fires once an attachment has been added. * * @since 2.0.0 * * @param int $post_ID Attachment ID. */ do_action('add_attachment', $post_ID); } return $post_ID; } if ($update) { /** * Fires once an existing post has been updated. * * @since 1.2.0 * * @param int $post_ID Post ID. * @param WP_Post $post Post object. */ do_action('edit_post', $post_ID, $post); $post_after = get_post($post_ID); /** * Fires once an existing post has been updated. * * @since 3.0.0 * * @param int $post_ID Post ID. * @param WP_Post $post_after Post object following the update. * @param WP_Post $post_before Post object before the update. */ do_action('post_updated', $post_ID, $post_after, $post_before); } /** * Fires once a post has been saved. * * The dynamic portion of the hook name, `$post->post_type`, refers to * the post type slug. * * @since 3.7.0 * * @param int $post_ID Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated or not. */ do_action("save_post_{$post->post_type}", $post_ID, $post, $update); /** * Fires once a post has been saved. * * @since 1.5.0 * * @param int $post_ID Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated or not. */ do_action('save_post', $post_ID, $post, $update); /** * Fires once a post has been saved. * * @since 2.0.0 * * @param int $post_ID Post ID. * @param WP_Post $post Post object. * @param bool $update Whether this is an existing post being updated or not. */ do_action('wp_insert_post', $post_ID, $post, $update); return $post_ID; }
public function check_post_header($post_id = true, &$obj = false) { if (empty($this->p->options['plugin_check_head'])) { return $post_id; } if (!is_object($obj) && ($obj = $this->p->util->get_post_object($post_id)) === false) { return $post_id; } // only check publicly available posts if (!isset($obj->post_status) || $obj->post_status !== 'publish') { return $post_id; } // only check registered front-end post types (to avoid menu items, product variations, etc.) $ptns = $this->p->util->get_post_types('names'); if (empty($obj->post_type) || !in_array($obj->post_type, $ptns)) { return $post_id; } $charset = get_bloginfo('charset'); $permalink = get_permalink($post_id); $permalink_html = wp_encode_emoji(htmlentities(urldecode($permalink), ENT_QUOTES, $charset, false)); // double_encode = false $permalink_no_meta = add_query_arg(array('NGFB_META_TAGS_DISABLE' => 1), $permalink); $check_opts = apply_filters($this->p->cf['lca'] . '_check_head_meta_options', SucomUtil::preg_grep_keys('/^add_/', $this->p->options, false, ''), $post_id); if (current_user_can('manage_options')) { $notice_suffix = ' (' . sprintf(__('see <a href="%s">Theme Integration</a> settings', 'nextgen-facebook'), $this->p->util->get_admin_url('advanced#sucom-tabset_plugin-tab_integration')) . ')...'; } else { $notice_suffix = '...'; } $this->p->notice->inf(sprintf(__('Checking %1$s webpage header for duplicate meta tags', 'nextgen-facebook'), '<a href="' . $permalink . '">' . $permalink_html . '</a>') . $notice_suffix, true); // use the permalink and have get_head_meta() remove our own meta tags // to avoid issues with caching plugins that ignore query arguments if (($metas = $this->p->util->get_head_meta($permalink, '/html/head/link|/html/head/meta', true)) !== false) { foreach (array('link' => array('rel'), 'meta' => array('name', 'itemprop', 'property')) as $tag => $types) { if (isset($metas[$tag])) { foreach ($metas[$tag] as $m) { foreach ($types as $t) { if (isset($m[$t]) && $m[$t] !== 'generator' && !empty($check_opts[$tag . '_' . $t . '_' . $m[$t]])) { $this->p->notice->err('Possible conflict detected — your theme or another plugin is adding a <code>' . $tag . ' ' . $t . '="' . $m[$t] . '"</code> HTML tag to the head section of this webpage.', true); } } } } } } return $post_id; }
/** * Convert emoji to a static img element. * * @since 4.2.0 * * @param string $text The content to encode. * @return string The encoded content. */ function wp_staticize_emoji($text) { $text = wp_encode_emoji($text); /** This filter is documented in wp-includes/formatting.php */ $cdn_url = apply_filters('emoji_url', set_url_scheme('//s.w.org/images/core/emoji/72x72/')); /** This filter is documented in wp-includes/formatting.php */ $ext = apply_filters('emoji_ext', '.png'); $output = ''; /* * HTML loop taken from smiley function, which was taken from texturize function. * It'll never be consolidated. * * First, capture the tags as well as in between. */ $textarr = preg_split('/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE); $stop = count($textarr); // Ignore processing of specific tags. $tags_to_ignore = 'code|pre|style|script|textarea'; $ignore_block_element = ''; for ($i = 0; $i < $stop; $i++) { $content = $textarr[$i]; // If we're in an ignore block, wait until we find its closing tag. if ('' == $ignore_block_element && preg_match('/^<(' . $tags_to_ignore . ')>/', $content, $matches)) { $ignore_block_element = $matches[1]; } // If it's not a tag and not in ignore block. if ('' == $ignore_block_element && strlen($content) > 0 && '<' != $content[0]) { $matches = array(); if (preg_match_all('/(DZ(e[6-9a-f]|f[0-9a-f]);){2}/', $content, $matches)) { if (!empty($matches[0])) { foreach ($matches[0] as $flag) { $chars = str_replace(array('&#x', ';'), '', $flag); list($char1, $char2) = str_split($chars, 5); $entity = sprintf('<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', $cdn_url . $char1 . '-' . $char2 . $ext, html_entity_decode($flag)); $content = str_replace($flag, $entity, $content); } } } // Loosely match the Emoji Unicode range. $regex = '/(&#x[2-3][0-9a-f]{3};|[1-6][0-9a-f]{2};)/'; $matches = array(); if (preg_match_all($regex, $content, $matches)) { if (!empty($matches[1])) { foreach ($matches[1] as $emoji) { $char = str_replace(array('&#x', ';'), '', $emoji); $entity = sprintf('<img src="%s" alt="%s" class="wp-smiley" style="height: 1em; max-height: 1em;" />', $cdn_url . $char . $ext, html_entity_decode($emoji)); $content = str_replace($emoji, $entity, $content); } } } } // Did we exit ignore block. if ('' != $ignore_block_element && '</' . $ignore_block_element . '>' == $content) { $ignore_block_element = ''; } $output .= $content; } return $output; }
/** * Generates the content tokens and puts them into the tokens array * * @param object $the_post the post object * @param array $tokens tokens array * * @return int keywords count */ private function tokenizeContent($the_post, &$tokens) { $args = $this->args; $content = $the_post->post_content; if ($args['extract_shortcodes']) { // WP Table Reloaded support if (defined('WP_TABLE_RELOADED_ABSPATH')) { include_once WP_TABLE_RELOADED_ABSPATH . 'controllers/controller-frontend.php'; $wpt_reloaded = new WP_Table_Reloaded_Controller_Frontend(); } // TablePress support if (defined('TABLEPRESS_ABSPATH')) { $tp_controller = TablePress::load_controller('frontend'); $tp_controller->init_shortcodes(); } // Remove user defined shortcodes $shortcodes = explode(',', $args['exclude_shortcodes']); foreach ($shortcodes as $shortcode) { remove_shortcode(trim($shortcode)); add_shortcode(trim($shortcode), array($this, 'return_empty_string')); } // Remove some shortcodes remove_shortcode('wpdreams_ajaxsearchpro'); add_shortcode('wpdreams_ajaxsearchpro', array($this, 'return_empty_string')); remove_shortcode('wpdreams_ajaxsearchpro_results'); add_shortcode('wpdreams_ajaxsearchpro_results', array($this, 'return_empty_string')); remove_shortcode('wpdreams_asp_settings'); add_shortcode('wpdreams_asp_settings', array($this, 'return_empty_string')); remove_shortcode('contact-form'); add_shortcode('contact-form', array($this, 'return_empty_string')); remove_shortcode('starrater'); add_shortcode('starrater', array($this, 'return_empty_string')); remove_shortcode('responsive-flipbook'); add_shortcode('responsive-flipbook', array($this, 'return_empty_string')); remove_shortcode('avatar_upload'); add_shortcode('avatar_upload', array($this, 'return_empty_string')); remove_shortcode('product_categories'); add_shortcode('product_categories', array($this, 'return_empty_string')); remove_shortcode('recent_products'); add_shortcode('recent_products', array($this, 'return_empty_string')); $content = do_shortcode($content); // WP 4.2 emoji strip if (function_exists('wp_encode_emoji')) { $content = wp_encode_emoji($content); } if (defined('TABLEPRESS_ABSPATH')) { unset($tp_controller); } if (defined('WP_TABLE_RELOADED_ABSPATH')) { unset($wpt_reloaded); } } // Strip the remaining shortcodes $content = strip_shortcodes($content); $content = preg_replace('/<[a-zA-Z\\/][^>]*>/', ' ', $content); $content = strip_tags($content); $filtered_content = apply_filters('asp_post_content_before_tokenize', $content); if ($filtered_content == "") { return 0; } $content_keywords = $this->tokenize($filtered_content); foreach ($content_keywords as $keyword) { $this->insertToken($tokens, $keyword[0], $keyword[1], 'content'); } return count($content_keywords); }
function relevanssi_search($args) { global $wpdb, $relevanssi_variables; $relevanssi_table = $relevanssi_variables['relevanssi_table']; $filtered_args = apply_filters('relevanssi_search_filters', $args); extract($filtered_args); $hits = array(); $query_restrictions = ""; if (!isset($tax_query_relation)) { $tax_query_relation = "or"; } $tax_query_relation = strtolower($tax_query_relation); $term_tax_id = array(); $term_tax_ids = array(); $not_term_tax_ids = array(); $and_term_tax_ids = array(); if (is_array($tax_query)) { foreach ($tax_query as $row) { if ($row['field'] == 'slug') { $slug = $row['terms']; $numeric_slugs = array(); $slug_in = null; if (is_array($slug)) { $slugs = array(); $term_id = array(); foreach ($slug as $t_slug) { $term = get_term_by('slug', $t_slug, $row['taxonomy']); if (!$term && is_numeric($t_slug)) { $numeric_slugs[] = "'{$t_slug}'"; } else { $t_slug = sanitize_title($t_slug); $term_id[] = $term->term_id; $slugs[] = "'{$t_slug}'"; } } if (!empty($slugs)) { $slug_in = implode(',', $slugs); } } else { $term = get_term_by('slug', $slug, $row['taxonomy']); if (!$term && is_numeric($slug)) { $numeric_slugs[] = $slug; } else { $term_id = $term->term_id; $slug_in = "'{$slug}'"; } } if (!empty($slug_in)) { $row_taxonomy = sanitize_text_field($row['taxonomy']); $tt_q = "SELECT tt.term_taxonomy_id\n\t\t\t\t\t\t \tFROM {$wpdb->term_taxonomy} AS tt\n\t\t\t\t\t\t \tLEFT JOIN {$wpdb->terms} AS t ON (tt.term_id=t.term_id)\n\t\t\t\t\t\t \tWHERE tt.taxonomy = '{$row_taxonomy}' AND t.slug IN ({$slug_in})"; // Clean: $row_taxonomy is sanitized, each slug in $slug_in is sanitized $term_tax_id = $wpdb->get_col($tt_q); } if (!empty($numeric_slugs)) { $row['field'] = 'id'; } } if ($row['field'] == 'id' || $row['field'] == 'term_id') { $id = $row['terms']; $term_id = $id; if (is_array($id)) { $numeric_values = array(); foreach ($id as $t_id) { if (is_numeric($t_id)) { $numeric_values[] = $t_id; } } $id = implode(',', $numeric_values); } $row_taxonomy = sanitize_text_field($row['taxonomy']); $tt_q = "SELECT tt.term_taxonomy_id\n\t\t\t\t \tFROM {$wpdb->term_taxonomy} AS tt\n\t\t\t\t \tLEFT JOIN {$wpdb->terms} AS t ON (tt.term_id=t.term_id)\n\t\t\t\t \tWHERE tt.taxonomy = '{$row_taxonomy}' AND t.term_id IN ({$id})"; // Clean: $row_taxonomy is sanitized, $id is checked to be numeric $id_term_tax_id = $wpdb->get_col($tt_q); if (!empty($term_tax_id) && is_array($term_tax_id)) { $term_tax_id = array_unique(array_merge($term_tax_id, $id_term_tax_id)); } else { $term_tax_id = $id_term_tax_id; } } if (!isset($row['include_children']) || $row['include_children'] == true) { if (!is_array($term_id)) { $term_id = array($term_id); } foreach ($term_id as $t_id) { $kids = get_term_children($t_id, $row['taxonomy']); foreach ($kids as $kid) { $term = get_term_by('id', $kid, $row['taxonomy']); $term_tax_id[] = relevanssi_get_term_tax_id('id', $kid, $row['taxonomy']); } } } $term_tax_id = array_unique($term_tax_id); if (!empty($term_tax_id)) { $n = count($term_tax_id); $term_tax_id = implode(',', $term_tax_id); $tq_operator = 'IN'; if (isset($row['operator'])) { $tq_operator = strtoupper($row['operator']); } if ($tq_operator != 'IN' && $tq_operator != 'NOT IN' && $tq_operator != 'AND') { $tq_operator = 'IN'; } if ($tax_query_relation == 'and') { if ($tq_operator == 'AND') { $query_restrictions .= " AND relevanssi.doc IN (\n\t\t\t\t\t\t\tSELECT ID FROM {$wpdb->posts} WHERE 1=1 \n\t\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\t\tSELECT COUNT(1) \n\t\t\t\t\t\t\t\tFROM {$wpdb->term_relationships} AS tr\n\t\t\t\t\t\t\t\tWHERE tr.term_taxonomy_id IN ({$term_tax_id}) \n\t\t\t\t\t\t\t\tAND tr.object_id = {$wpdb->posts}.ID ) = {$n}\n\t\t\t\t\t\t\t)"; // Clean: $term_tax_id and $n are Relevanssi-generated } else { $query_restrictions .= " AND relevanssi.doc {$tq_operator} (SELECT DISTINCT(tr.object_id) FROM {$wpdb->term_relationships} AS tr\n\t\t\t\t\t\tWHERE tr.term_taxonomy_id IN ({$term_tax_id}))"; // Clean: all variables are Relevanssi-generated } } else { if ($tq_operator == 'IN') { $term_tax_ids[] = $term_tax_id; } if ($tq_operator == 'NOT IN') { $not_term_tax_ids[] = $term_tax_id; } if ($tq_operator == 'AND') { $and_term_tax_ids[] = $term_tax_id; } } } else { global $wp_query; $wp_query->is_category = false; } } if ($tax_query_relation == 'or') { $term_tax_ids = array_unique($term_tax_ids); if (count($term_tax_ids) > 0) { $term_tax_ids = implode(',', $term_tax_ids); $query_restrictions .= " AND relevanssi.doc IN (SELECT DISTINCT(tr.object_id) FROM {$wpdb->term_relationships} AS tr\n\t\t\t \tWHERE tr.term_taxonomy_id IN ({$term_tax_ids}))"; // Clean: all variables are Relevanssi-generated } if (count($not_term_tax_ids) > 0) { $not_term_tax_ids = implode(',', $not_term_tax_ids); $query_restrictions .= " AND relevanssi.doc NOT IN (SELECT DISTINCT(tr.object_id) FROM {$wpdb->term_relationships} AS tr\n\t\t\t \tWHERE tr.term_taxonomy_id IN ({$not_term_tax_ids}))"; // Clean: all variables are Relevanssi-generated } if (count($and_term_tax_ids) > 0) { $and_term_tax_ids = implode(',', $and_term_tax_ids); $n = count(explode(',', $and_term_tax_ids)); $query_restrictions .= " AND relevanssi.doc IN (\n\t\t\t\t\tSELECT ID FROM {$wpdb->posts} WHERE 1=1 \n\t\t\t\t\tAND (\n\t\t\t\t\t\tSELECT COUNT(1) \n\t\t\t\t\t\tFROM {$wpdb->term_relationships} AS tr\n\t\t\t\t\t\tWHERE tr.term_taxonomy_id IN ({$and_term_tax_ids}) \n\t\t\t\t\t\tAND tr.object_id = {$wpdb->posts}.ID ) = {$n}\n\t\t\t\t\t)"; // Clean: all variables are Relevanssi-generated } } } if (is_array($post_query)) { if (!empty($post_query['in'])) { $valid_values = array(); foreach ($post_query['in'] as $post_in_id) { if (is_numeric($post_in_id)) { $valid_values[] = $post_in_id; } } $posts = implode(',', $valid_values); if (!empty($posts)) { $query_restrictions .= " AND relevanssi.doc IN ({$posts})"; } // Clean: $posts is checked to be integers } if (!empty($post_query['not in'])) { $valid_values = array(); foreach ($post_query['not in'] as $post_not_in_id) { if (is_numeric($post_not_in_id)) { $valid_values[] = $post_not_in_id; } } $posts = implode(',', $valid_values); if (!empty($posts)) { $query_restrictions .= " AND relevanssi.doc NOT IN ({$posts})"; } // Clean: $posts is checked to be integers } } if (is_array($parent_query)) { if (!empty($parent_query['parent in'])) { $valid_values = array(); foreach ($parent_query['parent in'] as $post_in_id) { if (is_numeric($post_in_id)) { $valid_values[] = $post_in_id; } } $posts = implode(',', $valid_values); if (!empty($posts)) { $query_restrictions .= " AND relevanssi.doc IN (SELECT ID FROM {$wpdb->posts} WHERE post_parent IN ({$posts}))"; } // Clean: $posts is checked to be integers } if (!empty($parent_query['parent not in'])) { $valid_values = array(); foreach ($parent_query['parent not in'] as $post_not_in_id) { if (is_numeric($post_not_in_id)) { $valid_values[] = $post_not_in_id; } } $posts = implode(',', $valid_values); if (!empty($posts)) { $query_restrictions .= " AND relevanssi.doc NOT IN (SELECT ID FROM {$wpdb->posts} WHERE post_parent IN ({$posts}))"; } // Clean: $posts is checked to be integers } } if (is_array($meta_query)) { $meta_query_restrictions = ""; $mq_vars = array('meta_query' => $meta_query); $mq = new WP_Meta_Query(); $mq->parse_query_vars($mq_vars); $meta_sql = $mq->get_sql('post', 'relevanssi', 'doc'); $meta_join = ""; $meta_where = ""; if ($meta_sql) { $meta_join = $meta_sql['join']; $meta_where = $meta_sql['where']; } $query_restrictions .= $meta_where; } if (!empty($date_query)) { if (is_object($date_query) && method_exists($date_query, 'get_sql')) { $sql = $date_query->get_sql(); // AND ( the query itself ) $query_restrictions .= " AND relevanssi.doc IN ( SELECT DISTINCT(ID) FROM {$wpdb->posts} WHERE 1 {$sql} )"; // Clean: $sql generated by $date_query->get_sql() query } } if (!$post_type && get_option('relevanssi_respect_exclude') == 'on') { if (function_exists('get_post_types')) { $pt_1 = get_post_types(array('exclude_from_search' => '0')); $pt_2 = get_post_types(array('exclude_from_search' => false)); $post_type = implode(',', array_merge($pt_1, $pt_2)); } } if ($post_type) { if ($post_type == -1) { $post_type = null; } // Facetious sets post_type to -1 if not selected if (!is_array($post_type)) { $post_types = esc_sql(explode(',', $post_type)); } else { $post_types = esc_sql($post_type); } $post_type = count($post_types) ? "'" . implode("', '", $post_types) . "'" : 'NULL'; } if ($post_status) { if (!is_array($post_status)) { $post_statuses = esc_sql(explode(',', $post_status)); } else { $post_statuses = esc_sql($post_status); } $post_status = count($post_statuses) ? "'" . implode("', '", $post_statuses) . "'" : 'NULL'; } //Added by OdditY: //Exclude Post_IDs (Pages) for non-admin search -> $postex = ''; if (!empty($expost)) { if ($expost != "") { $aexpids = explode(",", $expost); foreach ($aexpids as $exid) { $exid = esc_sql(trim($exid, ' -')); $postex .= " AND relevanssi.doc != '{$exid}'"; // Clean: escaped } } } // <- OdditY End if ($expost) { //added by OdditY $query_restrictions .= $postex; } $remove_stopwords = true; if (function_exists('wp_encode_emoji')) { $q = wp_encode_emoji($q); } $phrases = relevanssi_recognize_phrases($q); if (function_exists('relevanssi_recognize_negatives')) { $negative_terms = relevanssi_recognize_negatives($q); } else { $negative_terms = false; } if (function_exists('relevanssi_recognize_positives')) { $positive_terms = relevanssi_recognize_positives($q); } else { $positive_terms = false; } $terms = relevanssi_tokenize($q, $remove_stopwords); if (count($terms) < 1) { // Tokenizer killed all the search terms. return $hits; } $terms = array_keys($terms); // don't care about tf in query if ($negative_terms) { $terms = array_diff($terms, $negative_terms); if (count($terms) < 1) { return $hits; } } // Go get the count from the options table, but keep running the full query if it's not available $D = get_option('relevanssi_doc_count'); if (!$D || $D < 1) { $D = $wpdb->get_var("SELECT COUNT(DISTINCT(relevanssi.doc)) FROM {$relevanssi_table} AS relevanssi"); // Clean: no external inputs update_option('relevanssi_doc_count', $D); } $total_hits = 0; $title_matches = array(); $tag_matches = array(); $comment_matches = array(); $link_matches = array(); $body_matches = array(); $category_matches = array(); $taxonomy_matches = array(); $scores = array(); $term_hits = array(); $fuzzy = get_option('relevanssi_fuzzy'); if (function_exists('relevanssi_negatives_positives')) { $query_restrictions .= relevanssi_negatives_positives($negative_terms, $positive_terms, $relevanssi_table); // Clean: escaped in the function } if (!empty($author)) { $author_in = array(); $author_not_in = array(); foreach ($author as $id) { if (!is_numeric($id)) { continue; } if ($id > 0) { $author_in[] = $id; } else { $author_not_in[] = abs($id); } } if (count($author_in) > 0) { $authors = implode(',', $author_in); $query_restrictions .= " AND relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM {$wpdb->posts} AS posts\n\t\t\t WHERE posts.post_author IN ({$authors}))"; // Clean: $authors is always just numbers } if (count($author_not_in) > 0) { $authors = implode(',', $author_not_in); $query_restrictions .= " AND relevanssi.doc NOT IN (SELECT DISTINCT(posts.ID) FROM {$wpdb->posts} AS posts\n\t\t\t WHERE posts.post_author IN ({$authors}))"; // Clean: $authors is always just numbers } } if ($post_type) { // the -1 is there to get user profiles and category pages $query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM {$wpdb->posts} AS posts\n\t\t\tWHERE posts.post_type IN ({$post_type}))) OR (doc = -1))"; // Clean: $post_type is escaped } if ($post_status) { // the -1 is there to get user profiles and category pages $query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM {$wpdb->posts} AS posts\n\t\t\tWHERE posts.post_status IN ({$post_status}))) OR (doc = -1))"; // Clean: $post_status is escaped } if ($phrases) { $query_restrictions .= " {$phrases}"; // Clean: $phrases is escaped earlier } if (isset($_REQUEST['by_date'])) { $n = $_REQUEST['by_date']; $u = substr($n, -1, 1); switch ($u) { case 'h': $unit = "HOUR"; break; case 'd': $unit = "DAY"; break; case 'm': $unit = "MONTH"; break; case 'y': $unit = "YEAR"; break; case 'w': $unit = "WEEK"; break; default: $unit = "DAY"; } $n = preg_replace('/[hdmyw]/', '', $n); if (is_numeric($n)) { $query_restrictions .= " AND relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM {$wpdb->posts} AS posts\n\t\t\t\tWHERE posts.post_date > DATE_SUB(NOW(), INTERVAL {$n} {$unit}))"; // Clean: $n is always numeric, $unit is Relevanssi-generated } } $query_restrictions = apply_filters('relevanssi_where', $query_restrictions); // Charles St-Pierre $query_join = ""; if (!empty($meta_join)) { $query_join = $meta_join; } $query_join = apply_filters('relevanssi_join', $query_join); $no_matches = true; if ("always" == $fuzzy) { $o_term_cond = apply_filters('relevanssi_fuzzy_query', "(relevanssi.term LIKE '#term#%' OR relevanssi.term_reverse LIKE CONCAT(REVERSE('#term#'), '%')) "); } else { $o_term_cond = " relevanssi.term = '#term#' "; } $post_type_weights = get_option('relevanssi_post_type_weights'); if (function_exists('relevanssi_get_recency_bonus')) { list($recency_bonus, $recency_cutoff_date) = relevanssi_get_recency_bonus(); } else { $recency_bonus = false; $recency_cutoff_date = false; } $min_length = get_option('relevanssi_min_word_length'); $search_again = false; $title_boost = floatval(get_option('relevanssi_title_boost')); $link_boost = floatval(get_option('relevanssi_link_boost')); $comment_boost = floatval(get_option('relevanssi_comment_boost')); $include_these_posts = array(); do { foreach ($terms as $term) { $term = trim($term); // numeric search terms will start with a space if (strlen($term) < $min_length) { continue; } $term = esc_sql($term); if (strpos($o_term_cond, 'LIKE') !== false) { // only like_escape() if necessary, otherwise _ in search terms will not work if (method_exists($wpdb, 'esc_like')) { $term = $wpdb->esc_like($term); } else { // Compatibility for pre-4.0 WordPress $term = like_escape($term); } } $term_cond = str_replace('#term#', $term, $o_term_cond); !empty($post_type_weights['post_tag']) ? $tag = $post_type_weights['post_tag'] : ($tag = $relevanssi_variables['post_type_weight_defaults']['post_tag']); !empty($post_type_weights['category']) ? $cat = $post_type_weights['category'] : ($cat = $relevanssi_variables['post_type_weight_defaults']['category']); $query = "SELECT relevanssi.*, relevanssi.title * {$title_boost} + relevanssi.content + relevanssi.comment * {$comment_boost} + relevanssi.tag * {$tag} + relevanssi.link * {$link_boost} + relevanssi.author + relevanssi.category * {$cat} + relevanssi.excerpt + relevanssi.taxonomy + relevanssi.customfield + relevanssi.mysqlcolumn AS tf \n\t\t\t\t\t FROM {$relevanssi_table} AS relevanssi {$query_join} WHERE {$term_cond} {$query_restrictions}"; // Clean: $query_restrictions is escaped, $term_cond is escaped $query = apply_filters('relevanssi_query_filter', $query); $matches = $wpdb->get_results($query); if (count($matches) < 1) { continue; } else { $no_matches = false; if (count($include_these_posts) > 0) { $post_ids_to_add = implode(',', array_keys($include_these_posts)); $existing_ids = array(); foreach ($matches as $match) { $existing_ids[] = $match->doc; } $existing_ids = implode(',', $existing_ids); $query = "SELECT relevanssi.*, relevanssi.title * {$title_boost} + relevanssi.content + relevanssi.comment * {$comment_boost} + relevanssi.tag * {$tag} + relevanssi.link * {$link_boost} + relevanssi.author + relevanssi.category * {$cat} + relevanssi.excerpt + relevanssi.taxonomy + relevanssi.customfield + relevanssi.mysqlcolumn AS tf \n\t\t\t\t\t\t FROM {$relevanssi_table} AS relevanssi WHERE relevanssi.doc IN ({$post_ids_to_add}) AND relevanssi.doc NOT IN ({$existing_ids}) AND {$term_cond}"; // Clean: no unescaped user inputs $matches_to_add = $wpdb->get_results($query); $matches = array_merge($matches, $matches_to_add); } } relevanssi_populate_array($matches); global $relevanssi_post_types; $total_hits += count($matches); $query = "SELECT COUNT(DISTINCT(relevanssi.doc)) FROM {$relevanssi_table} AS relevanssi {$query_join} WHERE {$term_cond} {$query_restrictions}"; // Clean: $query_restrictions is escaped, $term_cond is escaped $query = apply_filters('relevanssi_df_query_filter', $query); $df = $wpdb->get_var($query); if ($df < 1 && "sometimes" == $fuzzy) { $query = "SELECT COUNT(DISTINCT(relevanssi.doc)) FROM {$relevanssi_table} AS relevanssi {$query_join}\n\t\t\t\t\tWHERE (relevanssi.term LIKE '{$term}%' OR relevanssi.term_reverse LIKE CONCAT(REVERSE('{$term}), %')) {$query_restrictions}"; // Clean: $query_restrictions is escaped, $term is escaped $query = apply_filters('relevanssi_df_query_filter', $query); $df = $wpdb->get_var($query); } $idf = log($D + 1 / (1 + $df)); $idf = $idf * $idf; foreach ($matches as $match) { if ('user' == $match->type) { $match->doc = 'u_' . $match->item; } else { if (!in_array($match->type, array('post', 'attachment'))) { $match->doc = '**' . $match->type . '**' . $match->item; } } if (isset($match->taxonomy_detail)) { $match->taxonomy_score = 0; $match->taxonomy_detail = unserialize($match->taxonomy_detail); if (is_array($match->taxonomy_detail)) { foreach ($match->taxonomy_detail as $tax => $count) { if ($tax == 'post_tag') { $match->tag = $count; } if (empty($post_type_weights[$tax])) { $match->taxonomy_score += $count * 1; } else { $match->taxonomy_score += $count * $post_type_weights[$tax]; } } } } $match->tf = $match->title * $title_boost + $match->content + $match->comment * $comment_boost + $match->link * $link_boost + $match->author + $match->excerpt + $match->taxonomy_score + $match->customfield + $match->mysqlcolumn; $term_hits[$match->doc][$term] = $match->title + $match->content + $match->comment + $match->tag + $match->link + $match->author + $match->category + $match->excerpt + $match->taxonomy + $match->customfield + $match->mysqlcolumn; $match->weight = $match->tf * $idf; if ($recency_bonus) { $post = relevanssi_get_post($match->doc); if (strtotime($post->post_date) > $recency_cutoff_date) { $match->weight = $match->weight * $recency_bonus['bonus']; } } isset($body_matches[$match->doc]) ? $body_matches[$match->doc] += $match->content : ($body_matches[$match->doc] = $match->content); isset($title_matches[$match->doc]) ? $title_matches[$match->doc] += $match->title : ($title_matches[$match->doc] = $match->title); isset($link_matches[$match->doc]) ? $link_matches[$match->doc] += $match->link : ($link_matches[$match->doc] = $match->link); isset($tag_matches[$match->doc]) ? $tag_matches[$match->doc] += $match->tag : ($tag_matches[$match->doc] = $match->tag); isset($category_matches[$match->doc]) ? $category_matches[$match->doc] += $match->category : ($category_matches[$match->doc] = $match->category); isset($taxonomy_matches[$match->doc]) ? $taxonomy_matches[$match->doc] += $match->taxonomy : ($taxonomy_matches[$match->doc] = $match->taxonomy); isset($comment_matches[$match->doc]) ? $comment_matches[$match->doc] += $match->comment : ($comment_matches[$match->doc] = $match->comment); isset($relevanssi_post_types[$match->doc]) ? $type = $relevanssi_post_types[$match->doc] : ($type = null); if (!empty($post_type_weights[$type])) { $match->weight = $match->weight * $post_type_weights[$type]; } $match = apply_filters('relevanssi_match', $match, $idf); if ($match->weight == 0) { continue; } // the filters killed the match $post_ok = true; $post_ok = apply_filters('relevanssi_post_ok', $post_ok, $match->doc); if ($post_ok) { $doc_terms[$match->doc][$term] = true; // count how many terms are matched to a doc isset($doc_weight[$match->doc]) ? $doc_weight[$match->doc] += $match->weight : ($doc_weight[$match->doc] = $match->weight); isset($scores[$match->doc]) ? $scores[$match->doc] += $match->weight : ($scores[$match->doc] = $match->weight); if (is_numeric($match->doc)) { // this is to weed out taxonomies and users (t_XXX, u_XXX) $include_these_posts[$match->doc] = true; } } } } if (!isset($doc_weight)) { $no_matches = true; } if ($no_matches) { if ($search_again) { // no hits even with fuzzy search! $search_again = false; } else { if ("sometimes" == $fuzzy) { $search_again = true; $o_term_cond = "(term LIKE '%#term#' OR term LIKE '#term#%') "; } } } else { $search_again = false; } } while ($search_again); $strip_stops = true; $temp_terms_without_stops = array_keys(relevanssi_tokenize(implode(' ', $terms), $strip_stops)); $terms_without_stops = array(); foreach ($temp_terms_without_stops as $temp_term) { if (strlen($temp_term) >= $min_length) { array_push($terms_without_stops, $temp_term); } } $total_terms = count($terms_without_stops); if (isset($doc_weight)) { $doc_weight = apply_filters('relevanssi_results', $doc_weight); } if (isset($doc_weight) && count($doc_weight) > 0) { arsort($doc_weight); $i = 0; foreach ($doc_weight as $doc => $weight) { if (count($doc_terms[$doc]) < $total_terms && $operator == "AND") { // AND operator in action: // doc didn't match all terms, so it's discarded continue; } if (!empty($fields)) { if ($fields == 'ids') { $hits[intval($i)] = $doc; } if ($fields == 'id=>parent') { $object = new StdClass(); $object->ID = $doc; $object->post_parent = wp_get_post_parent_id($doc); $hits[intval($i)] = $object; } } else { $hits[intval($i)] = relevanssi_get_post($doc); $hits[intval($i)]->relevance_score = round($weight, 2); } $i++; } } if (count($hits) < 1) { if ($operator == "AND" and get_option('relevanssi_disable_or_fallback') != 'on') { $or_args = $args; $or_args['operator'] = "OR"; $or_args['q'] = relevanssi_add_synonyms($q); $return = relevanssi_search($or_args); extract($return); } } global $wp; $default_order = get_option('relevanssi_default_orderby', 'relevance'); if (empty($orderby)) { $orderby = $default_order; } // the sorting function checks for non-existing keys, cannot whitelist here if (empty($order)) { $order = 'desc'; } $order = strtolower($order); $order_accepted_values = array('asc', 'desc'); if (!in_array($order, $order_accepted_values)) { $order = 'desc'; } $orderby = apply_filters('relevanssi_orderby', $orderby); $order = apply_filters('relevanssi_order', $order); if ($orderby != 'relevance') { relevanssi_object_sort($hits, $orderby, $order); } $return = array('hits' => $hits, 'body_matches' => $body_matches, 'title_matches' => $title_matches, 'tag_matches' => $tag_matches, 'category_matches' => $category_matches, 'taxonomy_matches' => $taxonomy_matches, 'comment_matches' => $comment_matches, 'scores' => $scores, 'term_hits' => $term_hits, 'query' => $q, 'link_matches' => $link_matches); return $return; }
public function get_single_mt($tag = 'meta', $type = 'property', $name, $value = '', $cmt = '', $use_post = false) { // known exceptions for the 'property' $type if ($tag === 'meta' && $type === 'property' && (strpos($name, 'twitter:') === 0 || strpos($name, ':') === false)) { $type = 'name'; } $ret = array(); $attr = $tag === 'link' ? 'href' : 'content'; $log_pre = $tag . ' ' . $type . ' ' . $name; $charset = get_bloginfo('charset'); if (is_array($value)) { if ($this->p->debug->enabled) { $this->p->debug->log($log_pre . ' value is an array (skipped)'); } return $ret; } elseif (is_object($value)) { if ($this->p->debug->enabled) { $this->p->debug->log($log_pre . ' value is an object (skipped)'); } return $ret; } if (strpos($value, '%%')) { $value = $this->p->util->replace_inline_vars($value, $use_post); } switch ($name) { case 'og:image': case 'og:image:url': case 'og:video': case 'og:video:url': // add secure_url meta tag for open graph images and videos if (strpos($value, 'https://') === 0) { $secure_value = $value; $secure_name = preg_replace('/:url$/', '', $name) . ':secure_url'; $value = preg_replace('/^https:/', 'http:', $value); $ret[] = array('', $tag, $type, $secure_name, $attr, $secure_value, $cmt); } break; } $ret[] = array('', $tag, $type, $name, $attr, $value, $cmt); // filtering of single meta tags can be enabled by defining NGFB_FILTER_SINGLE_TAGS as true if (defined('NGFB_FILTER_SINGLE_TAGS') && NGFB_FILTER_SINGLE_TAGS) { $ret = $this->filter_single_mt($ret, $use_post); } // $parts = array( $html, $tag, $type, $name, $attr, $value, $cmt ); foreach ($ret as $num => $parts) { $log_pre = $parts[1] . ' ' . $parts[2] . ' ' . $parts[3]; if ($this->p->debug->enabled) { $this->p->debug->log($log_pre . ' = "' . $parts[5] . '"'); } if ($parts[5] === '' || $parts[5] === null) { // allow for 0 if ($this->p->debug->enabled) { $this->p->debug->log($log_pre . ' value is empty (skipped)'); } } elseif ($parts[5] == -1) { // -1 is reserved if ($this->p->debug->enabled) { $this->p->debug->log($log_pre . ' value is -1 (skipped)'); } } elseif (!empty($this->p->options['add_' . $parts[1] . '_' . $parts[2] . '_' . $parts[3]])) { // change meta itemtype "image.url" to "url" (for example) if ($parts[1] === 'meta' && $parts[2] === 'itemprop' && strpos($parts[3], '.') !== 0) { $parts[3] = preg_replace('/^.*\\./', '', $parts[3]); } switch ($parts[3]) { case 'og:url': case 'og:image': case 'og:image:url': case 'og:image:secure_url': case 'og:video': case 'og:video:url': case 'og:video:url:secure_url': case 'og:video:url:embed_url': case 'twitter:image': case 'twitter:player': case 'canonical': case 'url': $parts[5] = SucomUtil::esc_url_encode($parts[5]); break; case 'og:title': case 'og:description': case 'twitter:title': case 'twitter:description': case 'description': case 'name': $parts[5] = wp_encode_emoji(htmlentities($parts[5], ENT_QUOTES, $charset, false)); // double_encode = false // double_encode = false default: $parts[5] = htmlentities($parts[5], ENT_QUOTES, $charset, false); // double_encode = false break; } $parts[0] = (empty($parts[6]) ? '' : '<!-- ' . $parts[6] . ' -->') . '<' . $parts[1] . ' ' . $parts[2] . '="' . $parts[3] . '" ' . $parts[4] . '="' . $parts[5] . '"/>' . "\n"; $ret[$num] = $parts; } elseif ($this->p->debug->enabled) { $this->p->debug->log($log_pre . ' is disabled (skipped)'); } } return $ret; }
function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields = false, $bypassglobalpost = false) { global $wpdb, $post, $relevanssi_variables; $relevanssi_table = $relevanssi_variables['relevanssi_table']; $post_was_null = false; $previous_post = NULL; // Check if this is a Jetpack Contact Form entry if (isset($_REQUEST['contact-form-id'])) { return; } if ($bypassglobalpost) { // if $bypassglobalpost is set, relevanssi_index_doc() will index the post object or post // ID as specified in $indexpost isset($post) ? $previous_post = $post : ($post_was_null = true); is_object($indexpost) ? $post = $indexpost : ($post = get_post($indexpost)); } else { // Quick edit has an array in the global $post, so fetch the post ID for the post to edit. if (is_array($post)) { $post = get_post($post['ID']); } if (empty($post)) { // No $post set, so we need to use $indexpost, if it's a post object $post_was_null = true; if (is_object($indexpost)) { $post = $indexpost; } else { $post = get_post($indexpost); } } else { // $post was set, let's grab the previous value in case we need it $previous_post = $post; } } if ($post == NULL) { // At this point we should have something in $post; if not, quit. if ($post_was_null) { $post = null; } if ($previous_post) { $post = $previous_post; } return; } // Finally fetch the post again by ID. Complicated, yes, but unless we do this, we might end // up indexing the post before the updates come in. $post = get_post($post->ID); if (function_exists('relevanssi_hide_post')) { if (relevanssi_hide_post($post->ID)) { if ($post_was_null) { $post = null; } if ($previous_post) { $post = $previous_post; } return; } } $index_this_post = false; $post->indexing_content = true; $index_types = get_option('relevanssi_index_post_types'); if (!is_array($index_types)) { $index_types = array(); } if (in_array($post->post_type, $index_types)) { $index_this_post = true; } if (true == apply_filters('relevanssi_do_not_index', false, $post->ID)) { // filter says no $index_this_post = false; } if ($remove_first) { // we are updating a post, so remove the old stuff first relevanssi_remove_doc($post->ID, true); if (function_exists('relevanssi_remove_item')) { relevanssi_remove_item($post->ID, 'post'); } } // This needs to be here, after the call to relevanssi_remove_doc(), because otherwise // a post that's in the index but shouldn't be there won't get removed. if (!$index_this_post) { if ($post_was_null) { $post = null; } if ($previous_post) { $post = $previous_post; } return; } $n = 0; $post = apply_filters('relevanssi_post_to_index', $post); $min_word_length = get_option('relevanssi_min_word_length', 3); $insert_data = array(); //Added by OdditY - INDEX COMMENTS of the POST -> if ("none" != get_option("relevanssi_index_comments")) { $pcoms = relevanssi_get_comments($post->ID); if ($pcoms != "") { $pcoms = relevanssi_strip_invisibles($pcoms); $pcoms = preg_replace('/<[a-zA-Z\\/][^>]*>/', ' ', $pcoms); $pcoms = strip_tags($pcoms); $pcoms = relevanssi_tokenize($pcoms, true, $min_word_length); if (count($pcoms) > 0) { foreach ($pcoms as $pcom => $count) { $n++; $insert_data[$pcom]['comment'] = $count; } } } } //Added by OdditY END <- $taxonomies = get_option("relevanssi_index_taxonomies_list"); // Then process all taxonomies, if any. foreach ($taxonomies as $taxonomy) { $insert_data = relevanssi_index_taxonomy_terms($post, $taxonomy, $insert_data); } // index author if ("on" == get_option("relevanssi_index_author")) { $auth = $post->post_author; $display_name = $wpdb->get_var("SELECT display_name FROM {$wpdb->users} WHERE ID={$auth}"); $names = relevanssi_tokenize($display_name, false, $min_word_length); foreach ($names as $name => $count) { isset($insert_data[$name]['author']) ? $insert_data[$name]['author'] += $count : ($insert_data[$name]['author'] = $count); } } if ($custom_fields) { $remove_underscore_fields = false; if ($custom_fields == 'all') { $custom_fields = get_post_custom_keys($post->ID); } if ($custom_fields == 'visible') { $custom_fields = get_post_custom_keys($post->ID); $remove_underscore_fields = true; } $custom_fields = apply_filters('relevanssi_index_custom_fields', $custom_fields); if (is_array($custom_fields)) { foreach ($custom_fields as $field) { if ($remove_underscore_fields) { if (substr($field, 0, 1) == '_') { continue; } } $values = get_post_meta($post->ID, $field, false); if ("" == $values) { continue; } foreach ($values as $value) { $value_tokens = relevanssi_tokenize($value, true, $min_word_length); foreach ($value_tokens as $token => $count) { isset($insert_data[$token]['customfield']) ? $insert_data[$token]['customfield'] += $count : ($insert_data[$token]['customfield'] = $count); if (function_exists('relevanssi_customfield_detail')) { $insert_data = relevanssi_customfield_detail($insert_data, $token, $count, $field); } } } } } } if (isset($post->post_excerpt) && ("on" == get_option("relevanssi_index_excerpt") || "attachment" == $post->post_type)) { // include excerpt for attachments which use post_excerpt for captions - modified by renaissancehack $excerpt_tokens = relevanssi_tokenize($post->post_excerpt, true, $min_word_length); foreach ($excerpt_tokens as $token => $count) { isset($insert_data[$token]['excerpt']) ? $insert_data[$token]['excerpt'] += $count : ($insert_data[$token]['excerpt'] = $count); } } if (function_exists('relevanssi_index_mysql_columns')) { $insert_data = relevanssi_index_mysql_columns($insert_data, $post->ID); } $index_titles = true; if (apply_filters('relevanssi_index_titles', $index_titles)) { $filtered_title = apply_filters('relevanssi_post_title_before_tokenize', $post->post_title, $post); $titles = relevanssi_tokenize(apply_filters('the_title', $filtered_title)); if (count($titles) > 0) { foreach ($titles as $title => $count) { $n++; isset($insert_data[$title]['title']) ? $insert_data[$title]['title'] += $count : ($insert_data[$title]['title'] = $count); } } } $index_content = true; if (apply_filters('relevanssi_index_content', $index_content)) { remove_shortcode('noindex'); add_shortcode('noindex', 'relevanssi_noindex_shortcode_indexing'); $contents = apply_filters('relevanssi_post_content', $post->post_content, $post); // Allow user to add extra content for Relevanssi to index // Thanks to Alexander Gieg $additional_content = trim(apply_filters('relevanssi_content_to_index', '', $post)); if ('' != $additional_content) { $contents .= ' ' . $additional_content; } if ('on' == get_option('relevanssi_expand_shortcodes')) { if (function_exists("do_shortcode")) { // WP Table Reloaded support if (defined('WP_TABLE_RELOADED_ABSPATH')) { include_once WP_TABLE_RELOADED_ABSPATH . 'controllers/controller-frontend.php'; $My_WP_Table_Reloaded = new WP_Table_Reloaded_Controller_Frontend(); } // TablePress support if (defined('TABLEPRESS_ABSPATH')) { $My_TablePress_Controller = TablePress::load_controller('frontend'); $My_TablePress_Controller->init_shortcodes(); } $disable_shortcodes = get_option('relevanssi_disable_shortcodes'); $shortcodes = explode(',', $disable_shortcodes); foreach ($shortcodes as $shortcode) { remove_shortcode(trim($shortcode)); } remove_shortcode('contact-form'); // Jetpack Contact Form causes an error message remove_shortcode('starrater'); // GD Star Rating rater shortcode causes problems remove_shortcode('responsive-flipbook'); // Responsive Flipbook causes problems remove_shortcode('avatar_upload'); // WP User Avatar is incompatible remove_shortcode('product_categories'); // A problematic WooCommerce shortcode remove_shortcode('recent_products'); // A problematic WooCommerce shortcode remove_shortcode('php'); // PHP Code for Posts $post_before_shortcode = $post; $contents = do_shortcode($contents); $post = $post_before_shortcode; if (defined('TABLEPRESS_ABSPATH')) { unset($My_TablePress_Controller); } if (defined('WP_TABLE_RELOADED_ABSPATH')) { unset($My_WP_Table_Reloaded); } } } else { if (function_exists("strip_shortcodes")) { // WP 2.5 doesn't have the function $contents = strip_shortcodes($contents); } } remove_shortcode('noindex'); add_shortcode('noindex', 'relevanssi_noindex_shortcode'); $contents = relevanssi_strip_invisibles($contents); if (function_exists('relevanssi_process_internal_links')) { $contents = relevanssi_process_internal_links($contents, $post->ID); } $contents = preg_replace('/<[a-zA-Z\\/][^>]*>/', ' ', $contents); $contents = strip_tags($contents); if (function_exists('wp_encode_emoji')) { $contents = wp_encode_emoji($contents); } $contents = apply_filters('relevanssi_post_content_before_tokenize', $contents, $post); $contents = relevanssi_tokenize($contents, true, $min_word_length); if (count($contents) > 0) { foreach ($contents as $content => $count) { $n++; isset($insert_data[$content]['content']) ? $insert_data[$content]['content'] += $count : ($insert_data[$content]['content'] = $count); } } } $type = 'post'; if ($post->post_type == 'attachment') { $type = 'attachment'; } $insert_data = apply_filters('relevanssi_indexing_data', $insert_data, $post); $values = array(); foreach ($insert_data as $term => $data) { $content = 0; $title = 0; $comment = 0; $tag = 0; $link = 0; $author = 0; $category = 0; $excerpt = 0; $taxonomy = 0; $customfield = 0; $taxonomy_detail = ''; $customfield_detail = ''; $mysqlcolumn = 0; extract($data); $term = trim($term); $value = $wpdb->prepare("(%d, %s, REVERSE(%s), %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %s, %s, %s, %d)", $post->ID, $term, $term, $content, $title, $comment, $tag, $link, $author, $category, $excerpt, $taxonomy, $customfield, $type, $taxonomy_detail, $customfield_detail, $mysqlcolumn); array_push($values, $value); } $values = apply_filters('relevanssi_indexing_values', $values, $post); if (!empty($values)) { $values = implode(', ', $values); $query = "INSERT IGNORE INTO {$relevanssi_table} (doc, term, term_reverse, content, title, comment, tag, link, author, category, excerpt, taxonomy, customfield, type, taxonomy_detail, customfield_detail, mysqlcolumn)\n\t\t\tVALUES {$values}"; $wpdb->query($query); } if ($post_was_null) { $post = null; } if ($previous_post) { $post = $previous_post; } return $n; }
function gwolle_gb_maybe_encode_emoji($string, $field) { global $wpdb; if (method_exists($wpdb, 'get_col_charset')) { $charset = $wpdb->get_col_charset($wpdb->gwolle_gb_entries, $field); if ('utf8' === $charset && function_exists('wp_encode_emoji')) { $string = wp_encode_emoji($string); } } return $string; }
/** * Create a post object for a given event * * Can't call `wp_insert_post()` because `wp_unique_post_slug()` breaks the plugin's expectations * Also doesn't call `wp_insert_post()` because this function is needed before post types and capabilities are ready. */ public function create_or_update_job($timestamp, $action, $args, $update_id = null) { // Limit how many events to insert at once if (!Lock::check_lock(self::LOCK, JOB_CREATION_CONCURRENCY_LIMIT)) { return false; } global $wpdb; // Build minimum information needed to create a post $instance = md5(serialize($args['args'])); $job_post = array('post_title' => $this->event_title($timestamp, $action, $instance), 'post_name' => $this->event_name($timestamp, $action, $instance), 'post_content_filtered' => maybe_serialize(array('action' => $action, 'instance' => $instance, 'args' => $args)), 'post_date' => date('Y-m-d H:i:s', $timestamp), 'post_date_gmt' => date('Y-m-d H:i:s', $timestamp), 'post_modified' => current_time('mysql'), 'post_modified_gmt' => current_time('mysql', true), 'post_type' => self::POST_TYPE, 'post_status' => self::POST_STATUS_PENDING, 'post_author' => 0, 'post_parent' => 0, 'comment_status' => 'closed', 'ping_status' => 'closed'); // Some sanitization in place of `sanitize_post()`, which we can't use this early foreach (array('post_title', 'post_name', 'post_content_filtered') as $field) { $job_post[$field] = sanitize_text_field($job_post[$field]); } // Duplicate some processing performed in `wp_insert_post()` $charset = $wpdb->get_col_charset($wpdb->posts, 'post_title'); if ('utf8' === $charset) { $job_post['post_title'] = wp_encode_emoji($job_post['post_title']); } $job_post = wp_unslash($job_post); // Set this so it isn't empty, even though it serves us no purpose $job_post['guid'] = esc_url(add_query_arg(self::POST_TYPE, $job_post['post_name'], home_url('/'))); // Create the post, or update an existing entry to run again in the future if (is_int($update_id) && $update_id > 0) { $inserted = $wpdb->update($wpdb->posts, $job_post, array('ID' => $update_id)); $this->posts_to_clean[] = $update_id; } else { $inserted = $wpdb->insert($wpdb->posts, $job_post); } // Clear caches for new posts once the post type is registered if ($inserted) { $this->posts_to_clean[] = $wpdb->insert_id; } // Delete internal cache wp_cache_delete(self::CACHE_KEY); // Allow more events to be created Lock::free_lock(self::LOCK); }
public function get_description($textlen = 156, $trailing = '...', $use_post = false, $use_cache = true, $add_hashtags = true, $encode = true, $md_idx = 'og_desc', $src_id = '') { if ($this->p->debug->enabled) { $this->p->debug->mark('render description'); // start timer $this->p->debug->args(array('textlen' => $textlen, 'trailing' => $trailing, 'use_post' => $use_post, 'use_cache' => $use_cache, 'add_hashtags' => $add_hashtags, 'encode' => $encode, 'md_idx' => $md_idx, 'src_id' => $src_id)); } $desc = false; $hashtags = ''; $post_id = 0; $page = ''; if (is_singular() || $use_post !== false) { if (($obj = $this->p->util->get_post_object($use_post)) === false) { if ($this->p->debug->enabled) { $this->p->debug->log('exiting early: invalid object type'); } return $desc; } $post_id = empty($obj->ID) || empty($obj->post_type) ? 0 : $obj->ID; } // skip if no metadata index / key name if (!empty($md_idx)) { if (is_singular() || $use_post !== false) { if (!empty($post_id)) { $desc = $this->p->util->get_mod_options('post', $post_id, array($md_idx, 'og_desc')); } } elseif (SucomUtil::is_term_page()) { $term = $this->p->util->get_term_object(); if (!empty($term->term_id)) { $desc = $this->p->util->get_mod_options('taxonomy', $term->term_id, $md_idx); } } elseif (SucomUtil::is_author_page()) { $author = $this->p->util->get_author_object(); if (!empty($author->ID)) { $desc = $this->p->util->get_mod_options('user', $author->ID, $md_idx); } } if ($this->p->debug->enabled) { if (empty($desc)) { $this->p->debug->log('no custom description found'); } else { $this->p->debug->log('custom description = "' . $desc . '"'); } } } // get seed if no custom meta description if (empty($desc)) { $desc = apply_filters($this->p->cf['lca'] . '_description_seed', '', $use_post, $add_hashtags, $md_idx, $src_id); if (!empty($desc)) { if ($this->p->debug->enabled) { $this->p->debug->log('description seed = "' . $desc . '"'); } } } // remove and save trailing hashtags if (preg_match('/^(.*)(( *#[a-z][a-z0-9\\-]+)+)$/U', $desc, $match)) { $desc = $match[1]; $hashtags = trim($match[2]); } elseif (is_singular() || $use_post !== false) { if (!empty($add_hashtags) && !empty($this->p->options['og_desc_hashtags'])) { $hashtags = $this->get_hashtags($post_id, $add_hashtags); } } if ($this->p->debug->enabled) { $this->p->debug->log('hashtags found = "' . $hashtags . '"'); } // if there's no custom description, and no pre-seed, // then go ahead and generate the description value if (empty($desc)) { // $obj and $post_id are defined above, with the same test, so we should be good if (is_singular() || $use_post !== false) { // use the excerpt, if we have one if (has_excerpt($post_id)) { $desc = $obj->post_excerpt; if (!empty($this->p->options['plugin_filter_excerpt'])) { $filter_removed = apply_filters($this->p->cf['lca'] . '_pre_filter_remove', false, 'get_the_excerpt'); if ($this->p->debug->enabled) { $this->p->debug->log('calling apply_filters(\'get_the_excerpt\')'); } $desc = apply_filters('get_the_excerpt', $desc); if ($filter_removed) { $filter_added = apply_filters($this->p->cf['lca'] . '_post_filter_add', false, 'get_the_excerpt'); } } } elseif ($this->p->debug->enabled) { $this->p->debug->log('no post_excerpt for post_id ' . $post_id); } // if there's no excerpt, then fallback to the content if (empty($desc)) { $desc = $this->get_content($post_id, $use_post, $use_cache, $md_idx, $src_id); } // ignore everything before the first paragraph if true if ($this->p->options['plugin_p_strip']) { if ($this->p->debug->enabled) { $this->p->debug->log('removing all text before the first paragraph'); } $desc = preg_replace('/^.*?<p>/i', '', $desc); // question mark makes regex un-greedy } } elseif (SucomUtil::is_term_page()) { if (is_tag()) { $desc = tag_description(); if (empty($desc)) { $desc = sprintf('Tagged with %s', single_tag_title('', false)); } } elseif (is_category()) { $desc = category_description(); if (empty($desc)) { $desc = sprintf('%s Category', single_cat_title('', false)); } } else { // other taxonomies $term = $this->p->util->get_term_object(); if (!empty($term->description)) { $desc = $term->description; } elseif (!empty($term->name)) { $desc = $term->name . ' Archives'; } } } elseif (SucomUtil::is_author_page()) { $author = $this->p->util->get_author_object(); if (!empty($author->description)) { $desc = $author->description; } elseif (!empty($author->display_name)) { $desc = sprintf('Authored by %s', $author->display_name); } } elseif (is_day()) { $desc = sprintf('Daily Archives for %s', get_the_date()); } elseif (is_month()) { $desc = sprintf('Monthly Archives for %s', get_the_date('F Y')); } elseif (is_year()) { $desc = sprintf('Yearly Archives for %s', get_the_date('Y')); } } // if there's still no description, then fallback to a generic version if (empty($desc)) { if (is_admin() && !empty($obj->post_status) && $obj->post_status == 'auto-draft') { if ($this->p->debug->enabled) { $this->p->debug->log('post_status is auto-draft - using empty description'); } } else { // pass options array to allow fallback if locale option does not exist $key = SucomUtil::get_locale_key('og_site_description', $this->p->options, $post_id); if (!empty($this->p->options[$key])) { if ($this->p->debug->enabled) { $this->p->debug->log('description is empty - custom site description (' . $key . ')'); } $desc = $this->p->options[$key]; } else { if ($this->p->debug->enabled) { $this->p->debug->log('description is empty - using blog description'); } $desc = get_bloginfo('description', 'display'); } } } if ($this->p->debug->enabled) { $this->p->debug->log('description strlen before html cleanup ' . strlen($desc)); } $desc = $this->p->util->cleanup_html_tags($desc, true, $this->p->options['plugin_use_img_alt']); $desc = apply_filters($this->p->cf['lca'] . '_description_pre_limit', $desc); if ($textlen > 0) { if (!empty($add_hashtags) && !empty($hashtags)) { $textlen = $textlen - strlen($hashtags) - 1; } if ($this->p->debug->enabled) { $this->p->debug->log('description strlen before limit length ' . strlen($desc) . ' (limiting to ' . $textlen . ' chars)'); } $desc = $this->p->util->limit_text_length($desc, $textlen, $trailing, false); // don't run cleanup_html_tags() } elseif ($this->p->debug->enabled) { $this->p->debug->log('description limit text length skipped'); } if (!empty($add_hashtags) && !empty($hashtags)) { $desc .= ' ' . $hashtags; } if ($encode === true) { $desc = wp_encode_emoji(htmlentities($desc, ENT_QUOTES, get_bloginfo('charset'), false)); } // double_encode = false if ($this->p->debug->enabled) { $this->p->debug->mark('render description'); } // stop timer return apply_filters($this->p->cf['lca'] . '_description', $desc, $use_post, $add_hashtags, $md_idx, $src_id); }
/** * Send the message * * @global object $wpdb * @global int $blog_id * * @param int $chat_id Chat ID * @param string $name Name * @param string $avatar URL or e-mail * @param string $message Payload message * @param string $moderator Moderator */ function chat_session_send_message($message, $chat_session) { global $wpdb; //$wpdb->real_escape = true; //$time_stamp = date("Y-m-d H:i:s"); $time_stamp_seconds = time(); $time_stamp_formated = date("Y-m-d H:i:s", $time_stamp_seconds); $blog_id = $chat_session['blog_id']; $chat_id = $chat_session['id']; $session_type = trim($chat_session['session_type']); $name = trim($this->chat_auth['name']); $user_avatar = trim($this->chat_auth['avatar']); $auth_hash = trim($this->chat_auth['auth_hash']); $user_type = trim($this->chat_auth['type']); $ip_address = isset($_SERVER['HTTP_X_FORWARD_FOR']) ? $_SERVER['HTTP_X_FORWARD_FOR'] : $_SERVER['REMOTE_ADDR']; $message = trim($message); $moderator_str = trim($chat_session['moderator']); if ($message == '') { return false; } $log_row_id = $this->chat_session_get_meta($chat_session, 'log_row_id'); //echo "log_row_id[". $log_row_id ."]<br />"; // If we don't find a record we insert a new one if (empty($log_row_id) || $log_row_id == "__EMPTY__") { $sql_str = $wpdb->prepare("INSERT INTO " . WPMUDEV_Chat::tablename('log') . " (`blog_id`, `chat_id`, `session_type`, `start`, `end`, `box_title`, `archived`) VALUES (%d, %s, %s, %s, %s, %s, %s);", $chat_session['blog_id'], $chat_session['id'], $chat_session['session_type'], $time_stamp_formated, '', $chat_session['box_title'], 'no'); //echo "sql_str[". $sql_str ."]<br />"; //die(); $ret = $wpdb->query($sql_str); if (isset($wpdb->insert_id) && $wpdb->insert_id > 0) { $this->chat_session_set_meta($chat_session, 'log_row_id', $wpdb->insert_id); $log_row_id = $wpdb->insert_id; } } // If DB charset is not utf8mb4, emojis needs to be encoded as html entities. if (!strpos($wpdb->charset, 'mb4') && function_exists('wp_encode_emoji')) { $message = wp_encode_emoji($message); } $sql_str = $wpdb->prepare("INSERT INTO " . WPMUDEV_Chat::tablename('message') . "\r\r\n\t\t\t\t\t(`blog_id`, `chat_id`, `session_type`, `timestamp`, `name`, `avatar`, `auth_hash`, `ip_address`, `message`, `moderator`, `deleted`, `archived`, `log_id`, `user_type`) VALUES (%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s);", $blog_id, $chat_id, $session_type, $time_stamp_formated, $name, $user_avatar, $auth_hash, $ip_address, $message, $moderator_str, 'no', 'no', $log_row_id, $user_type); $ret = $wpdb->query($sql_str); if (isset($wpdb->insert_id) && $wpdb->insert_id > 0) { $this->chat_session_set_meta($chat_session, 'last_row_id', $wpdb->insert_id); return $wpdb->insert_id; } }
public static function sanitize_content($value) { global $wpdb; $options = get_option('iwt_options'); $allowed = wp_kses_allowed_html('post'); if (array_key_exists('contentelements', $options) && json_decode($options['contentelements']) != null) { $allowed = json_decode($options['contentelements'], true); } $charset = $wpdb->get_col_charset($wpdb->posts, $emoji_field); if ('utf8' === $charset) { $value = wp_encode_emoji($value); } return wp_kses((string) $value, $allowed); }
* @param int $post_ID Post ID. * @param array $new_postarr Array of parsed post data. * @param array $postarr Array of sanitized, but otherwise unmodified post data. */ $post_parent = apply_filters('wp_insert_post_parent', $post_parent, $post_ID, compact(array_keys($postarr)), $postarr); $post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent); // Don't unslash. $post_mime_type = isset($postarr['post_mime_type']) ? $postarr['post_mime_type'] : ''; // Expected_slashed (everything!). $data = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid'); $emoji_fields = array('post_title', 'post_content', 'post_excerpt'); foreach ($emoji_fields as $emoji_field) { if (isset($data[$emoji_field])) { $charset = $wpdb->get_col_charset($wpdb->posts, $emoji_field); if ('utf8' === $charset) { $data[$emoji_field] = wp_encode_emoji($data[$emoji_field]); } } } if ('attachment' === $post_type) { /** * Filter attachment post data before it is updated in or added to the database. * * @since 3.9.0 * * @param array $data An array of sanitized attachment post data. * @param array $postarr An array of unsanitized attachment post data. */ $data = apply_filters('wp_insert_attachment_data', $data, $postarr); } else { /**
/** * Send the message * * @global object $wpdb * @global int $blog_id * * @param int $chat_id Chat ID * @param string $name Name * @param string $avatar URL or e-mail * @param string $message Payload message * @param string $moderator Moderator */ function send_message($chat_id, $name, $avatar, $message, $moderator) { global $wpdb, $blog_id; $wpdb->real_escape = true; $time_stamp = date("Y-m-d H:i:s"); $moderator_str = 'no'; if (empty($message)) { return false; } if ($moderator) { $moderator_str = 'yes'; } $table = Chat::tablename('message'); // If Table charset is not utf8mb4, emojis needs to be encoded as html entities. if (!strpos($wpdb->charset, 'mb4') && function_exists('wp_encode_emoji')) { $message = wp_encode_emoji($message); } $sql = $wpdb->prepare("INSERT INTO {$table} (blog_id, chat_id, timestamp, name, avatar, message, archived, moderator) VALUES (%d, %d, %s, %s, %s, %s, %s, %s)", $blog_id, $chat_id, $time_stamp, $name, $avatar, $message, 'no', $moderator_str); return $wpdb->query($sql); }
public function sanitize_option_value($key, $val, $def_val, $network = false, $mod = false) { // remove localization for more generic match if (preg_match('/(#.*|:[0-9]+)$/', $key) > 0) { $key = preg_replace('/(#.*|:[0-9]+)$/', '', $key); } // hooked by the sharing class $option_type = apply_filters($this->p->cf['lca'] . '_option_type', false, $key, $network, $mod); // pre-filter most values to remove html switch ($option_type) { case 'html': // leave html and css / javascript code blocks as-is // leave html and css / javascript code blocks as-is case 'code': $val = stripslashes($val); break; default: $val = stripslashes($val); $val = wp_filter_nohtml_kses($val); $val = wp_encode_emoji(htmlentities($val, ENT_QUOTES, get_bloginfo('charset'), false)); // double_encode = false break; } switch ($option_type) { // must be empty or texturized case 'textured': if ($val !== '') { $val = trim(wptexturize(' ' . $val . ' ')); } break; // must be empty or a url // must be empty or a url case 'url': if ($val !== '') { $val = $this->cleanup_html_tags($val); if (strpos($val, '//') === false) { $this->p->notice->err(sprintf('The value of option \'%s\' must be a URL - resetting the option to its default value.', $key), true); $val = $def_val; } } break; // strip leading urls off facebook usernames // strip leading urls off facebook usernames case 'url_base': if ($val !== '') { $val = $this->cleanup_html_tags($val); $val = preg_replace('/(http|https):\\/\\/[^\\/]*?\\//', '', $val); } break; // twitter-style usernames (prepend with an @ character) // twitter-style usernames (prepend with an @ character) case 'at_name': if ($val !== '') { $val = substr(preg_replace('/[^a-zA-Z0-9_]/', '', $val), 0, 15); if (!empty($val)) { $val = '@' . $val; } } break; case 'pos_num': // integer options that must be 1 or more (not zero) // integer options that must be 1 or more (not zero) case 'img_dim': // image dimensions, subject to minimum value (typically, at least 200px) if ($option_type == 'img_dim') { $min_int = empty($this->p->cf['head']['min_img_dim']) ? 200 : $this->p->cf['head']['min_img_dim']; } else { $min_int = 1; } // custom meta options are allowed to be empty if ($val === '' && $mod !== false) { break; } elseif (!is_numeric($val) || $val < $min_int) { $this->p->notice->err(sprintf('The value of option \'%s\' must be greater or equal to %s - resetting the option to its default value.', $key, $min_int), true); $val = $def_val; } break; // must be blank or numeric // must be blank or numeric case 'blank_num': if ($val !== '' && !is_numeric($val)) { $this->p->notice->err(sprintf('The value of option \'%s\' must be numeric - resetting the option to its default value.', $key), true); $val = $def_val; } break; // must be numeric // must be numeric case 'numeric': if (!is_numeric($val)) { $this->p->notice->err(sprintf('The value of option \'%s\' must be numeric - resetting the option to its default value.', $key), true); $val = $def_val; } break; // must be alpha-numeric uppercase (hyphens are allowed as well) // must be alpha-numeric uppercase (hyphens are allowed as well) case 'auth_id': $val = trim($val); if ($val !== '' && preg_match('/[^A-Z0-9\\-]/', $val)) { $this->p->notice->err(sprintf('\'%s\' is not an acceptable value for option \'%s\' - resetting the option to its default value.', $val, $key), true); $val = $def_val; } break; // blank or alpha-numeric (upper or lower case), plus underscores // blank or alpha-numeric (upper or lower case), plus underscores case 'api_key': $val = trim($val); if ($val !== '' && preg_match('/[^a-zA-Z0-9_]/', $val)) { $this->p->notice->err(sprintf('The value of option \'%s\' must be alpha-numeric - resetting the option to its default value.', $key), true); $val = $def_val; } break; // text strings that can be blank // text strings that can be blank case 'ok_blank': if ($val !== '') { $val = trim($val); } break; case 'desc': case 'one_line': if ($val !== '') { $val = trim(preg_replace('/[\\s\\n\\r]+/s', ' ', $val)); } break; case 'html': if ($val !== '') { $val = trim($val); if (!preg_match('/<.*>/', $val)) { $this->p->notice->err(sprintf('The value of option \'%s\' must be HTML code - resetting the option to its default value.', $key), true); $val = $def_val; } } break; // options that cannot be blank // options that cannot be blank case 'code': case 'not_blank': if ($val === '') { $this->p->notice->err(sprintf('The value of option \'%s\' cannot be empty - resetting the option to its default value.', $key), true); $val = $def_val; } break; // everything else is a 1 or 0 checkbox option // everything else is a 1 or 0 checkbox option case 'checkbox': default: if ($def_val === 0 || $def_val === 1) { // make sure the default option is also a 1 or 0, just in case $val = empty($val) ? 0 : 1; } break; } return $val; }