Make WordPress Core

Changeset 48374


Ignore:
Timestamp:
07/07/2020 01:41:30 PM (4 years ago)
Author:
SergeyBiryukov
Message:

Plugins: Make sure the HTML ID attributes in plugin action links are unique.

Follow-up to [47588].

Props mukesh27, roytanck, SergeyBiryukov.
Fixes #49916.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/class-wp-plugins-list-table.php

    r48184 r48374  
    678678    public function single_row( $item ) {
    679679        global $status, $page, $s, $totals;
     680        static $plugin_id_attrs = array();
    680681
    681682        list( $plugin_file, $plugin_data ) = $item;
    682683
    683         $plugin_slug = isset( $plugin_data['slug'] ) ? $plugin_data['slug'] : sanitize_title( $plugin_data['Name'] );
     684        $plugin_slug    = isset( $plugin_data['slug'] ) ? $plugin_data['slug'] : sanitize_title( $plugin_data['Name'] );
     685        $plugin_id_attr = $plugin_slug;
     686
     687        // Ensure the ID attribute is unique.
     688        $suffix = 2;
     689        while ( in_array( $plugin_id_attr, $plugin_id_attrs, true ) ) {
     690            $plugin_id_attr = "$plugin_slug-$suffix";
     691            $suffix++;
     692        }
     693
     694        $plugin_id_attrs[] = $plugin_id_attr;
    684695
    685696        $context = $status;
     
    740751                            '<a href="%s" id="deactivate-%s" aria-label="%s">%s</a>',
    741752                            wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ),
    742                             esc_attr( $plugin_slug ),
     753                            esc_attr( $plugin_id_attr ),
    743754                            /* translators: %s: Plugin name. */
    744755                            esc_attr( sprintf( _x( 'Network Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ),
     
    751762                            '<a href="%s" id="activate-%s" class="edit" aria-label="%s">%s</a>',
    752763                            wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ),
    753                             esc_attr( $plugin_slug ),
     764                            esc_attr( $plugin_id_attr ),
    754765                            /* translators: %s: Plugin name. */
    755766                            esc_attr( sprintf( _x( 'Network Activate %s', 'plugin' ), $plugin_data['Name'] ) ),
     
    762773                            '<a href="%s" id="delete-%s" class="delete" aria-label="%s">%s</a>',
    763774                            wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ),
    764                             esc_attr( $plugin_slug ),
     775                            esc_attr( $plugin_id_attr ),
    765776                            /* translators: %s: Plugin name. */
    766777                            esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ),
     
    783794                            '<a href="%s" id="deactivate-%s" aria-label="%s">%s</a>',
    784795                            wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ),
    785                             esc_attr( $plugin_slug ),
     796                            esc_attr( $plugin_id_attr ),
    786797                            /* translators: %s: Plugin name. */
    787798                            esc_attr( sprintf( _x( 'Deactivate %s', 'plugin' ), $plugin_data['Name'] ) ),
     
    794805                            '<a href="%s" id="resume-%s" class="resume-link" aria-label="%s">%s</a>',
    795806                            wp_nonce_url( 'plugins.php?action=resume&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'resume-plugin_' . $plugin_file ),
    796                             esc_attr( $plugin_slug ),
     807                            esc_attr( $plugin_id_attr ),
    797808                            /* translators: %s: Plugin name. */
    798809                            esc_attr( sprintf( _x( 'Resume %s', 'plugin' ), $plugin_data['Name'] ) ),
     
    805816                            '<a href="%s" id="activate-%s" class="edit" aria-label="%s">%s</a>',
    806817                            wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ),
    807                             esc_attr( $plugin_slug ),
     818                            esc_attr( $plugin_id_attr ),
    808819                            /* translators: %s: Plugin name. */
    809820                            esc_attr( sprintf( _x( 'Activate %s', 'plugin' ), $plugin_data['Name'] ) ),
     
    816827                            '<a href="%s" id="delete-%s" class="delete" aria-label="%s">%s</a>',
    817828                            wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . urlencode( $plugin_file ) . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ),
    818                             esc_attr( $plugin_slug ),
     829                            esc_attr( $plugin_id_attr ),
    819830                            /* translators: %s: Plugin name. */
    820831                            esc_attr( sprintf( _x( 'Delete %s', 'plugin' ), $plugin_data['Name'] ) ),
Note: See TracChangeset for help on using the changeset viewer.