관리-도구
편집 파일: wpseo-functions.php
<?php /** * @package WPSEO\Internals */ if ( ! defined( 'WPSEO_VERSION' ) ) { header( 'Status: 403 Forbidden' ); header( 'HTTP/1.1 403 Forbidden' ); exit(); } if ( ! function_exists( 'initialize_wpseo_front' ) ) { /** * Wraps frontend class. */ function initialize_wpseo_front() { WPSEO_Frontend::get_instance(); } } if ( ! function_exists( 'yoast_breadcrumb' ) ) { /** * Template tag for breadcrumbs. * * @param string $before What to show before the breadcrumb. * @param string $after What to show after the breadcrumb. * @param bool $display Whether to display the breadcrumb (true) or return it (false). * * @return string */ function yoast_breadcrumb( $before = '', $after = '', $display = true ) { $breadcrumbs_enabled = current_theme_supports( 'yoast-seo-breadcrumbs' ); if ( ! $breadcrumbs_enabled ) { $options = get_option( 'wpseo_internallinks' ); $breadcrumbs_enabled = ( $options['breadcrumbs-enable'] === true ); } if ( $breadcrumbs_enabled ) { return WPSEO_Breadcrumbs::breadcrumb( $before, $after, $display ); } } } /** * Add the bulk edit capability to the proper default roles. */ function wpseo_add_capabilities() { $roles = array( 'administrator', 'editor', ); $roles = apply_filters( 'wpseo_bulk_edit_roles', $roles ); foreach ( $roles as $role ) { $r = get_role( $role ); if ( $r ) { $r->add_cap( 'wpseo_bulk_edit' ); } } } /** * Remove the bulk edit capability from the proper default roles. * * Contributor is still removed for legacy reasons. */ function wpseo_remove_capabilities() { $roles = array( 'administrator', 'editor', 'author', 'contributor', ); $roles = apply_filters( 'wpseo_bulk_edit_roles', $roles ); foreach ( $roles as $role ) { $r = get_role( $role ); if ( $r ) { $r->remove_cap( 'wpseo_bulk_edit' ); } } } /** * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt * * @param string $string the string to replace the variables in. * @param object $args the object some of the replacement values might come from, could be a post, taxonomy or term. * @param array $omit variables that should not be replaced by this function. * * @return string */ function wpseo_replace_vars( $string, $args, $omit = array() ) { $replacer = new WPSEO_Replace_Vars; return $replacer->replace( $string, $args, $omit ); } /** * Register a new variable replacement * * This function is for use by other plugins/themes to easily add their own additional variables to replace. * This function should be called from a function on the 'wpseo_register_extra_replacements' action hook. * The use of this function is preferred over the older 'wpseo_replacements' filter as a way to add new replacements. * The 'wpseo_replacements' filter should still be used to adjust standard WPSEO replacement values. * The function can not be used to replace standard WPSEO replacement value functions and will thrown a warning * if you accidently try. * To avoid conflicts with variables registered by WPSEO and other themes/plugins, try and make the * name of your variable unique. Variable names also can not start with "%%cf_" or "%%ct_" as these are reserved * for the standard WPSEO variable variables 'cf_<custom-field-name>', 'ct_<custom-tax-name>' and * 'ct_desc_<custom-tax-name>'. * The replacement function will be passed the undelimited name (i.e. stripped of the %%) of the variable * to replace in case you need it. * * Example code: * <code> * <?php * function retrieve_var1_replacement( $var1 ) { * return 'your replacement value'; * } * * function register_my_plugin_extra_replacements() { * wpseo_register_var_replacement( '%%myvar1%%', 'retrieve_var1_replacement', 'advanced', 'this is a help text for myvar1' ); * wpseo_register_var_replacement( 'myvar2', array( 'class', 'method_name' ), 'basic', 'this is a help text for myvar2' ); * } * add_action( 'wpseo_register_extra_replacements', 'register_my_plugin_extra_replacements' ); * ?> * </code> * * @since 1.5.4 * * @param string $var The name of the variable to replace, i.e. '%%var%%' * - the surrounding %% are optional, name can only contain [A-Za-z0-9_-]. * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable * Uses the same format as add_filter/add_action function parameter and * should *return* the replacement value. DON'T echo it. * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. * @param string $help_text Help text to be added to the help tab for this variable. * * @return bool Whether the replacement function was succesfully registered */ function wpseo_register_var_replacement( $var, $replace_function, $type = 'advanced', $help_text = '' ) { return WPSEO_Replace_Vars::register_replacement( $var, $replace_function, $type, $help_text ); } /** * Redirect /sitemap.xml to /sitemap_index.xml */ function wpseo_xml_redirect_sitemap() { $current_url = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? 'https://' : 'http://'; $current_url .= sanitize_text_field( $_SERVER['SERVER_NAME'] ) . sanitize_text_field( $_SERVER['REQUEST_URI'] ); // Must be 'sitemap.xml' and must be 404. if ( home_url( '/sitemap.xml' ) == $current_url && $GLOBALS['wp_query']->is_404 ) { wp_redirect( home_url( '/sitemap_index.xml' ), 301 ); exit; } } /** * Create base URL for the sitemaps and applies filters * * @since 1.5.7 * * @param string $page page to append to the base URL. * * @return string base URL (incl page) for the sitemaps */ function wpseo_xml_sitemaps_base_url( $page ) { $base = $GLOBALS['wp_rewrite']->using_index_permalinks() ? 'index.php/' : '/'; /** * Filter: 'wpseo_sitemaps_base_url' - Allow developer to change the base URL of the sitemaps * * @api string $base The string that should be added to home_url() to make the full base URL. */ $base = apply_filters( 'wpseo_sitemaps_base_url', $base ); return home_url( $base . $page ); } /** * Initialize sitemaps. Add sitemap & XSL rewrite rules and query vars */ function wpseo_xml_sitemaps_init() { $options = get_option( 'wpseo_xml' ); if ( $options['enablexmlsitemap'] !== true ) { return; } // Redirects sitemap.xml to sitemap_index.xml. add_action( 'template_redirect', 'wpseo_xml_redirect_sitemap', 0 ); if ( ! is_object( $GLOBALS['wp'] ) ) { return; } $GLOBALS['wp']->add_query_var( 'sitemap' ); $GLOBALS['wp']->add_query_var( 'sitemap_n' ); $GLOBALS['wp']->add_query_var( 'xsl' ); add_rewrite_rule( 'sitemap_index\.xml$', 'index.php?sitemap=1', 'top' ); add_rewrite_rule( '([^/]+?)-sitemap([0-9]+)?\.xml$', 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]', 'top' ); add_rewrite_rule( '([a-z]+)?-?sitemap\.xsl$', 'index.php?xsl=$matches[1]', 'top' ); } add_action( 'init', 'wpseo_xml_sitemaps_init', 1 ); /** * Notify search engines of the updated sitemap. * * @param string|null $sitemapurl */ function wpseo_ping_search_engines( $sitemapurl = null ) { // Don't ping if blog is not public. if ( '0' == get_option( 'blog_public' ) ) { return; } if ( $sitemapurl == null ) { $sitemapurl = urlencode( wpseo_xml_sitemaps_base_url( 'sitemap_index.xml' ) ); } // Ping Google and Bing. wp_remote_get( 'http://www.google.com/webmasters/tools/ping?sitemap=' . $sitemapurl, array( 'blocking' => false ) ); wp_remote_get( 'http://www.bing.com/ping?sitemap=' . $sitemapurl, array( 'blocking' => false ) ); } add_action( 'wpseo_ping_search_engines', 'wpseo_ping_search_engines' ); /** * WPML plugin support: Set titles for custom types / taxonomies as translatable. * It adds new keys to a wpml-config.xml file for a custom post type title, metadesc, title-ptarchive and metadesc-ptarchive fields translation. * Documentation: http://wpml.org/documentation/support/language-configuration-files/ * * @global $sitepress * * @param array $config * * @return array */ function wpseo_wpml_config( $config ) { global $sitepress; if ( ( is_array( $config ) && isset( $config['wpml-config']['admin-texts']['key'] ) ) && ( is_array( $config['wpml-config']['admin-texts']['key'] ) && $config['wpml-config']['admin-texts']['key'] !== array() ) ) { $admin_texts = $config['wpml-config']['admin-texts']['key']; foreach ( $admin_texts as $k => $val ) { if ( $val['attr']['name'] === 'wpseo_titles' ) { $translate_cp = array_keys( $sitepress->get_translatable_documents() ); if ( is_array( $translate_cp ) && $translate_cp !== array() ) { foreach ( $translate_cp as $post_type ) { $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-' . $post_type; $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-' . $post_type; $admin_texts[ $k ]['key'][]['attr']['name'] = 'metakey-' . $post_type; $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-ptarchive-' . $post_type; $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-ptarchive-' . $post_type; $admin_texts[ $k ]['key'][]['attr']['name'] = 'metakey-ptarchive-' . $post_type; $translate_tax = $sitepress->get_translatable_taxonomies( false, $post_type ); if ( is_array( $translate_tax ) && $translate_tax !== array() ) { foreach ( $translate_tax as $taxonomy ) { $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-tax-' . $taxonomy; $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-tax-' . $taxonomy; $admin_texts[ $k ]['key'][]['attr']['name'] = 'metakey-tax-' . $taxonomy; } } } } break; } } $config['wpml-config']['admin-texts']['key'] = $admin_texts; } return $config; } add_filter( 'icl_wpml_config_array', 'wpseo_wpml_config' ); /** * Yoast SEO breadcrumb shortcode * [wpseo_breadcrumb] * * @return string */ function wpseo_shortcode_yoast_breadcrumb() { return yoast_breadcrumb( '', '', false ); } add_shortcode( 'wpseo_breadcrumb', 'wpseo_shortcode_yoast_breadcrumb' ); /** * This invalidates our XML Sitemaps cache. * * @param string $type */ function wpseo_invalidate_sitemap_cache( $type ) { // Always delete the main index sitemaps cache, as that's always invalidated by any other change. delete_transient( 'wpseo_sitemap_cache_1' ); delete_transient( 'wpseo_sitemap_cache_' . $type ); WPSEO_Utils::clear_sitemap_cache( array( $type ) ); } add_action( 'deleted_term_relationships', 'wpseo_invalidate_sitemap_cache' ); /** * Invalidate XML sitemap cache for taxonomy / term actions * * @param unsigned $unused * @param string $type */ function wpseo_invalidate_sitemap_cache_terms( $unused, $type ) { wpseo_invalidate_sitemap_cache( $type ); } add_action( 'edited_terms', 'wpseo_invalidate_sitemap_cache_terms', 10, 2 ); add_action( 'clean_term_cache', 'wpseo_invalidate_sitemap_cache_terms', 10, 2 ); add_action( 'clean_object_term_cache', 'wpseo_invalidate_sitemap_cache_terms', 10, 2 ); /** * Invalidate the XML sitemap cache for a post type when publishing or updating a post * * @param int $post_id */ function wpseo_invalidate_sitemap_cache_on_save_post( $post_id ) { // If this is just a revision, don't invalidate the sitemap cache yet. if ( wp_is_post_revision( $post_id ) ) { return; } wpseo_invalidate_sitemap_cache( get_post_type( $post_id ) ); } add_action( 'save_post', 'wpseo_invalidate_sitemap_cache_on_save_post' ); /** * Emulate PHP native ctype_digit() function for when the ctype extension would be disabled *sigh* * Only emulates the behaviour for when the input is a string, does not handle integer input as ascii value * * @param string $string * * @return bool */ if ( ! extension_loaded( 'ctype' ) || ! function_exists( 'ctype_digit' ) ) { /** * @param string $string * * @return bool */ function ctype_digit( $string ) { $return = false; if ( ( is_string( $string ) && $string !== '' ) && preg_match( '`^\d+$`', $string ) === 1 ) { $return = true; } return $return; } } /********************** DEPRECATED FUNCTIONS **********************/ /** * Get the value from the post custom values * * @deprecated 1.5.0 * @deprecated use WPSEO_Meta::get_value() * @see WPSEO_Meta::get_value() * * @param string $val Internal name of the value to get. * @param int $postid Post ID of the post to get the value for. * * @return string */ function wpseo_get_value( $val, $postid = 0 ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Meta::get_value()' ); return WPSEO_Meta::get_value( $val, $postid ); } /** * Save a custom meta value * * @deprecated 1.5.0 * @deprecated use WPSEO_Meta::set_value() or just use update_post_meta() * @see WPSEO_Meta::set_value() * * @param string $meta_key The meta to change. * @param mixed $meta_value The value to set the meta to. * @param int $post_id The ID of the post to change the meta for. * * @return bool whether the value was changed */ function wpseo_set_value( $meta_key, $meta_value, $post_id ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Meta::set_value()' ); return WPSEO_Meta::set_value( $meta_key, $meta_value, $post_id ); } /** * Retrieve an array of all the options the plugin uses. It can't use only one due to limitations of the options API. * * @deprecated 1.5.0 * @deprecated use WPSEO_Options::get_option_names() * @see WPSEO_Options::get_option_names() * * @return array of options. */ function get_wpseo_options_arr() { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Options::get_option_names()' ); return WPSEO_Options::get_option_names(); } /** * Retrieve all the options for the SEO plugin in one go. * * @deprecated 1.5.0 * @deprecated use WPSEO_Options::get_all() * @see WPSEO_Options::get_all() * * @return array of options */ function get_wpseo_options() { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Options::get_all()' ); return WPSEO_Options::get_all(); } /** * Used for imports, both in dashboard and import settings pages, this functions either copies * $old_metakey into $new_metakey or just plain replaces $old_metakey with $new_metakey * * @deprecated 1.5.0 * @deprecated use WPSEO_Meta::replace_meta() * @see WPSEO_Meta::replace_meta() * * @param string $old_metakey The old name of the meta value. * @param string $new_metakey The new name of the meta value, usually the Yoast SEO name. * @param bool $replace Whether to replace or to copy the values. */ function replace_meta( $old_metakey, $new_metakey, $replace = false ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Meta::replace_meta()' ); WPSEO_Meta::replace_meta( $old_metakey, $new_metakey, $replace ); } /** * Retrieve a taxonomy term's meta value. * * @deprecated 1.5.0 * @deprecated use WPSEO_Taxonomy_Meta::get_term_meta() * @see WPSEO_Taxonomy_Meta::get_term_meta() * * @param string|object $term Term to get the meta value for. * @param string $taxonomy Name of the taxonomy to which the term is attached. * @param string $meta Meta value to get. * * @return bool|mixed value when the meta exists, false when it does not */ function wpseo_get_term_meta( $term, $taxonomy, $meta ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Taxonomy_Meta::get_term_meta()' ); return WPSEO_Taxonomy_Meta::get_term_meta( $term, $taxonomy, $meta ); } /** * Throw a notice about an invalid custom taxonomy used * * @since 1.4.14 * @deprecated 1.5.4 (removed) */ function wpseo_invalid_custom_taxonomy() { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.4' ); } /** * Retrieve a post's terms, comma delimited. * * @deprecated 1.5.4 * @deprecated use WPSEO_Replace_Vars::get_terms() * @see WPSEO_Replace_Vars::get_terms() * * @param int $id ID of the post to get the terms for. * @param string $taxonomy The taxonomy to get the terms for this post from. * @param bool $return_single If true, return the first term. * * @return string either a single term or a comma delimited string of terms. */ function wpseo_get_terms( $id, $taxonomy, $return_single = false ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.4', 'WPSEO_Replace_Vars::get_terms()' ); $replacer = new WPSEO_Replace_Vars; return $replacer->get_terms( $id, $taxonomy, $return_single ); } /** * Generate an HTML sitemap * * @deprecated 1.5.5.4 * @deprecated use plugin Yoast SEO Premium * @see Yoast SEO Premium * * @param array $atts The attributes passed to the shortcode. * * @return string */ function wpseo_sitemap_handler( $atts ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.5.5.4', 'Functionality has been discontinued after being in beta, it\'ll be available in the Yoast SEO Premium plugin soon.' ); return ''; } add_shortcode( 'wpseo_sitemap', 'wpseo_sitemap_handler' ); /** * Strip out the shortcodes with a filthy regex, because people don't properly register their shortcodes. * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::strip_shortcode() * @see WPSEO_Utils::strip_shortcode() * * @param string $text Input string that might contain shortcodes. * * @return string $text string without shortcodes */ function wpseo_strip_shortcode( $text ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::strip_shortcode()' ); return WPSEO_Utils::strip_shortcode( $text ); } /** * Do simple reliable math calculations without the risk of wrong results * * @see http://floating-point-gui.de/ * @see the big red warning on http://php.net/language.types.float.php * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::calc() * @see WPSEO_Utils::calc() * * In the rare case that the bcmath extension would not be loaded, it will return the normal calculation results * * @since 1.5.0 * * @param mixed $number1 Scalar (string/int/float/bool). * @param string $action Calculation action to execute. * @param mixed $number2 Scalar (string/int/float/bool). * @param bool $round Whether or not to round the result. Defaults to false. * @param int $decimals Decimals for rounding operation. Defaults to 0. * @param int $precision Calculation precision. Defaults to 10. * * @return mixed Calculation Result or false if either or the numbers isn't scalar or * an invalid operation was passed */ function wpseo_calc( $number1, $action, $number2, $round = false, $decimals = 0, $precision = 10 ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::calc()' ); return WPSEO_Utils::calc( $number1, $action, $number2, $round, $decimals, $precision ); } /** * Check if the web server is running on Apache * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::is_apache() * @see WPSEO_Utils::is_apache() * * @return bool */ function wpseo_is_apache() { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::is_apache()' ); return WPSEO_Utils::is_apache(); } /** * Check if the web service is running on Nginx * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::is_nginx() * @see WPSEO_Utils::is_nginx() * * @return bool */ function wpseo_is_nginx() { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::is_nginx()' ); return WPSEO_Utils::is_nginx(); } /** * List all the available user roles * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::get_roles() * @see WPSEO_Utils::get_roles() * * @return array $roles */ function wpseo_get_roles() { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::get_roles()' ); return WPSEO_Utils::get_roles(); } /** * Check whether a url is relative * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::is_url_relative() * @see WPSEO_Utils::is_url_relative() * * @param string $url * * @return bool */ function wpseo_is_url_relative( $url ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::is_url_relative()' ); return WPSEO_Utils::is_url_relative( $url ); } /** * Standardize whitespace in a string * * @deprecated 1.6.1 * @deprecated use WPSEO_Utils::standardize_whitespace() * @see WPSEO_Utils::standardize_whitespace() * * @since 1.6.0 * * @param string $string * * @return string */ function wpseo_standardize_whitespace( $string ) { _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::standardize_whitespace()' ); return WPSEO_Utils::standardize_whitespace( $string ); }