File: /var/www/zaklada/wp-content/plugins/responsive-lightbox/includes/class-multilang.php
<?php
if ( ! defined( 'ABSPATH' ) )
exit;
new Responsive_Lightbox_Multilang();
/**
* Responsive Lightbox Multilang class.
*
* @class Responsive_Lightbox_Multilang
*/
class Responsive_Lightbox_Multilang {
public $multilang = false;
public $languages = array();
public $default_lang = '';
public $current_lang = '';
public $active_plugin = '';
/**
* Constructor.
*
* @return void
*/
public function __construct() {
// set instance
Responsive_Lightbox()->multilang = $this;
// check if WPML or Polylang is active
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
// Polylang support
if ( ( is_plugin_active( 'polylang/polylang.php' ) || is_plugin_active( 'polylang-pro/polylang.php' ) ) && function_exists( 'PLL' ) ) {
$this->multilang = true;
$this->active_plugin = 'polylang';
// get registered languages
$registered_languages = PLL()->model->get_languages_list();
if ( ! empty( $registered_languages ) ) {
foreach ( $registered_languages as $language )
$this->languages[$language->slug] = $language->name;
}
// get default language
$this->default_lang = pll_default_language();
// filters
add_filter( 'rl_count_attachments', array( $this, 'count_attachments' ), 9 );
// WPML support
} elseif ( is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) && class_exists( 'SitePress' ) ) {
$this->multilang = true;
$this->active_plugin = 'wpml';
global $sitepress;
// get registered languages
$registered_languages = icl_get_languages();
if ( ! empty( $registered_languages ) ) {
foreach ( $registered_languages as $language )
$this->languages[$language['code']] = $language['display_name'];
}
// get default language
$this->default_lang = $sitepress->get_default_language();
// actions
add_action( 'admin_init', array( $this, 'hide_thumbnail' ) );
}
// multilang?
if ( $this->multilang ) {
// ations
add_action( 'admin_init', array( $this, 'media_url_redirect' ) );
// filters
add_filter( 'setup_theme', array( $this, 'get_current_admin_language' ), 11 );
add_filter( 'rl_root_folder_query_args', array( $this, 'root_folder_query_args' ) );
add_filter( 'rl_gallery_query_args', array( $this, 'gallery_featured_query_args' ) );
add_filter( 'rl_folders_query_args', array( $this, 'gallery_folders_query_args' ) );
add_filter( 'rl_get_gallery_images_attachments', array( $this, 'update_gallery_images_attachments' ) );
add_filter( 'rl_folders_media_folder_url', array( $this, 'media_folder_url' ) );
}
}
/**
* Avoid duplicating hidden internal thumbnail.
*
* @return void
*/
public function hide_thumbnail() {
// get thumbnail
$thumbnail_id = Responsive_Lightbox()->galleries->maybe_generate_thumbnail();
add_post_meta( $thumbnail_id, 'wpml_media_processed', 1, true );
}
/**
* Get current admin language.
*
* @return void
*/
public function get_current_admin_language() {
if ( $this->active_plugin === 'polylang' )
$this->current_lang = (string) pll_current_language( 'slug' );
else
$this->current_lang = ICL_LANGUAGE_CODE === 'all' ? '' : ICL_LANGUAGE_CODE;
}
/**
* Update gallery attachments.
*
* @param array $attachments Attachment IDs
* @return array
*/
public function update_gallery_images_attachments( $attachments ) {
$new_attachments = array();
foreach ( $attachments as $attachment_id ) {
if ( $this->active_plugin === 'polylang' )
$new_attachments[] = pll_get_post( $attachment_id, $this->current_lang );
else
$new_attachments[] = (int) apply_filters( 'wpml_object_id', $attachment_id, 'attachment', true, $this->current_lang );
}
return $attachments;
}
/**
* Root folder WP Query arguments.
*
* @return void
*/
public function root_folder_query_args( $args ) {
$args['lang'] = $this->current_lang;
return $args;
}
/**
* Get the number of attachments per language.
* Based on count_posts function from Polylang plugin (/include/model.php)
*
* @param string $lang 2-char language
* @param array $args Arguments (accepted: m, year, monthnum, day, author, author_name, post_format)
* @return int
*/
public function count_attachments() {
// active language?
if ( $this->current_lang !== '' ) {
// remove internal WP counter to avoid unwanted query
remove_filter( 'rl_count_attachments', array( Responsive_Lightbox()->folders, 'count_attachments' ), 10 );
// if not let internal WP counter do the job
} else
return;
// get taxonomies
$taxonomies = PLL()->model->get_filtered_taxonomies_query_vars();
// prepare defaults
$defaults = array(
'author' => '',
'author_name' => '',
'monthnum' => '',
'day' => '',
'year' => '',
'm' => ''
);
// add additional taxonomies
foreach ( $taxonomies as $tax ) {
$defaults[$tax] = '';
}
// prepare data
$args = array_intersect_key( array_merge( $defaults, wp_unslash( $_REQUEST ) ), $defaults );
global $wpdb;
$select = "SELECT pll_tr.term_taxonomy_id, COUNT( * ) AS count FROM " . $wpdb->posts;
$join = PLL()->model->post->join_clause();
$where = " WHERE post_status = 'inherit'";
$where .= " AND " . $wpdb->posts . ".post_type = 'attachment'";
$where .= PLL()->model->post->where_clause( $this->current_lang );
$groupby = ' GROUP BY pll_tr.term_taxonomy_id';
if ( ! empty( $args['m'] ) ) {
$args['m'] = '' . preg_replace( '|[^0-9]|', '', $args['m'] );
$where .= $wpdb->prepare( " AND YEAR( " . $wpdb->posts . ".post_date ) = %d", substr( $args['m'], 0, 4 ) );
if ( strlen( $args['m'] ) > 5 )
$where .= $wpdb->prepare( " AND MONTH( " . $wpdb->posts . ".post_date ) = %d", substr( $args['m'], 4, 2 ) );
if ( strlen( $args['m'] ) > 7 )
$where .= $wpdb->prepare( " AND DAYOFMONTH( " . $wpdb->posts . ".post_date ) = %d", substr( $args['m'], 6, 2 ) );
}
if ( ! empty( $args['year'] ) )
$where .= $wpdb->prepare( " AND YEAR( " . $wpdb->posts . ".post_date ) = %d", $args['year'] );
if ( ! empty( $args['monthnum'] ) )
$where .= $wpdb->prepare( " AND MONTH( " . $wpdb->posts . ".post_date ) = %d", $args['monthnum'] );
if ( ! empty( $args['day'] ) )
$where .= $wpdb->prepare( " AND DAYOFMONTH( " . $wpdb->posts . ".post_date ) = %d", $args['day'] );
if ( ! empty( $args['author_name'] ) ) {
$author = get_user_by( 'slug', sanitize_title_for_query( $args['author_name'] ) );
if ( $author )
$args['author'] = $author->ID;
}
if ( ! empty( $args['author'] ) )
$where .= $wpdb->prepare( " AND " . $wpdb->posts . ".post_author = %d", $args['author'] );
// filtered taxonomies ( post_format )
foreach ( $taxonomies as $tax_qv ) {
if ( ! empty( $args[ $tax_qv ] ) ) {
$join .= " INNER JOIN " . $wpdb->term_relationships . " AS tr ON tr.object_id = " . $wpdb->posts . ".ID";
$join .= " INNER JOIN " . $wpdb->term_taxonomy . " AS tt ON tt.term_taxonomy_id = tr.term_taxonomy_id";
$join .= " INNER JOIN " . $wpdb->terms . " AS t ON t.term_id = tt.term_id";
$where .= $wpdb->prepare( ' AND t.slug = %s', $args[ $tax_qv ] );
}
}
// get result
$result = $wpdb->get_row( $select . $join . $where . $groupby, ARRAY_A );
return empty( $result['count'] ) ? 0 : (int) $result['count'];
}
/**
* Featured gallery query arguments.
*
* @param array $args
* @return array
*/
public function gallery_featured_query_args( $args ) {
// set active language
$args['lang'] = $this->current_lang;
return $args;
}
/**
* Folders gallery query arguments.
*
* @param array $args
* @return array
*/
public function gallery_folders_query_args( $args ) {
// set active language
$args['lang'] = $this->current_lang;
return $args;
}
/**
* Update media folders URLs.
*
* @param string $url
* @return string
*/
public function media_folder_url( $url ) {
// active language?
if ( $this->current_lang !== '' )
$url = add_query_arg( 'lang', $this->current_lang, $url );
return $url;
}
/**
* Redirect to equivalent media folder in specified language.
*
* @return void
*/
public function media_url_redirect() {
global $pagenow;
// get main instance
$rl = Responsive_Lightbox();
// only for media with selected language
if ( $pagenow === 'upload.php' && $this->current_lang !== '' && $rl->options['folders']['active'] ) {
// get taxonomy
$taxonomy = $rl->options['folders']['media_taxonomy'];
// parse URL
$params = parse_url( html_entity_decode( urldecode( add_query_arg() ) ) );
if ( isset( $params['query'] ) ) {
// parse query string
parse_str( $params['query'], $args );
if ( isset( $args['lang'], $args[$taxonomy] ) ) {
// cast term ID
$term_id = (int) $args[$taxonomy];
if ( $this->active_plugin === 'polylang' )
$new_term_id = pll_get_term( $term_id, $args['lang'] );
else
$new_term_id = apply_filters( 'wpml_object_id', $term_id, $taxonomy, true, $args['lang'] );
// different ID?
if ( $term_id !== $new_term_id ) {
wp_safe_redirect( add_query_arg( $taxonomy, $new_term_id ) );
exit;
}
}
}
}
}
}