Advertisement
Chouby

Filtering plugin for Polylang

Jul 2nd, 2012
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.74 KB | None | 0 0
  1. <?php
  2. /*
  3. Plugin Name: pll_filter for Polylang
  4. Description: Obsolete since the feature has been included in Polylang v0.9
  5. */
  6.  
  7. class pll_filter {
  8.     function __construct() {
  9.         // FIXME will be useless since everything will go in admin-filters.php
  10.         if (!is_admin())
  11.             return;
  12.  
  13.         add_filter('terms_clauses', array(&$this, 'terms_clauses'), 10, 3);
  14.         add_filter('comments_clauses', array(&$this, 'comments_clauses'), 10, 2);
  15.  
  16.         add_action('admin_bar_menu', array(&$this, 'admin_bar_menu'), 100); // 100 determines the position
  17.         add_action('admin_init', array(&$this, 'admin_init'));
  18.         // FIXME enlever parse_query (remplacé par celui-ci) et restrict_manage_posts dans admin-filters.php
  19.         add_filter('parse_query',array(&$this,'parse_query'));
  20.     }
  21.  
  22.     // filter tag cloud and list table in 'tags' screen
  23.     function terms_clauses($clauses, $taxonomies, $args) {
  24.  
  25.         // FIXME remplacer $polylang par $this
  26.         global $polylang;
  27.  
  28.         if (function_exists('get_current_screen'))
  29.             $screen = get_current_screen();
  30.  
  31.         // only on the 'Tags' or 'Categories' screen
  32.         // and the 'Posts' or 'Pages' screen for the quick edit
  33.         if (!isset($screen) || !in_array($screen->base, array('edit-tags', 'edit')) || isset($_GET['action']))
  34.             return $clauses;
  35.  
  36.         // FIXME this complex test allows not to filter the 'get_terms_not_translated'
  37.         // maybe it's more robust to add a new arg to the function in polylang and to test it
  38.         if ($screen->base == 'edit-tags' && !isset($args['page']) && $args['fields'] != 'count' && !isset($args['class']) && !$args['hide_empty'])
  39.             return $clauses;
  40.  
  41.         // parent drowdown already filtered in polylang
  42.         if (isset($args['class']))
  43.             return $clauses;
  44.  
  45.         // when adding a new translation. FIXME : filtrer ou non ? -> filtrer contredit le filtre général
  46.         // FIXME add ajax to manage tag cloud and list table when changing language ?
  47.         // already done for parent dropdown list
  48.         if (isset($_GET['new_lang']) && $_GET['new_lang'])
  49.             $lang = $polylang->get_language($_GET['new_lang']);
  50.  
  51.         elseif (isset($_GET['lang']) && $_GET['lang']) {
  52.             if ($_GET['lang'] != 'all')
  53.                 $lang = $polylang->get_language($_GET['lang']);
  54.         }
  55.  
  56.         elseif ($lg = get_user_meta(get_current_user_id(), 'pll_filter_content', true))
  57.             $lang = $polylang->get_language($lg);
  58.  
  59.         return isset($lang) ? $polylang->_terms_clauses($clauses, $lang) : $clauses;       
  60.     }
  61.  
  62.     // filters comments by language
  63.     function comments_clauses($clauses, $query) {
  64.  
  65.         // FIXME remplacer $polylang par $this
  66.         global $polylang;
  67.  
  68.         if (isset($_GET['lang']) && $_GET['lang']) {
  69.             if ($_GET['lang'] != 'all')
  70.                 $lang = $polylang->get_language($_GET['lang']);
  71.         }
  72.  
  73.         elseif ($lg = get_user_meta(get_current_user_id(), 'pll_filter_content', true))
  74.             $lang = $polylang->get_language($lg);
  75.  
  76.         if (isset($lang))
  77.             $clauses = $this->_comments_clauses($clauses, $lang);
  78.  
  79.         return $clauses;
  80.     }
  81.  
  82.     // FIXME fonction comments_clauses de core.php doit appeler _comments_clauses qui doit passer dans base.php
  83.     function _comments_clauses($clauses, $lang) {
  84.         global $wpdb;
  85.  
  86.         // if this clause is not already added by WP
  87.         if (!strpos($clauses['join'], '.ID'))
  88.             $clauses['join'] .= " JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID";
  89.  
  90.         $clauses['join'] .= " INNER JOIN $wpdb->term_relationships AS pll_tr ON pll_tr.object_id = ID";
  91.         $clauses['where'] .= $wpdb->prepare(" AND pll_tr.term_taxonomy_id = %d", $lang->term_taxonomy_id);
  92.  
  93.         return $clauses;
  94.     }
  95.  
  96.     // adds the languages in admin bar
  97.     function admin_bar_menu($wp_admin_bar) {
  98.  
  99.         if (function_exists('get_current_screen'))
  100.             $screen = get_current_screen();
  101. /*
  102.         // only on relevant admin panels
  103.         if (!isset($screen) || !in_array($screen->base, array('edit', 'upload', 'edit-comments', 'edit-tags')) || ($screen->base == 'edit-tags' && isset($_GET['action'])))
  104.             return;
  105. */
  106.         global $polylang;
  107.  
  108.         $url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  109.  
  110.         $selected = isset($_GET['lang']) && $_GET['lang'] ? $_GET['lang'] :
  111.             (($lg = get_user_meta(get_current_user_id(), 'pll_filter_content', true)) ? $lg : 'all');
  112.  
  113.         $wp_admin_bar->add_menu(array(
  114.             'id'     => 'languages',
  115.             'title'  => __('Languages', 'polylang'),
  116.             'meta'  => array('title' => __('Filters content by language', 'polylang')),
  117.         ));
  118.  
  119.         $wp_admin_bar->add_menu(array(
  120.             'parent' => 'languages',
  121.             'id'     => 'all',
  122.             'title'  => sprintf('<input name="all" type="radio" value="1" %s /> %s',
  123.                 $selected == 'all' ? 'checked="checked"' : '', __('Show all languages', 'polylang')),
  124.             'href'   => add_query_arg('lang', 'all', $url),
  125.         ));        
  126.  
  127.         foreach ($polylang->get_languages_list() as $lang) {
  128.             $wp_admin_bar->add_menu(array(
  129.                 'parent' => 'languages',
  130.                 'id'     => $lang->slug,
  131.                 'title'  => sprintf('<input name="%s" type="radio" value="1" %s /> %s',
  132.                     $lang->slug, $selected == $lang->slug ? 'checked="checked"' : '', $lang->name),
  133.                 'href'   => add_query_arg('lang', $lang->slug, $url),
  134.             ));        
  135.         }
  136.     }
  137.  
  138.     // set user meta when choosing to filter content by language
  139.     function admin_init() {
  140.         if (isset($_GET['lang']) && $_GET['lang'])
  141.             update_user_meta(get_current_user_id(), 'pll_filter_content', $_GET['lang'] == 'all' ? '' : $_GET['lang']);
  142.     }
  143.  
  144.     // filters posts, pages and media by language
  145.     function parse_query($query) {
  146.         $qvars = &$query->query_vars;
  147.  
  148.         // do not filter post types such nav_menu_item for example
  149.         if (in_array($qvars['post_type'], array('nav_menu_item','attachment')))
  150.             return;
  151.  
  152.         if (!isset($qvars['lang']) && $lg = get_user_meta(get_current_user_id(), 'pll_filter_content', true))
  153.             $qvars['lang'] = $lg;
  154.  
  155.         if (isset($qvars['lang']) &&  $qvars['lang'] == 'all')
  156.             unset ($qvars['lang']);
  157.     }
  158.  
  159. }
  160.  
  161. new pll_filter();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement