load_modules(); } } if ( ! function_exists( 'aioseop_get_options' ) ) { /** * AIOSEOP Get Option * * @since ? * * @return mixed|void */ function aioseop_get_options() { global $aioseop_options; $aioseop_options = get_option( 'aioseop_options' ); $aioseop_options = apply_filters( 'aioseop_get_options', $aioseop_options ); return $aioseop_options; } } if ( ! function_exists( 'aioseop_update_settings_check' ) ) { /** * AIOSEOP Update Settings Check * * Check if settings need to be updated / migrated from old version. * * @TODO See when this is from and if we can move it elsewhere... our new db updates/upgrades class? This is called every single time a page is loaded both on the front-end or backend. * * @since ? */ function aioseop_update_settings_check() { global $aioseop_options; if ( empty( $aioseop_options ) || isset( $_POST['aioseop_migrate_options'] ) ) { aioseop_initialize_options(); } // WPML has now attached to filters, read settings again so they can be translated. aioseop_get_options(); $update_options = false; if ( ! empty( $aioseop_options ) ) { if ( ! empty( $aioseop_options['aiosp_archive_noindex'] ) ) { // Migrate setting for noindex archives. $aioseop_options['aiosp_archive_date_noindex'] = $aioseop_options['aiosp_archive_noindex']; $aioseop_options['aiosp_archive_author_noindex'] = $aioseop_options['aiosp_archive_noindex']; unset( $aioseop_options['aiosp_archive_noindex'] ); $update_options = true; } if ( ! empty( $aioseop_options['aiosp_archive_title_format'] ) && empty( $aioseop_options['aiosp_date_title_format'] ) ) { $aioseop_options['aiosp_date_title_format'] = $aioseop_options['aiosp_archive_title_format']; unset( $aioseop_options['aiosp_archive_title_format'] ); $update_options = true; } if ( ! empty( $aioseop_options['aiosp_archive_title_format'] ) && ( '%date% | %site_title%' === $aioseop_options['aiosp_archive_title_format'] ) ) { $aioseop_options['aiosp_archive_title_format'] = '%archive_title% | %site_title%'; $update_options = true; } if ( $update_options ) { update_option( 'aioseop_options', $aioseop_options ); } } } } if ( ! function_exists( 'aioseop_initialize_options' ) ) { /** * AIOSEOP Initialize Options * * Initialize settings to defaults. Changed name from the abstruse 'aioseop_mrt_mkarry' to 'aioseop_initialize_options'. * * @TODO Should also move. * * @since ? */ function aioseop_initialize_options() { global $aiosp; global $aioseop_options; $naioseop_options = $aiosp->default_options(); if ( get_option( 'aiosp_post_title_format' ) ) { foreach ( $naioseop_options as $aioseop_opt_name => $value ) { $aioseop_oldval = get_option( $aioseop_opt_name ); if ( $aioseop_oldval ) { $naioseop_options[ $aioseop_opt_name ] = $aioseop_oldval; } if ( '' == $aioseop_oldval ) { $naioseop_options[ $aioseop_opt_name ] = ''; } delete_option( $aioseop_opt_name ); } } add_option( 'aioseop_options', $naioseop_options ); $aioseop_options = $naioseop_options; } } if ( ! function_exists( 'aioseop_get_version' ) ) { /** * AIOSEOP Get Version * * Returns the version. * I'm not sure why we have BOTH a function and a constant for this. -mrt * * @since ? * * @return string */ function aioseop_get_version() { return AIOSEOP_VERSION; } } if ( ! function_exists( 'aioseop_option_isset' ) ) { /** * AIOSEOP Option Isset * * Checks if an option isset. * * @since ? * * @param $option * @return bool */ function aioseop_option_isset( $option ) { global $aioseop_options; return ( isset( $aioseop_options[ $option ] ) && $aioseop_options[ $option ] ); } } if ( ! function_exists( 'aioseop_addmycolumns' ) ) { /** * AIOSEOP Add My Columns * * Adds posttype columns. * * @since ? */ function aioseop_addmycolumns() { global $aioseop_options, $pagenow; $aiosp_posttypecolumns = array(); if ( ! empty( $aioseop_options ) && ! empty( $aioseop_options['aiosp_posttypecolumns'] ) ) { $aiosp_posttypecolumns = $aioseop_options['aiosp_posttypecolumns']; } if ( ! empty( $pagenow ) && ( 'upload.php' === $pagenow ) ) { $post_type = 'attachment'; } elseif ( ! isset( $_REQUEST['post_type'] ) ) { $post_type = 'post'; } else { $post_type = $_REQUEST['post_type']; } if ( is_array( $aiosp_posttypecolumns ) && in_array( $post_type, $aiosp_posttypecolumns ) ) { add_action( 'admin_head', 'aioseop_admin_head' ); if ( 'page' === $post_type ) { add_filter( 'manage_pages_columns', 'aioseop_mrt_pcolumns' ); } elseif ( 'attachment' === $post_type ) { add_filter( 'manage_media_columns', 'aioseop_mrt_pcolumns' ); } else { add_filter( 'manage_posts_columns', 'aioseop_mrt_pcolumns' ); } if ( 'attachment' === $post_type ) { add_action( 'manage_media_custom_column', 'aioseop_mrt_pccolumn', 10, 2 ); } elseif ( is_post_type_hierarchical( $post_type ) ) { add_action( 'manage_pages_custom_column', 'aioseop_mrt_pccolumn', 10, 2 ); } else { add_action( 'manage_posts_custom_column', 'aioseop_mrt_pccolumn', 10, 2 ); } } } } if ( ! function_exists( 'aioseop_mrt_pcolumns' ) ) { /** * AIOSEOP (MRT) P Columns * * @since ? * * @param $aioseopc * @return mixed */ function aioseop_mrt_pcolumns( $aioseopc ) { global $aioseop_options; $aioseopc['seotitle'] = __( 'SEO Title', 'all-in-one-seo-pack' ); $aioseopc['seodesc'] = __( 'SEO Description', 'all-in-one-seo-pack' ); if ( empty( $aioseop_options['aiosp_togglekeywords'] ) ) { $aioseopc['seokeywords'] = __( 'SEO Keywords', 'all-in-one-seo-pack' ); } return $aioseopc; } } if ( ! function_exists( 'aioseop_admin_head' ) ) { /** * AIOSEOP Admin Head * * @since ? */ function aioseop_admin_head() { wp_enqueue_script( 'aioseop_welcome_js', AIOSEOP_PLUGIN_URL . 'js/quickedit_functions.js', array( 'jquery' ), AIOSEOP_VERSION ); ?> ID; if ( ! empty( $_GET['aioseop_reset_notices'] ) ) { delete_user_meta( $user_id, 'aioseop_ignore_notice' ); } if ( ! empty( $_GET['aioseop_ignore_notice'] ) ) { add_user_meta( $user_id, 'aioseop_ignore_notice', $_GET['aioseop_ignore_notice'], false ); } } } } if ( ! function_exists( 'aioseop_output_notice' ) ) { /** * AIOSEOP Output Notice * * @since ? * * @param $message * @param string $id * @param string $class * @return bool */ function aioseop_output_notice( $message, $id = '', $class = 'updated fade' ) { $class = 'aioseop_notice ' . $class; if ( ! empty( $class ) ) { $class = ' class="' . esc_attr( $class ) . '"'; } if ( ! empty( $id ) ) { $class .= ' id="' . esc_attr( $id ) . '"'; } $dismiss = ' '; echo "" . wp_kses_post( $message ) . ''; return true; } } if ( ! function_exists( 'aioseop_output_dismissable_notice' ) ) { /** * AIOSEOP Output Dismissable Notice * * @since ? * * @param $message * @param string $id * @param string $class * @return bool */ function aioseop_output_dismissable_notice( $message, $id = '', $class = 'updated fade' ) { global $current_user; if ( ! empty( $current_user ) ) { $user_id = $current_user->ID; $msgid = md5( $message ); $ignore = get_user_meta( $user_id, 'aioseop_ignore_notice' ); if ( ! empty( $ignore ) && in_array( $msgid, $ignore ) ) { return false; } global $wp; $qa = array(); wp_parse_str( $_SERVER['QUERY_STRING'], $qa ); $qa['aioseop_ignore_notice'] = $msgid; $url = '?' . build_query( $qa ); $message = '

' . $message . '

Dismiss

'; } return aioseop_output_notice( $message, $id, $class ); } } if ( ! function_exists( 'aioseop_ajax_save_meta' ) ) { /** * AIOSEOP AJAX Save Meta */ function aioseop_ajax_save_meta() { if ( ! empty( $_POST['_inline_edit'] ) && ( 'undefined' !== $_POST['_inline_edit'] ) ) { check_ajax_referer( 'inlineeditnonce', '_inline_edit' ); } $post_id = intval( $_POST['post_id'] ); $new_meta = strip_tags( $_POST['new_meta'] ); $target = $_POST['target_meta']; check_ajax_referer( 'aioseop_meta_' . $target . '_' . $post_id, '_nonce' ); $result = ''; if ( in_array( $target, array( 'title', 'description', 'keywords', ) ) && current_user_can( 'edit_post', $post_id ) ) { update_post_meta( $post_id, '_aioseop_' . $target, esc_attr( $new_meta ) ); $result = get_post_meta( $post_id, '_aioseop_' . $target, true ); } else { die(); } if ( '' != $result ) : $label = "'; else : $label = "" . __( 'No', 'all-in-one-seo-pack' ) . ' ' . $target . ''; endif; $nonce = wp_create_nonce( "aioseop_meta_{$target}_{$post_id}" ); $output = ''; $output .= $label; die( "jQuery('div#aioseop_" . $target . '_' . $post_id . "').fadeOut('fast', function() { var my_label = " . json_encode( $output ) . "; jQuery('div#aioseop_" . $target . '_' . $post_id . "').html(my_label).fadeIn('fast'); });" ); } } if ( ! function_exists( 'aioseop_ajax_init' ) ) { /** * AIOSEOP AJAX Init * * @since ? */ function aioseop_ajax_init() { if ( ! empty( $_POST ) && ! empty( $_POST['settings'] ) && ( ! empty( $_POST['nonce-aioseop'] ) || ( ! empty( $_POST['nonce-aioseop-edit'] ) ) ) && ! empty( $_POST['options'] ) ) { $_POST = stripslashes_deep( $_POST ); $settings = esc_attr( $_POST['settings'] ); if ( ! defined( 'AIOSEOP_AJAX_MSG_TMPL' ) ) { define( 'AIOSEOP_AJAX_MSG_TMPL', "jQuery('div#aiosp_$settings').fadeOut('fast', function(){jQuery('div#aiosp_$settings').html('%s').fadeIn('fast');});" ); } if ( ! wp_verify_nonce( $_POST['nonce-aioseop'], 'aioseop-nonce' ) ) { die( sprintf( AIOSEOP_AJAX_MSG_TMPL, __( 'Unauthorized access; try reloading the page.', 'all-in-one-seo-pack' ) ) ); } } else { die( 0 ); } } } /** * AIOSEOP Embed Handler HTML * * @since 2.3a * * @param $return * @param $url * @param $attr * @return mixed */ function aioseop_embed_handler_html( $return, $url, $attr ) { return AIO_ProGeneral::aioseop_embed_handler_html(); } if ( ! function_exists( 'aioseop_ajax_save_url' ) ) { /** * AIOSEOP AJAX Save URL * * @since ? */ function aioseop_ajax_save_url() { $valid = true; $invalid_msg = null; $options = array(); aioseop_ajax_init(); parse_str( $_POST['options'], $options ); foreach ( $options as $k => $v ) { // all values are mandatory while adding to the sitemap. // this should work in the same way for news and video sitemaps too, but tackling only regular sitemaps for now. if ( 'sitemap_addl_pages' === $_POST['settings'] ) { if ( empty( $v ) ) { $valid = false; } elseif ( 'aiosp_sitemap_addl_url' === $k && ! aiosp_common::is_url_valid( $v ) ) { $valid = false; $invalid_msg = __( 'Please provide absolute URLs (including http or https).', 'all-in-one-seo-pack' ); } if ( ! $valid ) { break; } } $_POST[ $k ] = $v; } if ( $valid ) { $_POST['action'] = 'aiosp_update_module'; global $aiosp, $aioseop_modules; aioseop_load_modules(); $aiosp->admin_menu(); if ( ! empty( $_POST['settings'] ) && ( 'video_sitemap_addl_pages' === $_POST['settings'] ) ) { $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Video_Sitemap' ); } elseif ( ! empty( $_POST['settings'] ) && ( 'news_sitemap_addl_pages' === $_POST['settings'] ) ) { $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_News_Sitemap' ); } else { $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' ); } $_POST['location'] = null; $_POST['Submit'] = 'ajax'; $module->add_page_hooks(); $prefix = $module->get_prefix(); $_POST = $module->get_current_options( $_POST, null ); $module->handle_settings_updates( null ); $options = $module->get_current_options( array(), null ); $output = $module->display_custom_options( '', array( 'name' => $prefix . 'addl_pages', 'type' => 'custom', 'save' => true, 'value' => $options[ $prefix . 'addl_pages' ], 'attr' => '', ) ); $output = str_replace( "'", "\'", $output ); $output = str_replace( "\n", '\n', $output ); } else { if ( $invalid_msg ) { $output = $invalid_msg; } else { $output = __( 'All values are mandatory.', 'all-in-one-seo-pack' ); } } die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) ); } } if ( ! function_exists( 'aioseop_ajax_delete_url' ) ) { /** * AIOSEOP AJAX Delete URL * * @since ? */ function aioseop_ajax_delete_url() { aioseop_ajax_init(); $options = array(); $options = esc_attr( $_POST['options'] ); $_POST['action'] = 'aiosp_update_module'; global $aiosp, $aioseop_modules; aioseop_load_modules(); $aiosp->admin_menu(); $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Sitemap' ); $_POST['location'] = null; $_POST['Submit'] = 'ajax'; $module->add_page_hooks(); $_POST = (array) $module->get_current_options( $_POST, null ); if ( ! empty( $_POST['aiosp_sitemap_addl_pages'] ) && is_object( $_POST['aiosp_sitemap_addl_pages'] ) ) { $_POST['aiosp_sitemap_addl_pages'] = (array) $_POST['aiosp_sitemap_addl_pages']; } if ( ! empty( $_POST['aiosp_sitemap_addl_pages'] ) && ( ! empty( $_POST['aiosp_sitemap_addl_pages'][ $options ] ) ) ) { unset( $_POST['aiosp_sitemap_addl_pages'][ $options ] ); if ( empty( $_POST['aiosp_sitemap_addl_pages'] ) ) { $_POST['aiosp_sitemap_addl_pages'] = ''; } else { $_POST['aiosp_sitemap_addl_pages'] = json_encode( $_POST['aiosp_sitemap_addl_pages'] ); } $module->handle_settings_updates( null ); $options = $module->get_current_options( array(), null ); $output = $module->display_custom_options( '', array( 'name' => 'aiosp_sitemap_addl_pages', 'type' => 'custom', 'save' => true, 'value' => $options['aiosp_sitemap_addl_pages'], 'attr' => '', ) ); $output = str_replace( "'", "\'", $output ); $output = str_replace( "\n", '\n', $output ); } else { /* translators: %s is a placeholder and will be replaced with a number. */ $output = sprintf( __( 'Row %s not found; no rows were deleted.', 'all-in-one-seo-pack' ), esc_attr( $options ) ); } die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) ); } } if ( ! function_exists( 'aioseop_ajax_scan_header' ) ) { /** * AIOSEOP AJAX Scan Header * * @since ? */ function aioseop_ajax_scan_header() { $_POST['options'] = 'foo'; aioseop_ajax_init(); $options = array(); parse_str( $_POST['options'], $options ); foreach ( $options as $k => $v ) { $_POST[ $k ] = $v; } $_POST['action'] = 'aiosp_update_module'; $_POST['location'] = null; $_POST['Submit'] = 'ajax'; ob_start(); do_action( 'wp' ); global $aioseop_modules; $module = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Opengraph' ); wp_head(); $output = ob_get_clean(); global $aiosp; $output = $aiosp->html_string_to_array( $output ); $meta = ''; $metatags = array( 'facebook' => array( 'name' => 'property', 'value' => 'content', ), 'twitter' => array( 'name' => 'name', 'value' => 'value', ), ); $metadata = array( 'facebook' => array( 'title' => 'og:title', 'type' => 'og:type', 'url' => 'og:url', 'thumbnail' => 'og:image', 'sitename' => 'og:site_name', 'key' => 'fb:admins', 'description' => 'og:description', ), 'twitter' => array( 'card' => 'twitter:card', 'url' => 'twitter:url', 'title' => 'twitter:title', 'description' => 'twitter:description', 'thumbnail' => 'twitter:image', ), ); if ( ! empty( $output ) && ! empty( $output['head'] ) && ! empty( $output['head']['meta'] ) ) { foreach ( $output['head']['meta'] as $v ) { if ( ! empty( $v['@attributes'] ) ) { $m = $v['@attributes']; foreach ( $metatags as $type => $tags ) { if ( ! empty( $m[ $tags['name'] ] ) && ! empty( $m[ $tags['value'] ] ) ) { foreach ( $metadata[ $type ] as $tk => $tv ) { if ( $m[ $tags['name'] ] == $tv ) { /* This message is shown when a duplicate meta tag is found. %s is a placeholder and will be replaced with the name of the relevant meta tag. */ $meta .= "" . sprintf( __( 'Duplicate %s Meta', 'all-in-one-seo-pack' ), ucwords( $type ) ) . '' . ucwords( $tk ) . "{$m[$tags['name']]}{$m[$tags['value']]}\n"; } } } } } } } if ( empty( $meta ) ) { $meta = '' . __( 'No duplicate meta tags found.', 'all-in-one-seo-pack' ) . ''; } else { $meta = "" . $meta . '
Meta For SiteKind of MetaElement NameElement Value
'; $meta .= "

" . __( 'What Does This Mean?', 'all-in-one-seo-pack' ) . "

" /* translators: %s is a placeholder, which means that it should not be translated. It will be replaced with the name of the plugin, All in One SEO Pack. */ . '

' . sprintf( __( '%s has detected that a plugin(s) or theme is also outputting social meta tags on your site. You can view this social meta in the source code of your site (check your browser help for instructions on how to view source code).', 'all-in-one-seo-pack' ), AIOSEOP_PLUGIN_NAME ) . '

' . __( 'You may prefer to use the social meta tags that are being output by the other plugin(s) or theme. If so, then you should deactivate this Social Meta feature in the Feature Manager.', 'all-in-one-seo-pack' ) . '

' . __( 'You should avoid duplicate social meta tags. You can use these free tools from Facebook and Twitter to validate your social meta and check for errors:', 'all-in-one-seo-pack' ) . '

'; foreach ( array( 'https://developers.facebook.com/tools/debug', 'https://dev.twitter.com/docs/cards/validation/validator', ) as $link ) { $meta .= "{$link}
"; } $meta .= '

' . __( 'Please refer to the document for each tool for help in using these to debug your social meta.', 'all-in-one-seo-pack' ) . '

'; } $output = $meta; $output = str_replace( "'", "\'", $output ); $output = str_replace( "\n", '\n', $output ); die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) ); } } if ( ! function_exists( 'aioseop_ajax_save_settings' ) ) { /** * AIOSEOP AJAX Save Settings * * @since ? */ function aioseop_ajax_save_settings() { aioseop_ajax_init(); $options = array(); parse_str( $_POST['options'], $options ); $_POST = $options; $_POST['action'] = 'aiosp_update_module'; global $aiosp, $aioseop_modules; aioseop_load_modules(); $aiosp->admin_menu(); $module = $aioseop_modules->return_module( $_POST['module'] ); unset( $_POST['module'] ); if ( empty( $_POST['location'] ) ) { $_POST['location'] = null; } $_POST['Submit'] = 'ajax'; $module->add_page_hooks(); $output = $module->handle_settings_updates( $_POST['location'] ); if ( AIOSEOPPRO ) { $output = '

' . $output . '

'; } else { $output = '

' . $output . '

'; } if ( defined( 'AIOSEOP_UNIT_TESTING' ) ) { return; } die( sprintf( AIOSEOP_AJAX_MSG_TMPL, $output ) ); } } if ( ! function_exists( 'aioseop_ajax_get_menu_links' ) ) { /** * AIOSEOP AJAX Get Menu Links * * @since ? */ function aioseop_ajax_get_menu_links() { aioseop_ajax_init(); $options = array(); parse_str( $_POST['options'], $options ); $_POST = $options; $_POST['action'] = 'aiosp_update_module'; global $aiosp, $aioseop_modules; aioseop_load_modules(); $aiosp->admin_menu(); if ( empty( $_POST['location'] ) ) { $_POST['location'] = null; } $_POST['Submit'] = 'ajax'; $modlist = $aioseop_modules->get_loaded_module_list(); $links = array(); $link_list = array(); $link = $aiosp->get_admin_links(); if ( ! empty( $link ) ) { foreach ( $link as $l ) { if ( ! empty( $l ) ) { if ( empty( $link_list[ $l['order'] ] ) ) { $link_list[ $l['order'] ] = array(); } $link_list[ $l['order'] ][ $l['title'] ] = $l['href']; } } } if ( ! empty( $modlist ) ) { foreach ( $modlist as $k => $v ) { $mod = $aioseop_modules->return_module( $v ); if ( is_object( $mod ) ) { $mod->add_page_hooks(); $link = $mod->get_admin_links(); foreach ( $link as $l ) { if ( ! empty( $l ) ) { if ( empty( $link_list[ $l['order'] ] ) ) { $link_list[ $l['order'] ] = array(); } $link_list[ $l['order'] ][ $l['title'] ] = $l['href']; } } } } } if ( ! empty( $link_list ) ) { ksort( $link_list ); foreach ( $link_list as $ll ) { foreach ( $ll as $k => $v ) { $links[ $k ] = $v; } } } $output = ''; die( sprintf( "jQuery('{$_POST['target']}').fadeOut('fast', function(){jQuery('{$_POST['target']}').html('%s').fadeIn('fast');});", addslashes( $output ) ) ); } } if ( ! function_exists( 'aioseop_mrt_pccolumn' ) ) { /** * AIOSEOP (MRT) Column * * @since ? * * @param $aioseopcn * @param $aioseoppi */ function aioseop_mrt_pccolumn( $aioseopcn, $aioseoppi ) { $id = $aioseoppi; $target = null; if ( 'seotitle' === $aioseopcn ) { $target = 'title'; } if ( 'seokeywords' === $aioseopcn ) { $target = 'keywords'; } if ( 'seodesc' === $aioseopcn ) { $target = 'description'; } if ( ! $target ) { return; } if ( current_user_can( 'edit_post', $id ) ) { ?>
" . $content . ''; else : $label = "" . __( 'No', 'all-in-one-seo-pack' ) . ' ' . $target . ''; endif; $nonce = wp_create_nonce( "aioseop_meta_{$target}_{$id}" ); echo ''; echo $label; ?>
$v ) { $excluded[ $k ] = trim( $v ); if ( empty( $excluded[ $k ] ) ) { unset( $excluded[ $k ] ); } } } if ( empty( $excluded ) ) { $excluded = null; } } } if ( ! empty( $excluded ) ) { if ( null === $url ) { $url = $_SERVER['REQUEST_URI']; } else { $url = wp_parse_url( $url ); if ( ! empty( $url['path'] ) ) { $url = $url['path']; } else { return false; } } if ( ! empty( $url ) ) { foreach ( $excluded as $exedd ) { if ( $exedd && ( stripos( $url, $exedd ) !== false ) ) { return true; } } } } return false; } } if ( ! function_exists( 'aioseop_add_contactmethods' ) ) { /** * AIOSEOP Add Contact Methods * * @since ? * * @param $contactmethods * @return mixed */ function aioseop_add_contactmethods( $contactmethods ) { global $aioseop_options, $aioseop_modules; if ( ! empty( $aioseop_modules ) && is_object( $aioseop_modules ) ) { $m = $aioseop_modules->return_module( 'All_in_One_SEO_Pack_Opengraph' ); if ( ( false !== $m ) && is_object( $m ) ) { if ( $m->option_isset( 'twitter_creator' ) || $m->option_isset( 'facebook_author' ) ) { $contactmethods['aioseop_edit_profile_header'] = AIOSEOP_PLUGIN_NAME; } if ( $m->option_isset( 'twitter_creator' ) ) { $contactmethods['twitter'] = 'Twitter'; } if ( $m->option_isset( 'facebook_author' ) ) { $contactmethods['facebook'] = 'Facebook'; } } } return $contactmethods; } } if ( ! function_exists( 'aioseop_localize_script_data' ) ) { /** * AIOSEOP Localize Script Data * * Used by the module base class script enqueue to localize data. * * @since ? */ function aioseop_localize_script_data() { static $loaded = 0; if ( ! $loaded ) { $data = apply_filters( 'aioseop_localize_script_data', array() ); wp_localize_script( 'aioseop-module-script', 'aiosp_data', $data ); $loaded = 1; } } } if ( ! function_exists( 'aioseop_array_insert_after' ) ) { /** * AIOSEOP Array Insert After * * Utility function for inserting elements into associative arrays by key. * * @since ? * * @param $arr * @param $insert_key * @param $new_values * @return array */ function aioseop_array_insert_after( $arr, $insert_key, $new_values ) { $keys = array_keys( $arr ); $vals = array_values( $arr ); $insert_after = array_search( $insert_key, $keys ) + 1; $keys2 = array_splice( $keys, $insert_after ); $vals2 = array_splice( $vals, $insert_after ); foreach ( $new_values as $k => $v ) { $keys[] = $k; $vals[] = $v; } return array_merge( array_combine( $keys, $vals ), array_combine( $keys2, $vals2 ) ); } } if ( ! function_exists( 'fnmatch' ) ) { /** * Filename Match * * Support for fnmatch() doesn't exist on Windows pre PHP 5.3. * * @since ? * * @param $pattern * @param $string * @return int */ function fnmatch( $pattern, $string ) { return preg_match( '#^' . strtr( preg_quote( $pattern, '#' ), array( '\*' => '.*', '\?' => '.', ) ) . '$#i', $string ); } } if ( ! function_exists( 'aiosp_log' ) ) { /** * AIOSEOP Log * * @since 2.4.10 * * @param $log * @param bool $force */ function aiosp_log( $log, $force = false ) { global $aioseop_options; if ( ( ! empty( $aioseop_options ) && isset( $aioseop_options['aiosp_do_log'] ) && $aioseop_options['aiosp_do_log'] ) || $force || defined( 'AIOSEOP_DO_LOG' ) ) { if ( is_array( $log ) || is_object( $log ) ) { error_log( print_r( $log, true ) ); } else { error_log( $log ); } } } } /** * AIOSEOP Update User Visibility Notice * * @since ? * @deprecated 3.0 */ function aioseop_update_user_visibilitynotice() { update_user_meta( get_current_user_id(), 'aioseop_visibility_notice_dismissed', true ); } /** * AIOSEOP Update Yoast Detected Notice * * @since ? * @deprecated 3.0 */ function aioseop_update_yst_detected_notice() { update_user_meta( get_current_user_id(), 'aioseop_yst_detected_notice_dismissed', true ); } /** * Returns home_url() value compatible for any use. * Thought for compatibility purposes. * * @since 2.3.12.3 * * @param string $path Relative path to home_url(). * * @return string url. */ function aioseop_home_url( $path = '/' ) { $url = apply_filters( 'aioseop_home_url', $path ); return $path === $url ? home_url( $path ) : $url; } if ( ! function_exists( 'aiosp_include_images' ) ) { /** * AIOSEOP Include Images * * @since 2.4.2 * * @return bool */ function aiosp_include_images() { if ( false === apply_filters( 'aioseo_include_images_in_sitemap', true ) ) { return false; } global $aioseop_options; if ( isset( $aioseop_options['modules'] ) && isset( $aioseop_options['modules']['aiosp_sitemap_options'] ) && isset( $aioseop_options['modules']['aiosp_sitemap_options']['aiosp_sitemap_images'] ) && 'on' === $aioseop_options['modules']['aiosp_sitemap_options']['aiosp_sitemap_images'] ) { return false; } return true; } } if ( ! function_exists( 'aioseop_formatted_date' ) ) { /** * AIOSEOP Formatted Date * * Get formatted date. For custom formatting, the user has 2 options: * 1. provide the native date_i18n filter. * 2. provide a custom aioseop_format_date filter. * * @since 2.5 * * @param int $date Date in UNIX timestamp format. * @param string $format Require date format. */ function aioseop_formatted_date( $date = null, $format = null ) { if ( ! $format ) { $format = get_option( 'date_format' ); } if ( ! $date ) { $date = time(); } $formatted_date = date_i18n( $format, $date ); return apply_filters( 'aioseop_format_date', $formatted_date, $date, $format ); } } /** * The aioseop_get_menu_icon() function. * * Gets the menu icon as a base64 data URI. * * @since 3.0.0 * @since 3.2.0 Moved SVG code to dedicated aioseop_get_logo() function. * * @return string base64 data URI with menu icon. */ if ( ! function_exists( 'aioseop_get_menu_icon' ) ) { function aioseop_get_menu_icon() { return 'data:image/svg+xml;base64,' . base64_encode( aioseop_get_logo( 16, 16, '#A0A5AA' ) ); } } if ( ! function_exists( 'aioseop_get_logo' ) ) { /** * The aioseop_get_logo() function. * * Gets the plugin logo as an SVG in HTML format. * * @since 3.2.0 * * @return string SVG in HTML format. */ function aioseop_get_logo( $width, $height, $colour_code ) { return ' '; } } /** * AIOSEOP Do Shortcodes * * Runs shortcodes in autogenerated titles & descriptions. * * @since 3.0.0 * * @param string $content Content of the post * * @return string $content Content after shortcodes have been run. */ function aioseop_do_shortcodes( $content ) { $conflicting_shortcodes = array( 'WooCommerce Login' => '[woocommerce_my_account]', 'WooCommerce Checkout' => '[woocommerce_checkout]', 'WooCommerce Order Tracking' => '[woocommerce_order_tracking]', 'WooCommerce Cart' => '[woocommerce_cart]', ); $rtn_conflict_shortcodes = array(); foreach ( $conflicting_shortcodes as $shortcode ) { // Second check is needed for shortcodes in Gutenberg Classic blocks. if ( stripos( $content, $shortcode, 0 ) || 0 === stripos( $content, $shortcode, 0 ) ) { global $shortcode_tags; $shortcode_tag = str_replace( array( '[', ']' ), '', $shortcode ); if ( array_key_exists( $shortcode_tag, $shortcode_tags ) ) { $rtn_conflict_shortcodes[ $shortcode_tag ] = $shortcode_tags[ $shortcode_tag ]; } } } if ( ! empty( $rtn_conflict_shortcodes ) ) { return aioseop_do_shortcode_helper( $content, $rtn_conflict_shortcodes ); } return do_shortcode( $content ); } /** * AIOSEOP Do Shortcode Helper * * Ignores shortcodes that are known to conflict. * Acts as a helper function for aioseop_do_shortcodes(). * * @since 3.0.0 * * @param string $content Content of the post * @param array $conflicting_shortcodes List of conflicting shortcodes * * @return string $content Content after shortcodes have been run whilst ignoring conflicting shortcodes. */ function aioseop_do_shortcode_helper( $content, $conflicting_shortcodes ) { foreach ( $conflicting_shortcodes as $shortcode_tag => $shortcode_callback ) { remove_shortcode( $shortcode_tag ); } $content = do_shortcode( $content ); // Adds shortcodes back since remove_shortcode() disables them site-wide. foreach ( $conflicting_shortcodes as $shortcode_tag => $shortcode_callback ) { add_shortcode( $shortcode_tag, $shortcode_callback ); } return $content; } /** * The aioseop_is_woocommerce_active() function. * * Checks whether WooCommerce is active. * * @since 3.2.0 * * @return bool */ if ( ! function_exists( 'aioseop_is_woocommerce_active' ) ) { function aioseop_is_woocommerce_active() { return class_exists( 'woocommerce' ); } } /** * The aioseop_get_page_number() function. * * Returns the number of the current page. * This can be used to determine if we're on a paginated page for example. * * @since ? * @since 3.2.0 * * @return int $page_number */ if ( ! function_exists( 'aioseop_get_page_number' ) ) { function aioseop_get_page_number() { global $post; if ( is_singular() && false === strpos( $post->post_content, '', 0 ) ) { return null; } // 'page' has to be used to determine the pagination number on a static front page. $page_number = get_query_var( 'page' ); if ( empty( $page_number ) ) { $page_number = get_query_var( 'paged' ); } return $page_number; } } /** Gets the major version of a sementic plugin version. * * @since 3.2.8 * * @param string $version * @return string */ function get_major_version( $version ) { if ( ! strpos( $version, '.' ) ) { // No period. Return version which should just look like "x". return $version; } $offset1 = strpos( $version, '.' ); // Location of first period. if ( ! strpos( $version, '.', $offset1 + 1 ) ) { // No second period. Return version which should just look like "x.y". return $version; } // If we get here, there's at least an "x.y.z". $offset2 = strpos( $version, '.', $offset1 + 1 ); // Location of second period. $major_version = substr( $version, 0, $offset2 ); return $major_version; }