/** * 默认的自动补全逻辑 * * @param $keyword * @return array */ private function defaultMatch($keyword) { if (is_empty_string($keyword)) { return []; } if (!($related = $this->related())) { return []; } return $related->where($this->relationColumn(), 'like', '%' . trim($keyword) . '%')->limit($this->getLimit())->pluck($this->relationColumn(), $related->getKeyName())->all(); }
/** * Update the additional meta for a post ID. * * @since 1.1 * @param int $post_id Post ID * @param [type] $new_meta New additional meta to update * @return void */ function update_additional_meta($post_id, $new_meta) { $old_meta = get_post_meta($post_id, '_ac_additional_content', true); if (!(!empty($new_meta) && is_array($new_meta))) { if ($old_meta) { // Delete old meta if new meta is empty. delete_post_meta($post_id, '_ac_additional_content'); } return; } $defaults = get_defaults(); // Validate the new settings foreach ($new_meta as $key => $setting) { if (!is_array($setting)) { unset($new_meta[$key]); continue; } $setting = array_merge($defaults, $setting); // Filter content for users without the unfiltered_html capability. $filter_content = current_user_can('unfiltered_html') ? false : true; /** * Filter html in additional content before it is saved to the database. * * @since 1.0 * @param bool $filter_content Filter content. True for users without the unfiltered_html capability. */ $filter_content = apply_filters('ac_additional_content_filter_html', $filter_content, $setting, $post_id); if ($filter_content) { $setting['additional_content'] = wp_filter_post_kses($setting['additional_content']); } if (is_empty_string($setting['additional_content'])) { unset($new_meta[$key]); continue; } foreach (array('prepend', 'append') as $addition) { if ('on' !== $setting[$addition]) { $setting[$addition] = $defaults[$addition]; } } $setting['priority'] = absint($setting['priority']) ? absint($setting['priority']) : 10; $new_meta[$key] = $setting; } $new_meta = array_values($new_meta); if (!empty($new_meta)) { $_new_meta = array(); $priorities = sort_by_priority($new_meta); foreach ($priorities as $priority) { foreach ($priority as $option) { $_new_meta[] = $option; } } if ($_new_meta != $old_meta) { update_post_meta($post_id, '_ac_additional_content', $_new_meta); } } elseif (empty($new_meta) && $old_meta) { delete_post_meta($post_id, '_ac_additional_content'); } }
/** * 当前属性以特定字符串结尾 * @param $attribute * @param string|null $value * @return static */ public function whereEndsWith($attribute, string $value) { if (is_empty_string($value)) { return $this; } $this->original->where($attribute, 'like', '%' . trim($value, '%')); return $this; }
/** * Returns validated additional content options. * * @since 1.0 * @param array $options Additional content options. * @return array Sanitized options. */ private function validate_options($options = array()) { $sanitized_options = array(); $defaults = get_defaults(); // Sanitize and validate the options. foreach ($options as $option) { if (!is_array($option)) { continue; } $option = array_merge($defaults, $option); // Continue if both prepend and append are empty. if (empty($option['prepend']) && empty($option['append'])) { continue; } // Continue if additional_content is empty. if (is_empty_string($option['additional_content'])) { continue; } // Use the same filters as the filters applied to the_content. // This prevents filter recursion. $option['additional_content'] = apply_filters('the_additional_content', $option['additional_content']); // Add the option after validation. $sanitized_options[] = $option; } return $sanitized_options; }