ASong2U_Web/wp-content/plugins/buddypress-multilingual/sitepress-bp.php

567 lines
21 KiB
PHP

<?php
/*
Plugin Name: BuddyPress Multilingual
Plugin URI: http://wpml.org/?page_id=2890
Description: BuddyPress Multilingual. <a href="http://wpml.org/?page_id=2890">Documentation</a>.
Author: OnTheGoSystems
Author URI: http://www.onthegosystems.com
Version: 1.3.0
Network: true
*/
/*
BuddyPress Multilingual is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
BuddyPress Multilingual is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with BuddyPress Multilingual. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Define constants
*/
define('BPML_VERSION', '1.3.0');
define('BPML_PLUGIN_URL', plugins_url(basename(dirname(__FILE__))));
add_action('plugins_loaded', 'bpml_plugins_loaded_hook', 0);
add_action('plugins_loaded', 'bpml_init_check', 11);
/**
* Trigger this before anything.
*
* Force getting cookie language on:
* Search
* AJAX call
*/
function bpml_plugins_loaded_hook() {
if (defined('BP_VERSION') && defined('ICL_SITEPRESS_VERSION')) {
if (!is_admin() && (isset($_POST['search-terms']) || isset($_REQUEST['action'])
|| (defined('DOING_AJAX') && DOING_AJAX))) {
add_filter('icl_set_current_language', 'bpml_get_cookie_lang');
}
}
}
/**
* Returns WPML cookie.
*
* @global $sitepress
* @param <type> $lang
* @return <type>
*/
function bpml_get_cookie_lang($lang = '') {
global $sitepress;
$lang_cookie = $sitepress->get_language_cookie();
if (empty($lang_cookie)) {
return empty($lang) ? ICL_LANGUAGE_CODE : $lang;
}
return $lang_cookie;
}
/**
* Checks if necessary conditions are met.
*
* @global <type> $sitepress_settings
*/
function bpml_init_check() {
global $sitepress_settings;
if (defined('BP_VERSION') && defined('ICL_SITEPRESS_VERSION')) {
if ((!isset($sitepress_settings['language_negotiation_type'])
|| $sitepress_settings['language_negotiation_type'] != 1)
&& is_main_site()) {
bpml_admin_message('<p>' . __('For BuddyPress Multilingual to work you must set WPML language negotiation to "languages in different directories".') . '</p>');
} else {
global $bpml;
$bpml = bpml_get_settings();
define('BPML_DEBUG', bpml_get_setting('debug', 0));
// Site wide
include_once dirname(__FILE__) . '/activities.php';
add_action('bp_activity_after_save', 'bpml_activities_bp_activity_after_save_hook');
add_action('bp_activity_before_save', 'bpml_activities_bp_activity_before_save_hook');
// Main blog
if (is_main_site ()) {
// Profiles
if (isset($bpml['profiles']) && $bpml['profiles']['translation'] != 'no') {
require_once dirname(__FILE__) . '/profiles.php';
if (!is_admin() && isset($bpml['profiles']['translate_fields_title'])) {
add_filter('bp_get_the_profile_field_name', 'bpml_bp_get_the_profile_field_name_filter');
}
add_action('xprofile_data_before_save', 'bpml_xprofile_data_before_save_hook');
add_action('init', 'bpml_profiles_init');
add_action('bp_after_profile_edit_content', 'bpml_profiles_bp_after_profile_edit_content_hook');
add_action('bpml_ajax', 'bpml_profiles_ajax');
add_filter('bp_get_the_profile_field_value', 'bpml_profiles_bp_get_the_profile_field_value_filter', 0, 3);
}
if (!is_admin()) {
require_once dirname(__FILE__) . '/frontend.php';
add_action('wp_head', 'bpml_wp_head_hook');
add_action('wp_footer', 'bpml_wp_footer', 9999);
add_action('wp', 'bpml_blogs_redirect_to_random_blog', 0);
add_action('bp_before_activity_loop', 'bpml_activities_bp_before_activity_loop_hook');
add_action('bp_core_render_message', 'bpml_show_frontend_notices');
// Filter site_url on regular pages
add_action('bp_before_header', 'bpml_bp_before_header_hook');
add_action('bp_after_footer', 'bpml_bp_after_footer_hook');
// Force filtering site_url on:
// Search
// AJAX call
if (isset($_POST['search-terms']) || isset($_REQUEST['action']) || (defined('DOING_AJAX') && DOING_AJAX)) {
add_filter('site_url', 'bpml_site_url_filter', 0);
}
// Filters main navigation menu
if(version_compare(BP_VERSION, '1.2.9') >= 0){
add_filter( 'wp_list_pages', 'nav_menu_filter' );
}
add_filter('admin_url', 'bpml_admin_url_filter', 0, 3);
add_filter('bp_core_get_root_domain', 'bpml_bp_core_get_root_domain_filter', 0);
add_filter('bp_uri', 'bpml_bp_uri_filter', 0);
add_filter('icl_ls_languages', 'bpml_icl_ls_languages_filter');
add_filter('bp_activity_get', 'bpml_activities_bp_activity_get_filter', 10, 2);
add_filter('bp_activity_get_specific', 'bpml_activities_bp_activity_get_filter', 10, 2);
add_filter('bp_get_activity_latest_update', 'bpml_bp_get_activity_latest_update_filter');
if ($bpml['activities']['show_activity_switcher']) {
add_action('bp_before_activity_entry', 'bpml_activities_assign_language_dropdown');
}
if ($bpml['activities']['enable_google_translation']) {
require_once dirname(__FILE__) . '/google-translate.php';
add_filter('bpml_activity_filter', 'bpml_google_translate_activity_filter', 10, 5);
add_action('wp_ajax_activity_widget_filter', 'bpml_google_translate_indicate_ajax');
add_action('wp_ajax_activity_get_older_updates', 'bpml_google_translate_indicate_ajax');
}
add_action('init', 'additional_css_js');
} else {
require_once dirname(__FILE__) . '/admin.php';
$version = get_option('bpml_version', FALSE);
if (empty($version) || version_compare($version, BPML_VERSION, '<')) {
require_once dirname(__FILE__) . '/upgrade.php';
bpml_upgrade();
}
add_action('admin_init', 'bpml_admin_show_stored_admin_notices');
add_action('admin_menu', 'bpml_admin_menu');
if (isset($_GET['page']) && $_GET['page'] == 'bpml') {
require_once dirname(__FILE__) . '/admin-form.php';
add_action('bpml_settings_form_before', 'bpml_profiles_admin_form');
add_action('admin_init', 'bpml_admin_save_settings_submit');
add_action('admin_init', 'admin_additional_css_js');
}
}
add_action('wp_ajax_bpml_ajax', 'bpml_ajax');
add_action('bpml_ajax', 'bpml_activities_ajax');
}
}
} else if (is_main_site ()) {
bpml_admin_message('<p>' . __('For BuddyPress Multilingual to work you must enable WPML and BuddyPress.') . '</p>');
}
}
/**
* Adds hook for CSS styles and jQuery to client-side.
*
*/
function additional_css_js() {
wp_enqueue_style('sitepress-language-switcher', ICL_PLUGIN_URL . '/res/css/language-selector.css', array(), ICL_SITEPRESS_VERSION);
wp_enqueue_style('bpml', BPML_PLUGIN_URL . '/style.css', array(), BPML_VERSION);
wp_enqueue_script('bpml', BPML_PLUGIN_URL . '/scripts.js', array('jquery'), BPML_VERSION);
}
/**
* Adds hook for Admin CSS styles and jQuery to admin-side.
*
*/
function admin_additional_css_js() {
wp_enqueue_style('bpml', BPML_PLUGIN_URL . '/style.css', array(), BPML_VERSION);
wp_enqueue_script('bpml', BPML_PLUGIN_URL . '/scripts.js', array('jquery'), BPML_VERSION);
}
/**
* Returns HTML output for admin message.
*
* @param <type> $message
* @param <type> $class
* @return <type>
*/
function bpml_message($message, $class = 'updated', $ID = NULL) {
$ID = is_null($ID) ? '' : ' id="' . $ID . '"';
return '<div class="message ' . $class . '"' . $ID . '>' . $message . '</div>';
}
/**
* Adds hook for admin_notices.
*
* @param <type> $message
* @param <type> $class
*/
function bpml_admin_message($message, $class = 'updated',
$action = 'admin_notices') {
add_action($action, create_function('$a=1', 'echo \'<div class="message ' . $class . '">' . $message . '</div>\';'));
}
/**
* Returns default BPML settings.
*
* @return <type>
*/
function bpml_default_settings() {
return array(
'debug' => 0,
'activities' => array(
'filter' => 0,
'display_orphans' => 'all',
'orphans_fix' => 0,
'enable_google_translation' => 0,
'show_activity_switcher' => 0,
),
'collected_activities' => array(
'activity_update' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => -1
),
'friendship_created' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => -1
),
'joined_group' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => -1
),
'created_group' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => -1
),
'new_blog' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => -1
),
'new_blog_post' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => 1
),
'new_blog_comment' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => 1
),
'activity_comment' => array(
'translate_title' => 1,
'translate_title_cache' => 1,
'translate_content' => 1,
'translate_content_cache' => 1,
'translate_links' => -1
),
),
);
}
/**
* Returns all settings.
*
* @return <type>
*/
function bpml_get_settings() {
return apply_filters('bpml_default_settings',
get_option('bpml', bpml_default_settings()));
}
/**
* Returns specific setting.
*
* @global <type> $bpml
* @param <type> $ID
* @param <type> $default
* @return <type>
*/
function bpml_get_setting($ID, $default = NULL) {
global $bpml;
if (isset($bpml[$ID])) {
return $bpml[$ID];
} else if (!is_null($default)) {
$bpml[$ID] = $default;
bpml_save_setting($ID, $default);
return $default;
}
}
/**
* Saves all settings.
*
* @global array $bpml
* @param <type> $data
*/
function bpml_save_settings($data) {
global $bpml;
$bpml = $data;
update_option('bpml', $bpml);
}
/**
* Saves specific setting.
*
* @global array $bpml
* @param <type> $ID
* @param <type> $data
*/
function bpml_save_setting($ID, $data) {
global $bpml;
$bpml[$ID] = $data;
update_option('bpml', $bpml);
}
/**
* Deletes specific setting.
*
* @global $bpml
* @param <type> $ID
*/
function bpml_delete_setting($ID) {
global $bpml;
if (isset($bpml[$ID])) {
unset($bpml[$ID]);
update_option('bpml', $bpml);
}
}
/**
* Caches admin notices.
*
* Notices are kept until BPML admin page is visited.
*
* @global array $bpml
* @param <type> $ID
* @param <type> $message
*/
function bpml_store_admin_notice($ID, $message) {
global $bpml;
$bpml['admin_notices'][$ID] = $message;
bpml_save_setting('admin_notices', $bpml['admin_notices']);
}
/**
* Caches frontend notices.
*
* @global array $bpml
* @param <type> $ID
* @param <type> $message
*/
function bpml_store_frontend_notice($ID, $message) {
global $bpml;
if (!isset($bpml['frontend_notices'])) {
$bpml['frontend_notices'] = array();
}
$bpml['frontend_notices'][$ID] = $message;
bpml_save_setting('frontend_notices', $bpml['frontend_notices']);
}
/**
* Displays frontend notices.
*
* @global array $bpml
* @param <type> $ID
* @param <type> $message
*/
function bpml_show_frontend_notices() {
global $bpml;
if (empty($bpml['frontend_notices'])) {
return '';
}
foreach ($bpml['frontend_notices'] as $message) {
echo bpml_message('<p>' . $message . '</p>', 'bpml-frontend-notice');
}
bpml_delete_setting('frontend_notices');
}
/**
* Fetches WPML language data from subblogs.
*
* @global <type> $wpdb
* @param <type> $blog_id
* @param <type> $type
* @param <type> $element_id
* @return <type>
*/
function bpml_get_wpml_language_data($blog_id, $type = 'post_post',
$element_id = NULL, $switch_db = FALSE) {
static $sitepress_settings = array();
if (isset($sitepress_settings[$blog_id][$type][$element_id])) {
return $sitepress_settings[$blog_id][$type][$element_id];
}
$result = array();
if ($switch_db) {
switch_to_blog($blog_id);
}
global $wpdb;
$table_name = $wpdb->prefix . 'icl_translations';
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
if ($switch_db) {
restore_current_blog();
}
return FALSE;
}
if (!isset($sitepress_settings[$blog_id])) {
$fetch = unserialize($wpdb->get_var("SELECT option_value FROM {$wpdb->prefix}options WHERE option_name='icl_sitepress_settings'"));
$sitepress_settings[$blog_id]['default_language'] = $fetch['default_language'];
}
switch ($type) {
case 'comment':
$post_id = $wpdb->get_var("SELECT comment_post_ID FROM {$wpdb->prefix}comments WHERE comment_ID=" . $element_id);
$post_type = 'post_' . $wpdb->get_var("SELECT post_type FROM {$wpdb->prefix}posts WHERE ID=" . $post_id);
$result['language'] = $wpdb->get_var("SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE element_type='" . $post_type . "' AND element_id=" . $post_id);
break;
default:
$result['language'] = $wpdb->get_var("SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE element_type='" . $type . "' AND element_id=" . $element_id);
break;
}
$result['default_language'] = $sitepress_settings[$blog_id]['default_language'];
$sitepress_settings[$blog_id][$type][$element_id] = $result;
if ($switch_db) {
restore_current_blog();
}
return $result;
}
/**
* Tries to get language data for item.
*
* @global <type> $sitepress
* @param <type> $item
* @param <type> $type
* @param <type> $switch_db
* @return <type>
*/
function bpml_get_item_language($item = NULL, $type = 'post_post',
$switch_db = FALSE) {
$lang = array();
global $sitepress;
if ($type == 'post_post' && !empty($sitepress) && isset($_POST['icl_post_language'])) { // In moment of save if WPML is active
$lang['language'] = $_POST['icl_post_language'];
$lang['default_language'] = $sitepress->get_default_language();
$lang['recorded_language'] = $sitepress->get_current_language();
} else if (!is_null($item)) { // Check in DB
$lang = bpml_get_wpml_language_data($item->item_id, $type, $item->secondary_item_id, $switch_db);
if (!empty($lang)) {
$lang['recorded_language'] = $lang['default_language'];
}
}
// Try to get WPLANG
if (empty($lang) && !empty($sitepress)) {
$temp = get_site_option('WPLANG');
if (!empty($temp)) {
if (strlen($temp) > 2) {
$temp = $wpdb->get_var("SELECT code FROM {$wpdb->prefix}icl_locale_map WHERE locale='" . $temp . "'");
}
$lang['default_language'] = $lang['language'] = $lang['recorded_language'] = $temp;
}
}
// Try to get RSS lang
if (empty($lang)) {
$temp = get_site_option('rss_language');
if (!empty($temp)) {
$lang['default_language'] = $lang['language'] = $lang['recorded_language'] = $temp;
}
}
return $lang;
}
/**
* BPML AJAX hook.
*/
function bpml_ajax() {
do_action('bpml_ajax');
exit;
}
/**
* Filters main navigation menu
*
* @global <type> $sitepress
* @global <type> $bp
* @global <type> $sitepress_settings
* @param <type> $items
* @return <type> $items
*/
function nav_menu_filter($items) {
global $sitepress, $bp, $sitepress_settings;
$default_language = $sitepress->get_default_language();
$additionalItems = '';
foreach($bp->active_components as $component => $value){
$pos = @strpos($items, $component);
$show_menu = ($pos !== false) ? $show_menu = false : $show_menu = true;
}
if(bp_is_page( BP_ACTIVITY_SLUG ) || bp_is_page( BP_MEMBERS_SLUG ) || bp_is_page( BP_GROUPS_SLUG ) || bp_is_page( BP_FORUMS_SLUG ) || bp_is_page( BP_BLOGS_SLUG ))
$currentLang = '/' . ICL_LANGUAGE_CODE;
else
bp_is_user() ? $currentLang = '/' . ICL_LANGUAGE_CODE : $currentLang = '';
if( $show_menu ){
$item_class = ( bp_is_page( BP_ACTIVITY_SLUG ) ) ? $activity_class = 'current_page_item' : $activity_class = '';
$item_class = ( bp_is_page( BP_MEMBERS_SLUG ) ) || bp_is_user() ? $members_class = 'current_page_item' : $members_class = '';
$item_class = ( bp_is_page( BP_GROUPS_SLUG ) ) || bp_is_group() ? $groups_class = 'current_page_item' : $groups_class = '';
$item_class = ( bp_is_page( BP_FORUMS_SLUG ) ) ? $forums_class = 'current_page_item' : $forums_class = '';
$item_class = ( bp_is_page( BP_BLOGS_SLUG ) ) ? $blogs_class = 'current_page_item' : $blogs_class = '';
if(!$currentLang == '') : $currentLang = $currentLang . '/'; endif;
if($default_language == ICL_LANGUAGE_CODE) : $currentLang = $currentLang = '/'; endif;
if ( bp_is_active( 'activity' ) ) :
$additionalItems .= '<li class="'. $activity_class .'"><a href="'. home_url() . $currentLang . BP_ACTIVITY_SLUG .'">' . __('Activity') . '</a></li>';
endif;
if ( bp_is_active( 'groups' ) ) :
$additionalItems .= '<li class="'. $groups_class .'"><a href="'. home_url() . $currentLang . BP_GROUPS_SLUG .'">' . __('Groups') . '</a></li>';
endif;
$additionalItems .= '<li class="'. $members_class .'"><a href="'. home_url() . $currentLang . BP_MEMBERS_SLUG .'">' . __('Members') . '</a></li>';
if ( bp_is_active( 'forums' ) ) :
$additionalItems .= '<li class="'. $forums_class .'"><a href="'. home_url() . $currentLang . BP_FORUMS_SLUG .'">' . __('Forums') . '</a></li>';
endif;
if ( bp_is_active( 'blogs' ) && is_multisite() ) :
$additionalItems .= '<li class="'. $blogs_class .'"><a href="'. home_url() . $currentLang . BP_BLOGS_SLUG .'">' . __('Blogs') . '</a></li>';
endif;
}
$items = $additionalItems . $items;
return $items;
}