first commit
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
use WPML\Element\API\TranslationsRepository;
|
||||
|
||||
/**
|
||||
* Class WPML_Custom_Columns
|
||||
*/
|
||||
class WPML_Custom_Columns implements IWPML_Action {
|
||||
const COLUMN_KEY = 'icl_translations';
|
||||
const CUSTOM_COLUMNS_PRIORITY = 1010;
|
||||
|
||||
/**
|
||||
* @param SitePress $sitepress
|
||||
*/
|
||||
private $sitepress;
|
||||
/**
|
||||
* @var WPML_Post_Status_Display
|
||||
*/
|
||||
public $post_status_display;
|
||||
|
||||
public function __construct( SitePress $sitepress ) {
|
||||
$this->sitepress = $sitepress;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $columns
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function add_posts_management_column( $columns ) {
|
||||
$new_columns = $columns;
|
||||
|
||||
if ( 'trash' === get_query_var( 'post_status' ) ) {
|
||||
return $columns;
|
||||
}
|
||||
|
||||
$flags_column = $this->get_flags_column();
|
||||
|
||||
if ( $flags_column ) {
|
||||
$new_columns = [];
|
||||
foreach ( $columns as $column_key => $column_content ) {
|
||||
$new_columns[ $column_key ] = $column_content;
|
||||
if ( ( 'title' === $column_key || 'name' === $column_key ) && ! isset( $new_columns[ self::COLUMN_KEY ] ) ) {
|
||||
$new_columns[ self::COLUMN_KEY ] = $flags_column;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $new_columns;
|
||||
}
|
||||
|
||||
public function get_flags_column() {
|
||||
$active_languages = $this->get_filtered_active_languages();
|
||||
if ( count( $active_languages ) <= 1 ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$current_language = $this->sitepress->get_current_language();
|
||||
unset( $active_languages[ $current_language ] );
|
||||
|
||||
if ( ! count( $active_languages ) ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$flags_column = '<span class="screen-reader-text">' . esc_html__( 'Languages', 'sitepress' ) . '</span>';
|
||||
foreach ( $active_languages as $language_data ) {
|
||||
$flags_column .= $this->get_flag_img( $language_data );
|
||||
}
|
||||
|
||||
return $flags_column;
|
||||
}
|
||||
|
||||
private function get_flag_img( $language_data ) {
|
||||
$url = $this->sitepress->get_flag_url( $language_data['code'] );
|
||||
|
||||
if ( $url !== '' ) {
|
||||
return '<img src="' . esc_url( $url ) .
|
||||
'" width="18" height="12" alt="' . esc_attr( $language_data['display_name'] ) . '" title="' .
|
||||
esc_attr( $language_data['display_name'] ) . '" style="margin:2px" />';
|
||||
} else {
|
||||
|
||||
return $language_data['code'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add posts management column.
|
||||
*
|
||||
* @param string $column_name
|
||||
* @param int|null $post_id
|
||||
*/
|
||||
public function add_content_for_posts_management_column( $column_name, $post_id = null ) {
|
||||
global $post;
|
||||
|
||||
if ( ! $post_id ) {
|
||||
$post_id = $post->ID;
|
||||
}
|
||||
|
||||
if ( self::COLUMN_KEY !== $column_name ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$active_languages = $this->get_filtered_active_languages();
|
||||
if ( null === $this->post_status_display ) {
|
||||
$this->post_status_display = new WPML_Post_Status_Display( $active_languages );
|
||||
}
|
||||
unset( $active_languages[ $this->sitepress->get_current_language() ] );
|
||||
foreach ( $active_languages as $language_data ) {
|
||||
$icon_html = $this->post_status_display->get_status_html( $post_id, $language_data['code'] );
|
||||
echo $icon_html;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check translation management column screen option.
|
||||
*
|
||||
* @param string $post_type Current post type.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function show_management_column_content( $post_type ) {
|
||||
$user = get_current_user_id();
|
||||
$hidden_columns = get_user_meta( $user, 'manageedit-' . $post_type . 'columnshidden', true );
|
||||
if ( '' === $hidden_columns ) {
|
||||
$is_visible = (bool) apply_filters( 'wpml_hide_management_column', true, $post_type );
|
||||
if ( false === $is_visible ) {
|
||||
update_user_meta( $user, 'manageedit-' . $post_type . 'columnshidden', array( self::COLUMN_KEY ) );
|
||||
}
|
||||
return $is_visible;
|
||||
}
|
||||
|
||||
return ! is_array( $hidden_columns ) || ! in_array( self::COLUMN_KEY, $hidden_columns, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of active languages.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function get_filtered_active_languages() {
|
||||
$active_languages = $this->sitepress->get_active_languages();
|
||||
return apply_filters( 'wpml_active_languages_access', $active_languages, array( 'action' => 'edit' ) );
|
||||
}
|
||||
|
||||
public function add_hooks() {
|
||||
add_action(
|
||||
'admin_init',
|
||||
array(
|
||||
$this,
|
||||
'add_custom_columns_hooks',
|
||||
),
|
||||
self::CUSTOM_COLUMNS_PRIORITY
|
||||
); // accommodate Types init@999
|
||||
}
|
||||
|
||||
/**
|
||||
* Add custom columns hooks.
|
||||
*/
|
||||
public function add_custom_columns_hooks() {
|
||||
$post_type = isset( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : 'post';
|
||||
if (
|
||||
$post_type && $this->has_custom_columns()
|
||||
&& array_key_exists( $post_type, $this->sitepress->get_translatable_documents() )
|
||||
) {
|
||||
|
||||
add_filter(
|
||||
'manage_' . $post_type . '_posts_columns',
|
||||
array(
|
||||
$this,
|
||||
'add_posts_management_column',
|
||||
)
|
||||
);
|
||||
|
||||
$show_management_column_content = $this->show_management_column_content( $post_type );
|
||||
if ( $show_management_column_content ) {
|
||||
if ( is_post_type_hierarchical( $post_type ) ) {
|
||||
add_action(
|
||||
'manage_pages_custom_column',
|
||||
array(
|
||||
$this,
|
||||
'add_content_for_posts_management_column',
|
||||
)
|
||||
);
|
||||
}
|
||||
add_action(
|
||||
'manage_posts_custom_column',
|
||||
array(
|
||||
$this,
|
||||
'add_content_for_posts_management_column',
|
||||
)
|
||||
);
|
||||
|
||||
add_action( 'manage_posts_custom_column', [ $this, 'preloadTranslationData' ], 1, 0 );
|
||||
add_action( 'manage_pages_custom_column', [ $this, 'preloadTranslationData' ], 1, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function preloadTranslationData() {
|
||||
static $loaded = false;
|
||||
if ( $loaded ) {
|
||||
return;
|
||||
}
|
||||
|
||||
global $wp_query;
|
||||
$posts = $wp_query->posts;
|
||||
|
||||
if ( is_array( $posts ) ) {
|
||||
TranslationsRepository::preloadForPosts( $posts );
|
||||
$loaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if we need to add custom columns on page.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function has_custom_columns() {
|
||||
global $pagenow;
|
||||
if ( 'edit.php' === $pagenow
|
||||
|| 'edit-pages.php' === $pagenow
|
||||
|| (
|
||||
'admin-ajax.php' === $pagenow
|
||||
&& (
|
||||
( array_key_exists( 'action', $_POST ) && 'inline-save' === filter_var( $_POST['action'] ) )
|
||||
|| ( array_key_exists( 'action', $_GET ) && 'fetch-list' === filter_var( $_GET['action'] )
|
||||
)
|
||||
)
|
||||
)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user