HEX
Server: Apache
System: Linux efa57bbe-abb1-400d-2985-3b056fbc2701.secureserver.net 6.1.147-1.el9.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jul 24 12:33:32 EDT 2025 x86_64
User: root (0)
PHP: 8.0.30.4
Disabled: NONE
Upload Files
File: /var/www/wp-content/plugins/pojo-accessibility/modules/scanner/components/list-column.php
<?php

namespace EA11y\Modules\Scanner\Components;

use EA11y\Classes\Database\Exceptions\Missing_Table_Exception;
use EA11y\Modules\Remediation\Classes\Utils;
use EA11y\Modules\Remediation\Database\Page_Entry;
use EA11y\Modules\Remediation\Database\Page_Table;
use EA11y\Modules\Scanner\Database\Scan_Entry;

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

class List_Column {
	public function get_name(): string {
		return 'list-column';
	}

	public function build_column() {
		$post_types = get_post_types( [ 'public' => true ], 'names' );
		$taxonomies = get_taxonomies( [ 'public' => true ], 'names' );
		foreach ( $post_types as $post_type ) {
			add_filter( "manage_{$post_type}_posts_columns", [ $this, 'add_accessibility_column' ] );
			add_action( "manage_{$post_type}_posts_custom_column", [ $this, 'render_accessibility_column_post' ], 10, 2 );
		}
		foreach ( $taxonomies as $taxonomy ) {
			add_filter( "manage_edit-{$taxonomy}_columns", [ $this, 'add_accessibility_column' ] );
			add_filter( "manage_{$taxonomy}_custom_column", [ $this, 'render_accessibility_column_tax' ], 10, 3 );
		}
	}

	public function add_accessibility_column( $columns ) {
		$columns['accessibility_status'] = '<a class="ea11y-tooltip ea11y-tooltip-n ea11y-tooltip-hidden" data-label="' . esc_attr__( 'Ally', 'pojo-accessibility' ) . '"><img src="' . esc_url( EA11Y_ASSETS_URL . 'images/logo.svg' ) . '" alt="" style="width:20px; height:20px; vertical-align:middle; margin-right:8px;" /></a><span class="ea11y-column-title" title="' . esc_attr__( 'Ally', 'pojo-accessibility' ) . '">' . esc_html__( 'Ally', 'pojo-accessibility' ) . '</span>';
		return $columns;
	}

	public function render_accessibility_column_post( $column, $post_id ) {
		if ( 'accessibility_status' === $column ) {
			$post = get_post( $post_id );
			$url = in_array( $post->post_status, [ 'draft', 'pending', 'auto-draft' ], true )
				? Utils::build_draft_url( $post )
				: get_permalink( $post_id );
			$this->render_column_accessibility( $url );
		}
	}

	public function render_accessibility_column_tax( $content, $column, $term_id ) {
		if ( 'accessibility_status' === $column ) {
			$url = get_term_link( $term_id );
			$this->render_column_accessibility( $url );
		}
		return $content;
	}

	private function get_current_page( string $url ): ?Page_Entry {
		try {
			return new Page_Entry( [
				'by' => Page_Table::URL,
				'value' => $url,
			] );
		} catch ( Missing_Table_Exception $e ) {
			return null;
		}
	}

	private function render_column_accessibility( string $url ) {
		$url_trimmed = rtrim( $url, '/' );
		$page = $this->get_current_page( $url_trimmed );
		$has_scan_data = $page->exists();
		$latest_scan = Scan_Entry::get_scan_result( $url_trimmed, true );

		if ( empty( $latest_scan ) ) {
			$latest_scan = [
				'counts' => [
					'violation' => 0,
					'issuesResolved' => 0,
				],
			];
		}

		$violation = $latest_scan['counts']['violation'];
		$resolved = $latest_scan['counts']['issuesResolved'];

		$passed = $has_scan_data && $resolved === $violation;

		$separator = strpos( $url, '?' ) !== false ? '&' : '?';
		$assistant_url = esc_url( $url . $separator . 'open-ea11y-assistant=1&open-ea11y-assistant-src=WP' );

		if ( $passed ) {
			$content = '<img src="' . esc_url( EA11Y_ASSETS_URL . 'images/check-icon.svg' ) . '" alt="' . esc_attr__( 'All accessibility issues resolved', 'pojo-accessibility' ) . '" style="width:24px; height:24px;" />';
		} else {
			if ( $has_scan_data ) {
				$issues_left = $violation - $resolved;
				$button_text = sprintf(
					/* translators: %d: number of issues to fix */
					_n( 'Fix %d issue', 'Fix %d issues', $issues_left, 'pojo-accessibility' ),
					$issues_left
				);
				$tooltip_text = sprintf(
					/* translators: %d: number of issues to fix */
					_n( 'Fix %d issue', 'Fix %d issues', $issues_left, 'pojo-accessibility' ),
					$issues_left
				);
				$button_class = 'button ea11y-accessibility-button';
				$button_style = 'color: #B91C1C; border-color: #B91C1C;';
				$short_text = esc_html__( 'Fix', 'pojo-accessibility' );
			} else {
				$button_text = esc_html__( 'Scan URL', 'pojo-accessibility' );
				$tooltip_text = esc_html__( 'Scan URL', 'pojo-accessibility' );
				$button_class = 'button button-primary ea11y-accessibility-button';
				$button_style = '';
				$short_text = esc_html__( 'Scan', 'pojo-accessibility' );
			}

			$content = sprintf(
				'<a href="%1$s" class="%2$s ea11y-tooltip ea11y-tooltip-n" target="_blank" rel="noreferrer" style="%3$s" data-full-text="%4$s" data-short-text="%5$s" data-label="%6$s"><span class="ea11y-button-text">%7$s</span></a>',
				$assistant_url,
				$button_class,
				$button_style,
				esc_attr( $button_text ),
				esc_attr( $short_text ),
				esc_attr( $tooltip_text ),
				$button_text
			);
		}

		echo '<div class="accessibility_status_content">
			<div class="accessibility_status_content__actions">' . $content . '</div>
		</div>';
	}

	/**
	 * Component constructor.
	 */
	public function __construct() {
		add_action( 'init', [ $this, 'build_column' ] );
		add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_assets' ] );
	}

	/**
	 * Enqueue assets for the accessibility column enhancements.
	 */
	public function enqueue_assets() {
		$screen = get_current_screen();

		// Only load on edit.php pages (post list tables) and edit-tags.php (taxonomy list tables)
		if ( ! $screen || ! in_array( $screen->base, [ 'edit', 'edit-tags' ], true ) ) {
			return;
		}

		// Enqueue JavaScript
		wp_enqueue_script(
			'ea11y-list-column',
			EA11Y_URL . 'modules/scanner/assets/js/list-column.js',
			[],
			EA11Y_VERSION,
			true
		);

		// CSS is now included in the main ea11y-scanner-admin.scss file
	}
}