Advertisement
Guest User

Functions.php for twentythirteen

a guest
Feb 5th, 2014
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 25.67 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Twenty Twelve functions and definitions
  4.  *
  5.  * Sets up the theme and provides some helper functions, which are used
  6.  * in the theme as custom template tags. Others are attached to action and
  7.  * filter hooks in WordPress to change core functionality.
  8.  *
  9.  * When using a child theme (see http://codex.wordpress.org/Theme_Development and
  10.  * http://codex.wordpress.org/Child_Themes), you can override certain functions
  11.  * (those wrapped in a function_exists() call) by defining them first in your child theme's
  12.  * functions.php file. The child theme's functions.php file is included before the parent
  13.  * theme's file, so the child theme functions would be used.
  14.  *
  15.  * Functions that are not pluggable (not wrapped in function_exists()) are instead attached
  16.  * to a filter or action hook.
  17.  *
  18.  * For more information on hooks, actions, and filters, @link http://codex.wordpress.org/Plugin_API
  19.  *
  20.  * @package WordPress
  21.  * @subpackage Twenty_Twelve
  22.  * @since Twenty Twelve 1.0
  23.  */
  24.  
  25. // Set up the content width value based on the theme's design and stylesheet.
  26. if ( ! isset( $content_width ) )
  27.     $content_width = 625;
  28.  
  29. /**
  30.  * Twenty Twelve setup.
  31.  *
  32.  * Sets up theme defaults and registers the various WordPress features that
  33.  * Twenty Twelve supports.
  34.  *
  35.  * @uses load_theme_textdomain() For translation/localization support.
  36.  * @uses add_editor_style() To add a Visual Editor stylesheet.
  37.  * @uses add_theme_support() To add support for post thumbnails, automatic feed links,
  38.  *  custom background, and post formats.
  39.  * @uses register_nav_menu() To add support for navigation menus.
  40.  * @uses set_post_thumbnail_size() To set a custom post thumbnail size.
  41.  *
  42.  * @since Twenty Twelve 1.0
  43.  */
  44. function twentytwelve_setup() {
  45.     /*
  46.      * Makes Twenty Twelve available for translation.
  47.      *
  48.      * Translations can be added to the /languages/ directory.
  49.      * If you're building a theme based on Twenty Twelve, use a find and replace
  50.      * to change 'twentytwelve' to the name of your theme in all the template files.
  51.      */
  52.     load_theme_textdomain( 'twentytwelve', get_template_directory() . '/languages' );
  53.  
  54.     // This theme styles the visual editor with editor-style.css to match the theme style.
  55.     add_editor_style();
  56.  
  57.     // Adds RSS feed links to <head> for posts and comments.
  58.     add_theme_support( 'automatic-feed-links' );
  59.  
  60.     // This theme supports a variety of post formats.
  61.     add_theme_support( 'post-formats', array( 'aside', 'image', 'link', 'quote', 'status' ) );
  62.  
  63.     // This theme uses wp_nav_menu() in one location.
  64.     register_nav_menu( 'primary', __( 'Primary Menu', 'twentytwelve' ) );
  65.  
  66.     /*
  67.      * This theme supports custom background color and image,
  68.      * and here we also set up the default background color.
  69.      */
  70.     add_theme_support( 'custom-background', array(
  71.         'default-color' => 'e6e6e6',
  72.     ) );
  73.  
  74.     // This theme uses a custom image size for featured images, displayed on "standard" posts.
  75.     add_theme_support( 'post-thumbnails' );
  76.     set_post_thumbnail_size( 624, 9999 ); // Unlimited height, soft crop
  77. }
  78. add_action( 'after_setup_theme', 'twentytwelve_setup' );
  79.  
  80. /**
  81.  * Add support for a custom header image.
  82.  */
  83. require( get_template_directory() . '/inc/custom-header.php' );
  84.  
  85. /**
  86.  * Return the Google font stylesheet URL if available.
  87.  *
  88.  * The use of Open Sans by default is localized. For languages that use
  89.  * characters not supported by the font, the font can be disabled.
  90.  *
  91.  * @since Twenty Twelve 1.2
  92.  *
  93.  * @return string Font stylesheet or empty string if disabled.
  94.  */
  95. function twentytwelve_get_font_url() {
  96.     $font_url = '';
  97.  
  98.     /* translators: If there are characters in your language that are not supported
  99.      * by Open Sans, translate this to 'off'. Do not translate into your own language.
  100.      */
  101.     if ( 'off' !== _x( 'on', 'Open Sans font: on or off', 'twentytwelve' ) ) {
  102.         $subsets = 'latin,latin-ext';
  103.  
  104.         /* translators: To add an additional Open Sans character subset specific to your language,
  105.          * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language.
  106.          */
  107.         $subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)', 'twentytwelve' );
  108.  
  109.         if ( 'cyrillic' == $subset )
  110.             $subsets .= ',cyrillic,cyrillic-ext';
  111.         elseif ( 'greek' == $subset )
  112.             $subsets .= ',greek,greek-ext';
  113.         elseif ( 'vietnamese' == $subset )
  114.             $subsets .= ',vietnamese';
  115.  
  116.         $protocol = is_ssl() ? 'https' : 'http';
  117.         $query_args = array(
  118.             'family' => 'Open+Sans:400italic,700italic,400,700',
  119.             'subset' => $subsets,
  120.         );
  121.         $font_url = add_query_arg( $query_args, "$protocol://fonts.googleapis.com/css" );
  122.     }
  123.  
  124.     return $font_url;
  125. }
  126.  
  127. /**
  128.  * Enqueue scripts and styles for front-end.
  129.  *
  130.  * @since Twenty Twelve 1.0
  131.  *
  132.  * @return void
  133.  */
  134. function twentytwelve_scripts_styles() {
  135.     global $wp_styles;
  136.  
  137.     /*
  138.      * Adds JavaScript to pages with the comment form to support
  139.      * sites with threaded comments (when in use).
  140.      */
  141.     if ( is_singular() && comments_open() && get_option( 'thread_comments' ) )
  142.         wp_enqueue_script( 'comment-reply' );
  143.  
  144.     // Adds JavaScript for handling the navigation menu hide-and-show behavior.
  145.     wp_enqueue_script( 'twentytwelve-navigation', get_template_directory_uri() . '/js/navigation.js', array(), '1.0', true );
  146.  
  147.     $font_url = twentytwelve_get_font_url();
  148.     if ( ! empty( $font_url ) )
  149.         wp_enqueue_style( 'twentytwelve-fonts', esc_url_raw( $font_url ), array(), null );
  150.  
  151.     // Loads our main stylesheet.
  152.     wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() );
  153.  
  154.     // Loads the Internet Explorer specific stylesheet.
  155.     wp_enqueue_style( 'twentytwelve-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentytwelve-style' ), '20121010' );
  156.     $wp_styles->add_data( 'twentytwelve-ie', 'conditional', 'lt IE 9' );
  157. }
  158. add_action( 'wp_enqueue_scripts', 'twentytwelve_scripts_styles' );
  159.  
  160. /**
  161.  * Filter TinyMCE CSS path to include Google Fonts.
  162.  *
  163.  * Adds additional stylesheets to the TinyMCE editor if needed.
  164.  *
  165.  * @uses twentytwelve_get_font_url() To get the Google Font stylesheet URL.
  166.  *
  167.  * @since Twenty Twelve 1.2
  168.  *
  169.  * @param string $mce_css CSS path to load in TinyMCE.
  170.  * @return string Filtered CSS path.
  171.  */
  172. function twentytwelve_mce_css( $mce_css ) {
  173.     $font_url = twentytwelve_get_font_url();
  174.  
  175.     if ( empty( $font_url ) )
  176.         return $mce_css;
  177.  
  178.     if ( ! empty( $mce_css ) )
  179.         $mce_css .= ',';
  180.  
  181.     $mce_css .= esc_url_raw( str_replace( ',', '%2C', $font_url ) );
  182.  
  183.     return $mce_css;
  184. }
  185. add_filter( 'mce_css', 'twentytwelve_mce_css' );
  186.  
  187. /**
  188.  * Filter the page title.
  189.  *
  190.  * Creates a nicely formatted and more specific title element text
  191.  * for output in head of document, based on current view.
  192.  *
  193.  * @since Twenty Twelve 1.0
  194.  *
  195.  * @param string $title Default title text for current view.
  196.  * @param string $sep Optional separator.
  197.  * @return string Filtered title.
  198.  */
  199. function twentytwelve_wp_title( $title, $sep ) {
  200.     global $paged, $page;
  201.  
  202.     if ( is_feed() )
  203.         return $title;
  204.  
  205.     // Add the site name.
  206.     $title .= get_bloginfo( 'name' );
  207.  
  208.     // Add the site description for the home/front page.
  209.     $site_description = get_bloginfo( 'description', 'display' );
  210.     if ( $site_description && ( is_home() || is_front_page() ) )
  211.         $title = "$title $sep $site_description";
  212.  
  213.     // Add a page number if necessary.
  214.     if ( $paged >= 2 || $page >= 2 )
  215.         $title = "$title $sep " . sprintf( __( 'Page %s', 'twentytwelve' ), max( $paged, $page ) );
  216.  
  217.     return $title;
  218. }
  219. add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 );
  220.  
  221. /**
  222.  * Filter the page menu arguments.
  223.  *
  224.  * Makes our wp_nav_menu() fallback -- wp_page_menu() -- show a home link.
  225.  *
  226.  * @since Twenty Twelve 1.0
  227.  */
  228. function twentytwelve_page_menu_args( $args ) {
  229.     if ( ! isset( $args['show_home'] ) )
  230.         $args['show_home'] = true;
  231.     return $args;
  232. }
  233. add_filter( 'wp_page_menu_args', 'twentytwelve_page_menu_args' );
  234.  
  235. /**
  236.  * Register sidebars.
  237.  *
  238.  * Registers our main widget area and the front page widget areas.
  239.  *
  240.  * @since Twenty Twelve 1.0
  241.  */
  242. function twentytwelve_widgets_init() {
  243.     register_sidebar( array(
  244.         'name' => __( 'Main Sidebar', 'twentytwelve' ),
  245.         'id' => 'sidebar-1',
  246.         'description' => __( 'Appears on posts and pages except the optional Front Page template, which has its own widgets', 'twentytwelve' ),
  247.         'before_widget' => '<aside id="%1$s" class="widget %2$s">',
  248.         'after_widget' => '</aside>',
  249.         'before_title' => '<h3 class="widget-title">',
  250.         'after_title' => '</h3>',
  251.     ) );
  252.  
  253.     register_sidebar( array(
  254.         'name' => __( 'First Front Page Widget Area', 'twentytwelve' ),
  255.         'id' => 'sidebar-2',
  256.         'description' => __( 'Appears when using the optional Front Page template with a page set as Static Front Page', 'twentytwelve' ),
  257.         'before_widget' => '<aside id="%1$s" class="widget %2$s">',
  258.         'after_widget' => '</aside>',
  259.         'before_title' => '<h3 class="widget-title">',
  260.         'after_title' => '</h3>',
  261.     ) );
  262.  
  263.     register_sidebar( array(
  264.         'name' => __( 'Second Front Page Widget Area', 'twentytwelve' ),
  265.         'id' => 'sidebar-3',
  266.         'description' => __( 'Appears when using the optional Front Page template with a page set as Static Front Page', 'twentytwelve' ),
  267.         'before_widget' => '<aside id="%1$s" class="widget %2$s">',
  268.         'after_widget' => '</aside>',
  269.         'before_title' => '<h3 class="widget-title">',
  270.         'after_title' => '</h3>',
  271.     ) );
  272. }
  273. add_action( 'widgets_init', 'twentytwelve_widgets_init' );
  274.  
  275. if ( ! function_exists( 'twentytwelve_content_nav' ) ) :
  276. /**
  277.  * Displays navigation to next/previous pages when applicable.
  278.  *
  279.  * @since Twenty Twelve 1.0
  280.  */
  281. function twentytwelve_content_nav( $html_id ) {
  282.     global $wp_query;
  283.  
  284.     $html_id = esc_attr( $html_id );
  285.  
  286.     if ( $wp_query->max_num_pages > 1 ) : ?>
  287.         <nav id="<?php echo $html_id; ?>" class="navigation" role="navigation">
  288.             <h3 class="assistive-text"><?php _e( 'Post navigation', 'twentytwelve' ); ?></h3>
  289.             <div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">&larr;</span> Older posts', 'twentytwelve' ) ); ?></div>
  290.             <div class="nav-next"><?php previous_posts_link( __( 'Newer posts <span class="meta-nav">&rarr;</span>', 'twentytwelve' ) ); ?></div>
  291.         </nav><!-- #<?php echo $html_id; ?> .navigation -->
  292.     <?php endif;
  293. }
  294. endif;
  295.  
  296. if ( ! function_exists( 'twentytwelve_comment' ) ) :
  297. /**
  298.  * Template for comments and pingbacks.
  299.  *
  300.  * To override this walker in a child theme without modifying the comments template
  301.  * simply create your own twentytwelve_comment(), and that function will be used instead.
  302.  *
  303.  * Used as a callback by wp_list_comments() for displaying the comments.
  304.  *
  305.  * @since Twenty Twelve 1.0
  306.  *
  307.  * @return void
  308.  */
  309. function twentytwelve_comment( $comment, $args, $depth ) {
  310.     $GLOBALS['comment'] = $comment;
  311.     switch ( $comment->comment_type ) :
  312.         case 'pingback' :
  313.         case 'trackback' :
  314.         // Display trackbacks differently than normal comments.
  315.     ?>
  316.     <li <?php comment_class(); ?> id="comment-<?php comment_ID(); ?>">
  317.         <p><?php _e( 'Pingback:', 'twentytwelve' ); ?> <?php comment_author_link(); ?> <?php edit_comment_link( __( '(Edit)', 'twentytwelve' ), '<span class="edit-link">', '</span>' ); ?></p>
  318.     <?php
  319.             break;
  320.         default :
  321.         // Proceed with normal comments.
  322.         global $post;
  323.     ?>
  324.     <li <?php comment_class(); ?> id="li-comment-<?php comment_ID(); ?>">
  325.         <article id="comment-<?php comment_ID(); ?>" class="comment">
  326.             <header class="comment-meta comment-author vcard">
  327.                 <?php
  328.                     echo get_avatar( $comment, 44 );
  329.                     printf( '<cite><b class="fn">%1$s</b> %2$s</cite>',
  330.                         get_comment_author_link(),
  331.                         // If current post author is also comment author, make it known visually.
  332.                         ( $comment->user_id === $post->post_author ) ? '<span>' . __( 'Post author', 'twentytwelve' ) . '</span>' : ''
  333.                     );
  334.                     printf( '<a href="%1$s"><time datetime="%2$s">%3$s</time></a>',
  335.                         esc_url( get_comment_link( $comment->comment_ID ) ),
  336.                         get_comment_time( 'c' ),
  337.                         /* translators: 1: date, 2: time */
  338.                         sprintf( __( '%1$s at %2$s', 'twentytwelve' ), get_comment_date(), get_comment_time() )
  339.                     );
  340.                 ?>
  341.             </header><!-- .comment-meta -->
  342.  
  343.             <?php if ( '0' == $comment->comment_approved ) : ?>
  344.                 <p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.', 'twentytwelve' ); ?></p>
  345.             <?php endif; ?>
  346.  
  347.             <section class="comment-content comment">
  348.                 <?php comment_text(); ?>
  349.                 <?php edit_comment_link( __( 'Edit', 'twentytwelve' ), '<p class="edit-link">', '</p>' ); ?>
  350.             </section><!-- .comment-content -->
  351.  
  352.             <div class="reply">
  353.                 <?php comment_reply_link( array_merge( $args, array( 'reply_text' => __( 'Reply', 'twentytwelve' ), 'after' => ' <span>&darr;</span>', 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
  354.             </div><!-- .reply -->
  355.         </article><!-- #comment-## -->
  356.     <?php
  357.         break;
  358.     endswitch; // end comment_type check
  359. }
  360. endif;
  361.  
  362. if ( ! function_exists( 'twentytwelve_entry_meta' ) ) :
  363. /**
  364.  * Set up post entry meta.
  365.  *
  366.  * Prints HTML with meta information for current post: categories, tags, permalink, author, and date.
  367.  *
  368.  * Create your own twentytwelve_entry_meta() to override in a child theme.
  369.  *
  370.  * @since Twenty Twelve 1.0
  371.  *
  372.  * @return void
  373.  */
  374. function twentytwelve_entry_meta() {
  375.     // Translators: used between list items, there is a space after the comma.
  376.     $categories_list = get_the_category_list( __( ', ', 'twentytwelve' ) );
  377.  
  378.     // Translators: used between list items, there is a space after the comma.
  379.     $tag_list = get_the_tag_list( '', __( ', ', 'twentytwelve' ) );
  380.  
  381.     $date = sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><time class="entry-date" datetime="%3$s">%4$s</time></a>',
  382.         esc_url( get_permalink() ),
  383.         esc_attr( get_the_time() ),
  384.         esc_attr( get_the_date( 'c' ) ),
  385.         esc_html( get_the_date() )
  386.     );
  387.  
  388.     $author = sprintf( '<span class="author vcard"><a class="url fn n" href="%1$s" title="%2$s" rel="author">%3$s</a></span>',
  389.         esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),
  390.         esc_attr( sprintf( __( 'View all posts by %s', 'twentytwelve' ), get_the_author() ) ),
  391.         get_the_author()
  392.     );
  393.  
  394.     // Translators: 1 is category, 2 is tag, 3 is the date and 4 is the author's name.
  395.     if ( $tag_list ) {
  396.         $utility_text = __( 'This entry was posted in %1$s and tagged %2$s on %3$s<span class="by-author"> by %4$s</span>.', 'twentytwelve' );
  397.     } elseif ( $categories_list ) {
  398.         $utility_text = __( 'This entry was posted in %1$s on %3$s<span class="by-author"> by %4$s</span>.', 'twentytwelve' );
  399.     } else {
  400.         $utility_text = __( 'This entry was posted on %3$s<span class="by-author"> by %4$s</span>.', 'twentytwelve' );
  401.     }
  402.  
  403.     printf(
  404.         $utility_text,
  405.         $categories_list,
  406.         $tag_list,
  407.         $date,
  408.         $author
  409.     );
  410. }
  411. endif;
  412.  
  413. /**
  414.  * Extend the default WordPress body classes.
  415.  *
  416.  * Extends the default WordPress body class to denote:
  417.  * 1. Using a full-width layout, when no active widgets in the sidebar
  418.  *    or full-width template.
  419.  * 2. Front Page template: thumbnail in use and number of sidebars for
  420.  *    widget areas.
  421.  * 3. White or empty background color to change the layout and spacing.
  422.  * 4. Custom fonts enabled.
  423.  * 5. Single or multiple authors.
  424.  *
  425.  * @since Twenty Twelve 1.0
  426.  *
  427.  * @param array $classes Existing class values.
  428.  * @return array Filtered class values.
  429.  */
  430. function twentytwelve_body_class( $classes ) {
  431.     $background_color = get_background_color();
  432.     $background_image = get_background_image();
  433.  
  434.     if ( ! is_active_sidebar( 'sidebar-1' ) || is_page_template( 'page-templates/full-width.php' ) )
  435.         $classes[] = 'full-width';
  436.  
  437.     if ( is_page_template( 'page-templates/front-page.php' ) ) {
  438.         $classes[] = 'template-front-page';
  439.         if ( has_post_thumbnail() )
  440.             $classes[] = 'has-post-thumbnail';
  441.         if ( is_active_sidebar( 'sidebar-2' ) && is_active_sidebar( 'sidebar-3' ) )
  442.             $classes[] = 'two-sidebars';
  443.     }
  444.  
  445.     if ( empty( $background_image ) ) {
  446.         if ( empty( $background_color ) )
  447.             $classes[] = 'custom-background-empty';
  448.         elseif ( in_array( $background_color, array( 'fff', 'ffffff' ) ) )
  449.             $classes[] = 'custom-background-white';
  450.     }
  451.  
  452.     // Enable custom font class only if the font CSS is queued to load.
  453.     if ( wp_style_is( 'twentytwelve-fonts', 'queue' ) )
  454.         $classes[] = 'custom-font-enabled';
  455.  
  456.     if ( ! is_multi_author() )
  457.         $classes[] = 'single-author';
  458.  
  459.     return $classes;
  460. }
  461. add_filter( 'body_class', 'twentytwelve_body_class' );
  462.  
  463. /**
  464.  * Adjust content width in certain contexts.
  465.  *
  466.  * Adjusts content_width value for full-width and single image attachment
  467.  * templates, and when there are no active widgets in the sidebar.
  468.  *
  469.  * @since Twenty Twelve 1.0
  470.  *
  471.  * @return void
  472.  */
  473. function twentytwelve_content_width() {
  474.     if ( is_page_template( 'page-templates/full-width.php' ) || is_attachment() || ! is_active_sidebar( 'sidebar-1' ) ) {
  475.         global $content_width;
  476.         $content_width = 960;
  477.     }
  478. }
  479. add_action( 'template_redirect', 'twentytwelve_content_width' );
  480.  
  481. /**
  482.  * Register postMessage support.
  483.  *
  484.  * Add postMessage support for site title and description for the Customizer.
  485.  *
  486.  * @since Twenty Twelve 1.0
  487.  *
  488.  * @param WP_Customize_Manager $wp_customize Customizer object.
  489.  * @return void
  490.  */
  491. function twentytwelve_customize_register( $wp_customize ) {
  492.     $wp_customize->get_setting( 'blogname' )->transport         = 'postMessage';
  493.     $wp_customize->get_setting( 'blogdescription' )->transport  = 'postMessage';
  494.     $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage';
  495. }
  496. add_action( 'customize_register', 'twentytwelve_customize_register' );
  497.  
  498. /**
  499.  * Enqueue Javascript postMessage handlers for the Customizer.
  500.  *
  501.  * Binds JS handlers to make the Customizer preview reload changes asynchronously.
  502.  *
  503.  * @since Twenty Twelve 1.0
  504.  *
  505.  * @return void
  506.  */
  507. function twentytwelve_customize_preview_js() {
  508.     wp_enqueue_script( 'twentytwelve-customizer', get_template_directory_uri() . '/js/theme-customizer.js', array( 'customize-preview' ), '20130301', true );
  509. }
  510. add_action( 'customize_preview_init', 'twentytwelve_customize_preview_js' );
  511.  
  512. function my_country_code() {
  513.     return array( 'AF' => 'Afghanistan', 'AX' => 'Åland Islands', 'AL' => 'Albania', 'DZ' => 'Algeria', 'AS' => 'American Samoa', 'AD' => 'Andorra', 'AO' => 'Angola', 'AI' => 'Anguilla', 'AQ' => 'Antarctica', 'AG' => 'Antigua And Barbuda', 'AR' => 'Argentina', 'AM' => 'Armenia', 'AW' => 'Aruba', 'AU' => 'Australia', 'AT' => 'Austria', 'AZ' => 'Azerbaijan', 'BS' => 'Bahamas', 'BH' => 'Bahrain', 'BD' => 'Bangladesh', 'BB' => 'Barbados', 'BY' => 'Belarus', 'BE' => 'Belgium', 'BZ' => 'Belize', 'BJ' => 'Benin', 'BM' => 'Bermuda', 'BT' => 'Bhutan', 'BO' => 'Bolivia, Plurinational State Of', 'BQ' => 'Bonaire, Sint Eustatius And Saba', 'BA' => 'Bosnia And Herzegovina', 'BW' => 'Botswana', 'BV' => 'Bouvet Island', 'BR' => 'Brazil', 'IO' => 'British Indian Ocean Territory', 'BN' => 'Brunei Darussalam', 'BG' => 'Bulgaria', 'BF' => 'Burkina Faso', 'BI' => 'Burundi', 'KH' => 'Cambodia', 'CM' => 'Cameroon', 'CA' => 'Canada', 'CV' => 'Cape Verde', 'KY' => 'Cayman Islands', 'CF' => 'Central African Republic', 'TD' => 'Chad', 'CL' => 'Chile', 'CN' => 'China', 'CX' => 'Christmas Island', 'CC' => 'Cocos (keeling) Islands', 'CO' => 'Colombia', 'KM' => 'Comoros', 'CG' => 'Congo', 'CD' => 'Congo, The Democratic Republic Of The', 'CK' => 'Cook Islands', 'CR' => 'Costa Rica', 'CI' => 'Côte D\'ivoire', 'HR' => 'Croatia', 'CU' => 'Cuba', 'CW' => 'Curaçao', 'CY' => 'Cyprus', 'CZ' => 'Czech Republic', 'DK' => 'Denmark', 'DJ' => 'Djibouti', 'DM' => 'Dominica', 'DO' => 'Dominican Republic', 'EC' => 'Ecuador', 'EG' => 'Egypt', 'SV' => 'El Salvador', 'GQ' => 'Equatorial Guinea', 'ER' => 'Eritrea', 'EE' => 'Estonia', 'ET' => 'Ethiopia', 'FK' => 'Falkland Islands (malvinas)', 'FO' => 'Faroe Islands', 'FJ' => 'Fiji', 'FI' => 'Finland', 'FR' => 'France', 'GF' => 'French Guiana', 'PF' => 'French Polynesia', 'TF' => 'French Southern Territories', 'GA' => 'Gabon', 'GM' => 'Gambia', 'GE' => 'Georgia', 'DE' => 'Germany', 'GH' => 'Ghana', 'GI' => 'Gibraltar', 'GR' => 'Greece', 'GL' => 'Greenland', 'GD' => 'Grenada', 'GP' => 'Guadeloupe', 'GU' => 'Guam', 'GT' => 'Guatemala', 'GG' => 'Guernsey', 'GN' => 'Guinea', 'GW' => 'Guinea-bissau', 'GY' => 'Guyana', 'HT' => 'Haiti', 'HM' => 'Heard Island And Mcdonald Islands', 'VA' => 'Holy See (vatican City State)', 'HN' => 'Honduras', 'HK' => 'Hong Kong', 'HU' => 'Hungary', 'IS' => 'Iceland', 'IN' => 'India', 'ID' => 'Indonesia', 'IR' => 'Iran, Islamic Republic Of', 'IQ' => 'Iraq', 'IE' => 'Ireland', 'IM' => 'Isle Of Man', 'IL' => 'Israel', 'IT' => 'Italy', 'JM' => 'Jamaica', 'JP' => 'Japan', 'JE' => 'Jersey', 'JO' => 'Jordan', 'KZ' => 'Kazakhstan', 'KE' => 'Kenya', 'KI' => 'Kiribati', 'KP' => 'Korea, Democratic People\'s Republic Of', 'KR' => 'Korea, Republic Of', 'KW' => 'Kuwait', 'KG' => 'Kyrgyzstan', 'LA' => 'Lao People\'s Democratic Republic', 'LV' => 'Latvia', 'LB' => 'Lebanon', 'LS' => 'Lesotho', 'LR' => 'Liberia', 'LY' => 'Libya', 'LI' => 'Liechtenstein', 'LT' => 'Lithuania', 'LU' => 'Luxembourg', 'MO' => 'Macao', 'MK' => 'Macedonia, The Former Yugoslav Republic Of', 'MG' => 'Madagascar', 'MW' => 'Malawi', 'MY' => 'Malaysia', 'MV' => 'Maldives', 'ML' => 'Mali', 'MT' => 'Malta', 'MH' => 'Marshall Islands', 'MQ' => 'Martinique', 'MR' => 'Mauritania', 'MU' => 'Mauritius', 'YT' => 'Mayotte', 'MX' => 'Mexico', 'FM' => 'Micronesia, Federated States Of', 'MD' => 'Moldova, Republic Of', 'MC' => 'Monaco', 'MN' => 'Mongolia', 'ME' => 'Montenegro', 'MS' => 'Montserrat', 'MA' => 'Morocco', 'MZ' => 'Mozambique', 'MM' => 'Myanmar', 'NA' => 'Namibia', 'NR' => 'Nauru', 'NP' => 'Nepal', 'NL' => 'Netherlands', 'NC' => 'New Caledonia', 'NZ' => 'New Zealand', 'NI' => 'Nicaragua', 'NE' => 'Niger', 'NG' => 'Nigeria', 'NU' => 'Niue', 'NF' => 'Norfolk Island', 'MP' => 'Northern Mariana Islands', 'NO' => 'Norway', 'OM' => 'Oman', 'PK' => 'Pakistan', 'PW' => 'Palau', 'PS' => 'Palestinian Territory, Occupied', 'PA' => 'Panama', 'PG' => 'Papua New Guinea', 'PY' => 'Paraguay', 'PE' => 'Peru', 'PH' => 'Philippines', 'PN' => 'Pitcairn', 'PL' => 'Poland', 'PT' => 'Portugal', 'PR' => 'Puerto Rico', 'QA' => 'Qatar', 'RE' => 'Réunion', 'RO' => 'Romania', 'RU' => 'Russian Federation', 'RW' => 'Rwanda', 'BL' => 'Saint Barthélemy', 'SH' => 'Saint Helena, Ascension And Tristan Da Cunha', 'KN' => 'Saint Kitts And Nevis', 'LC' => 'Saint Lucia', 'MF' => 'Saint Martin (french Part)', 'PM' => 'Saint Pierre And Miquelon', 'VC' => 'Saint Vincent And The Grenadines', 'WS' => 'Samoa', 'SM' => 'San Marino', 'ST' => 'Sao Tome And Principe', 'SA' => 'Saudi Arabia', 'SN' => 'Senegal', 'RS' => 'Serbia', 'SC' => 'Seychelles', 'SL' => 'Sierra Leone', 'SG' => 'Singapore', 'SX' => 'Sint Maarten (dutch Part)', 'SK' => 'Slovakia', 'SI' => 'Slovenia', 'SB' => 'Solomon Islands', 'SO' => 'Somalia', 'ZA' => 'South Africa', 'GS' => 'South Georgia And The South Sandwich Islands', 'SS' => 'South Sudan', 'ES' => 'Spain', 'LK' => 'Sri Lanka', 'SD' => 'Sudan', 'SR' => 'Suriname', 'SJ' => 'Svalbard And Jan Mayen', 'SZ' => 'Swaziland', 'SE' => 'Sweden', 'CH' => 'Switzerland', 'SY' => 'Syrian Arab Republic', 'TW' => 'Taiwan, Province Of China', 'TJ' => 'Tajikistan', 'TZ' => 'Tanzania, United Republic Of', 'TH' => 'Thailand', 'TL' => 'Timor-leste', 'TG' => 'Togo', 'TK' => 'Tokelau', 'TO' => 'Tonga', 'TT' => 'Trinidad And Tobago', 'TN' => 'Tunisia', 'TR' => 'Turkey', 'TM' => 'Turkmenistan', 'TC' => 'Turks And Caicos Islands', 'TV' => 'Tuvalu', 'UG' => 'Uganda', 'UA' => 'Ukraine', 'AE' => 'United Arab Emirates', 'GB' => 'United Kingdom', 'US' => 'United States', 'UM' => 'United States Minor Outlying Islands', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', 'VU' => 'Vanuatu', 'VE' => 'Venezuela, Bolivarian Republic Of', 'VN' => 'Viet Nam', 'VG' => 'Virgin Islands, British', 'VI' => 'Virgin Islands, U.s.', 'WF' => 'Wallis And Futuna', 'EH' => 'Western Sahara', 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe' );  
  514. }
  515.  
  516. add_action( 'show_user_profile', 'my_edit_user_profile' );
  517. add_action( 'edit_user_profile', 'my_edit_user_profile' );
  518. add_action( 'edit_user_profile_update', 'my_edit_user_profile_update' );
  519. add_action( 'personal_options_update', 'my_edit_user_profile_update' );
  520.  
  521. function my_edit_user_profile( $profileuser ) { ?>
  522.     <table class="form-table">
  523.     <tr>
  524.         <th><label for="country"><?php _e('Country'); ?></label></th>
  525.         <td>
  526.             <select id="country" name="country"><?php              
  527.                 $options = get_option('country');
  528.                 foreach( my_country_code() as $code => $country ) {
  529.                     echo "<option value='$code' " . selected( $options[$profileuser->ID], $code, false ) . ">$country</option>";
  530.                 } ?>
  531.                 </select></td>
  532.     </tr>
  533.     </table><?php
  534. }
  535.  
  536. function my_edit_user_profile_update( $user_id ) {
  537.     if( isset( $_POST[ 'country' ] ) && array_key_exists( $_POST[ 'country' ], my_country_code() ) ) {
  538.         $options = get_option('country');
  539.         $options[$user_id] = $_POST[ 'country' ];
  540.         update_option( 'country', $options );
  541.     }
  542. }
  543.  
  544. function my_googlechart_script() {
  545.     wp_enqueue_script( 'jsapi', 'https://www.google.com/jsapi', 1 );
  546. }
  547. add_action( 'wp_head', 'my_googlechart_script', 1 );
  548.  
  549. function my_geochart_script() {
  550.     $options = get_option('country');
  551.     $countries = array_count_values( $options );
  552.    
  553.     $data = array();  
  554.     foreach( $countries as $code => $country ) {  
  555.         $data[] = '["' . $code . '", ' . $country . ']';
  556.     }
  557.     echo '<script type="text/javascript">
  558.    google.load("visualization", "1", {"packages": ["geochart"]});
  559.    google.setOnLoadCallback(drawRegionsMap);
  560.  
  561.    function drawRegionsMap() {
  562.     var data = google.visualization.arrayToDataTable([
  563.         ["Country", "Popularity"], ' . implode(',', $data) . '
  564.     ]);
  565.  
  566.     var options = {backgroundColor:{fill:"transparent"}};
  567.  
  568.     var chart = new google.visualization.GeoChart(document.getElementById("chart_div"));
  569.     chart.draw(data, options);
  570.    };
  571.    </script>';
  572. }
  573. add_action( 'wp_head', 'my_geochart_script' );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement