options = &$polylang->options; $this->model = &$polylang->model; $this->curlang = &$polylang->curlang; // Admin. if ( $polylang instanceof PLL_Settings && ( empty( $_GET['page'] ) || 'mlang' === $_GET['page'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification add_filter( 'pll_languages_row_classes', array( $this, 'row_classes' ), 10, 2 ); add_filter( 'pll_default_lang_row_action', array( $this, 'remove_default_lang_action' ), 10, 2 ); add_filter( 'pll_languages_row_actions', array( $this, 'row_actions' ), 10, 2 ); add_action( 'mlang_action_enable', array( $this, 'enable' ) ); add_action( 'mlang_action_disable', array( $this, 'disable' ) ); add_action( 'admin_print_styles', array( $this, 'print_css' ) ); } if ( ! current_user_can( 'edit_posts' ) ) { add_action( 'pll_language_defined', array( $this, 'init' ) ); add_action( 'wp_sitemaps_init', array( $this, 'init' ) ); add_action( 'rest_api_init', array( $this, 'init' ) ); add_filter( 'pll_languages_for_browser_preferences', array( $this, 'remove_inactive_languages' ) ); } } /** * Adds class inactive / active class * * @since 1.9 * * @param string[] $classes CSS classes applied to a row in the languages list table. * @param PLL_Language $language The language. * @return string[] Modified list of classes. */ public function row_classes( $classes, $language ) { return empty( $language->active ) ? array( 'inactive' ) : array(); } /** * Remove the default lang action for disabled languages * * @since 1.9 * * @param string $action HTML markup of the action to define the default language. * @param PLL_Language $language The Language. * @return string Modified row action. */ public function remove_default_lang_action( $action, $language ) { if ( empty( $language->active ) ) { return ''; } return $action; } /** * Adds disable/enable links to row actions in the languages list table * * @since 1.9 * * @param string[] $actions The list of the HTML markup of row actions. * @param PLL_Language $language The language. * @return string[] Modified list of row actions. */ public function row_actions( $actions, $language ) { if ( $language->is_default ) { return $actions; } $active_action = empty( $language->active ) ? array( 'enable' => sprintf( '%s', esc_attr__( 'Activate this language', 'polylang-pro' ), wp_nonce_url( '?page=mlang&pll_action=enable&noheader=true&lang=' . $language->term_id, 'enable-lang' ), esc_html__( 'Activate', 'polylang-pro' ) ), ) : array( 'disable' => sprintf( '%s', esc_attr__( 'Deactivate this language', 'polylang-pro' ), wp_nonce_url( '?page=mlang&pll_action=disable&noheader=true&lang=' . $language->term_id, 'disable-lang' ), esc_html__( 'Deactivate', 'polylang-pro' ) ), ); return array_merge( $active_action, $actions ); } /** * Enables or disables a language * * @since 1.9 * * @param int $lang_id The language term id. * @param bool $enable True to enable, false to disable. * @return void */ public function _enable( $lang_id, $enable ) { $lang_id = (int) $lang_id; $language = get_term( $lang_id, 'language' ); if ( ! $language instanceof WP_Term ) { return; } $description = maybe_unserialize( $language->description ); $description['active'] = $enable; wp_update_term( $lang_id, 'language', array( 'description' => maybe_serialize( $description ) ) ); $this->model->clean_languages_cache(); } /** * Enables a language * * @since 1.9 * * @return void */ public function enable() { check_admin_referer( 'enable-lang' ); if ( isset( $_GET['lang'] ) ) { $this->_enable( (int) $_GET['lang'], true ); } PLL_Settings::redirect(); } /** * Disables a language * * @since 1.9 * * @return void */ public function disable() { check_admin_referer( 'disable-lang' ); if ( isset( $_GET['lang'] ) ) { $this->_enable( (int) $_GET['lang'], false ); } PLL_Settings::redirect(); } /** * Sets error 404 if the requested language is not active. * * @since 1.9 * * @return void */ public function maybe_set_404() { if ( isset( $this->curlang, $this->curlang->active ) && empty( $this->curlang->active ) ) { $GLOBALS['wp_query']->set_404(); add_filter( 'wp_sitemaps_enabled', '__return_false' ); /** * Fires when a visitor attempts to access to an inactive language. * * @since 2.7 * * @param string $slug Requested language code. * @param PLL_Language $curlang Requested language object. */ do_action( 'pll_inactive_language_requested', $this->curlang->slug, $this->curlang ); } } /** * Styles the border * * @since 1.9 * * @return void */ public function print_css() { ?> remove_inactive_languages( $this->model->get_languages_list() ); $this->model->cache->set( 'languages', $languages ); // FIXME access to $this->model->cache which I would prefer to keep protected. add_action( 'wp', array( $this, 'maybe_set_404' ) ); } /** * Removes inactive languages from the list of languages. * * @since 1.9.3 * * @param PLL_Language[] $languages Array of PLL_Language objects. * @return PLL_Language[] */ public function remove_inactive_languages( $languages ) { foreach ( $languages as $k => $lang ) { if ( empty( $lang->active ) ) { unset( $languages[ $k ] ); } } return array_values( $languages ); } }