Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- define( 'DIR_URI', get_template_directory_uri() . '/theme-modules/multilanguage-tracker' );
- /*
- * Multilanguage URL tracker
- */
- function mlt_url_tracker_menu() {
- add_menu_page(
- 'URL Tracker',
- 'URL Tracker',
- 'manage_network_options',
- 'imm_url_tracker',
- 'mlt_url_tracker_callback'
- );
- }
- add_action( 'network_admin_menu', 'mlt_url_tracker_menu' );
- /*
- * Callback function to call template
- */
- function mlt_url_tracker_callback() {
- //Add empty options
- $items = array();
- $language_options = get_site_option('imm_language_options');
- if( !$language_options ) {
- foreach ( get_sites() as $key => $site ) {
- $items[] = array(
- 'site_id' => $site->blog_id,
- 'code' => '',
- 'label' => ''
- );
- }
- add_site_option('imm_language_options', $items);
- }
- require_once 'template.php';
- }
- /*
- * Add Metabox on edit pages or post
- */
- add_action('add_meta_boxes', 'mlt_add_edit_metabox');
- function mlt_add_edit_metabox() {
- if( !is_multisite() ) {
- return;
- }
- $post_types = array('post','page');
- $args = array(
- 'public' => true,
- '_builtin' => false,
- );
- $output = 'objects';
- $operator = 'and';
- $custom_post_types = get_post_types( $args, $output, $operator );
- foreach ($custom_post_types as $key => $type) {
- $post_types[] = $type->name;
- }
- add_meta_box(
- 'mlt_edit_content',
- 'Multilanguage Tracker',
- 'mlt_metabox_callback',
- $post_types,
- 'side',
- 'high'
- );
- }
- function mlt_metabox_callback($post, $metabox) {
- $url_tracker = get_post_meta($post->ID, 'mlt_url_tracker')[0];
- if( $url_tracker ) {
- foreach ($url_tracker as $page) {
- if( get_current_blog_id() != $page['site_id'] && $page['post_id'] != '' ) :
- switch_to_blog($page['site_id']);
- $post_id = $page['post_id'];
- $title = site_url();
- ?>
- <div class="mlt-tracker-item">
- <p class="site-name"><?php echo $title; ?></p>
- <p class="post-title"><?php echo get_the_title($post_id); ?> <a href="<?php echo get_edit_post_link($post_id) ?>" target="_blank">Edit</a></p>
- </div>
- <?php
- restore_current_blog();
- endif;
- }
- }else{
- echo '<p>Edit the multilanguage tracker to show linked pages</p>';
- }
- }
- /*
- * Get post list with pagination
- */
- function mlt_get_posts_list( $blog_id, $paged, $post_type ) {
- switch_to_blog( $blog_id );
- $post_list = array();
- $args = array(
- 'post_type' => $post_type,
- 'post_status' => 'publish',
- 'posts_per_page' => 10,
- 'paged' => $paged,
- );
- $query = new WP_Query( $args );
- if( $query->have_posts() ) {
- while( $query->have_posts() ) {
- $query->the_post();
- $post_list['posts'][] = array(
- 'id' => get_the_ID(),
- 'title' => get_the_title(),
- 'permalink' => get_permalink()
- );
- }
- $big = 999999999;
- $post_list['pagination'] = paginate_links( array(
- 'base' => str_replace( array($big, '#038;'), array('%#%', ''), esc_url( get_pagenum_link( $big ) ) ),
- 'prev_text' => __( '«', 'imm-starter-theme' ),
- 'next_text' => __( '»', 'imm-starter-theme' ),
- 'format' => '?paged=%#%',
- 'current' => max( 1, $paged ),
- 'total' => $query->max_num_pages
- ) );
- }
- wp_reset_postdata();
- return $post_list;
- }
- /*
- * Enqueue scripts & styles on admin
- */
- function mlt_enqueue_scripts_admin( $hook ) {
- if( 'toplevel_page_imm_url_tracker' == $hook ) {
- wp_enqueue_script('jquery-ui-sortable');
- wp_enqueue_script('mlt_select2', DIR_URI . '/select2/select2.min.js', array('jquery'), time(), true);
- wp_enqueue_style('mlt_select2', DIR_URI . '/select2/select2.min.css');
- wp_enqueue_script('mlt_scripts', DIR_URI . '/assets/scripts.js', array('jquery'), time(), true);
- wp_localize_script( 'mlt_scripts', 'mltAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce('ajax-nonce') ));
- wp_enqueue_style('mlt_style', DIR_URI . '/assets/style.css');
- }
- wp_enqueue_style('mlt_admin_style', DIR_URI . '/assets/admin.css');
- }
- add_action('admin_enqueue_scripts', 'mlt_enqueue_scripts_admin');
- /*
- * Enqueue script & style on frontend
- */
- function mlt_enqueue_scripts_frontend( $hook ) {
- $language_options = get_site_option('imm_language_options');
- if( $language_options ) {
- wp_enqueue_style('mlt_switcher', DIR_URI . '/assets/language-switcher.css');
- wp_enqueue_script( 'mlt_switcher', DIR_URI . '/assets/language-switcher.js', array('jquery'), false, true );
- }
- }
- add_action('wp_enqueue_scripts', 'mlt_enqueue_scripts_frontend');
- /*
- * Get post list from AJAX request
- */
- function mlt_get_posts_list_ajax() {
- $nonce = $_GET['nonce'];
- if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
- die ( 'Your action is not verified');
- $site_id = $_GET['site_id'];
- $post_type = $_GET['post_type'];
- $paged = $_GET['page'];
- $result = array();
- $result['pagination']['more'] = false;
- switch_to_blog( $site_id );
- $args = array(
- 'post_type' => $post_type,
- 'post_status' => 'publish',
- 'posts_per_page' => 10,
- 'paged' => $paged
- );
- if( isset($_GET['q']) ) {
- $args['s'] = $_GET['q'];
- }
- $query = new WP_Query( $args );
- if( $paged < $query->max_num_pages ) {
- $result['pagination']['more'] = true;
- }
- if( $query->have_posts() ) {
- while( $query->have_posts() ) {
- $query->the_post();
- $result['results'][] = array(
- 'id' => get_the_ID(),
- 'text' => get_the_title()
- );
- }
- }
- wp_reset_postdata();
- echo wp_json_encode( $result );
- die();
- }
- add_action('wp_ajax_nopriv_mlt_get_posts_list_ajax', 'mlt_get_posts_list_ajax');
- add_action('wp_ajax_mlt_get_posts_list_ajax', 'mlt_get_posts_list_ajax');
- /*
- * Update URL tracker on all sites
- */
- function mlt_update_tracker() {
- $nonce = $_POST['nonce'];
- if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
- die ( 'Your action is not verified');
- $items = $_POST['items'];
- foreach ($items as $key => $item) {
- switch_to_blog($item['site_id']);
- update_post_meta( $item['post_id'], 'mlt_url_tracker', $items );
- }
- die();
- }
- add_action('wp_ajax_nopriv_mlt_update_tracker', 'mlt_update_tracker');
- add_action('wp_ajax_mlt_update_tracker', 'mlt_update_tracker');
- /*
- * Update language options
- */
- function mlt_update_language_options() {
- $nonce = $_POST['nonce'];
- if ( ! wp_verify_nonce( $nonce, 'ajax-nonce' ) )
- die ( 'Your action is not verified');
- $items = $_POST['items'];
- delete_site_option('imm_language_options');
- add_site_option('imm_language_options', $items);
- die();
- }
- add_action('wp_ajax_nopriv_mlt_update_language_options', 'mlt_update_language_options');
- add_action('wp_ajax_mlt_update_language_options', 'mlt_update_language_options');
- /*
- * Language switcher shortcode
- */
- function mlt_language_switcher( $atts ) {
- $a = shortcode_atts( array(
- 'type' => 'list',
- ), $atts );
- ob_start();
- require 'language-switcher-template.php';
- return ob_get_clean();
- }
- add_shortcode('mlt-language-switcher', 'mlt_language_switcher');
- /*
- * Get linked pages based on post id
- */
- function mlt_get_linked_pages() {
- $result = array();
- $language_options = get_site_option('imm_language_options');
- $post_obj = get_queried_object();
- if( $language_options && isset($post_obj->ID) ) {
- $post_id = $post_obj->ID;
- foreach ($language_options as $option_key => $option) {
- $url_tracker = get_post_meta($post_id, 'mlt_url_tracker')[0];
- /*
- * If linked pages not exists, use the current site url for each site
- */
- if( $url_tracker ) {
- foreach ($url_tracker as $url_key => $url) {
- if( $option['site_id'] == $url['site_id'] ) {
- switch_to_blog($option['site_id']);
- $permalink = get_permalink($url['post_id']);
- $result[] = array(
- 'site_id' => $option['site_id'],
- 'permalink' => $permalink,
- 'code' => $option['code'],
- 'label' => $option['label']
- );
- restore_current_blog();
- }
- }
- }else{
- switch_to_blog($option['site_id']);
- $permalink = site_url();
- $result[] = array(
- 'site_id' => $option['site_id'],
- 'permalink' => $permalink,
- 'code' => $option['code'],
- 'label' => $option['label']
- );
- restore_current_blog();
- }
- }
- }
- return $result;
- }
- /*
- * Add Hreflang tag in header
- */
- function add_href_lang_tag() {
- $template = '';
- $linked_pages = mlt_get_linked_pages();
- if( empty($linked_pages) ) {
- return;
- }
- foreach ($linked_pages as $key => $page) {
- switch_to_blog($option['site_id']);
- //Don't render the tag if there is no linked pages on current page
- if( !is_front_page() && ( site_url() != $option['permalink'] ) ) {
- $template .= '<link rel="alternate" href="'. $page['permalink'] .'" hreflang="'. $page['code'] .'" />';
- }
- restore_current_blog();
- }
- echo $template;
- }
- add_action('wp_head', 'add_href_lang_tag');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement