'field', 'plural' => 'fields', 'ajax' => false, ) ); $this->field_types = accua_forms_fields_get_types(); } function get_columns() { return array( 'cb' => '', 'name' => __( 'Label', 'contact-forms' ), 'slug' => __( 'Slug', 'contact-forms' ), 'type' => __( 'Type', 'contact-forms' ), 'forms' => __( 'Forms', 'contact-forms' ), 'description' => __( 'Description', 'contact-forms' ), ); } function get_sortable_columns() { return array( 'name' => array( 'name', false ), 'slug' => array( 'slug', false ), 'type' => array( 'type', false ), 'forms' => array( 'forms', false ), ); } function get_bulk_actions() { return array( 'delete' => __( 'Delete', 'contact-forms' ), ); } function column_cb( $item ) { return sprintf( '', esc_attr( $item['slug'] ) ); } function column_default( $item, $column_name ) { if ( isset( $item[ $column_name ] ) ) { return esc_html( $item[ $column_name ] ); } return ''; } function column_name( $item ) { $edit_url = admin_url( 'admin.php?page=accua_forms_fields&edit-fid=' . urlencode( $item['slug'] ) ); $delete_url = wp_nonce_url( admin_url( 'admin.php?page=accua_forms_fields&delete-fid=' . urlencode( $item['slug'] ) ), 'delete_form_field_' . $item['slug'] ); $actions = array( 'edit' => sprintf( '%s', esc_url( $edit_url ), esc_html__( 'Edit', 'contact-forms' ) ), 'delete' => sprintf( '%s', esc_url( $delete_url ), esc_js( __( 'Are you sure you want to delete this field?', 'contact-forms' ) ), esc_html__( 'Delete', 'contact-forms' ) ), ); return sprintf( '%s%s', esc_url( $edit_url ), esc_html( $item['name'] ), $this->row_actions( $actions ) ); } function column_type( $item ) { $type_key = $item['type']; if ( isset( $this->field_types[ $type_key ] ) ) { return esc_html( $this->field_types[ $type_key ] ); } return esc_html( $type_key ); } function column_forms( $item ) { $count = $item['forms']; if ( $count > 0 ) { return '' . (int) $count . ''; } return '0'; } function prepare_items() { $columns = $this->get_columns(); $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array( $columns, $hidden, $sortable ); $avail_fields = get_option( 'accua_forms_avail_fields', array() ); $saved_forms = get_option( 'accua_forms_saved_forms', array() ); // Count how many forms use each field $field_usage = array(); foreach ( $saved_forms as $form ) { if ( ! empty( $form['fields'] ) && is_array( $form['fields'] ) ) { foreach ( array_keys( $form['fields'] ) as $field_slug ) { if ( ! isset( $field_usage[ $field_slug ] ) ) { $field_usage[ $field_slug ] = 0; } $field_usage[ $field_slug ]++; } } } $data = array(); foreach ( $avail_fields as $id => $field ) { $data[] = array( 'slug' => $id, 'name' => $field['name'] ?? $field['label'] ?? $id, 'type' => $field['type'] ?? '', 'forms' => $field_usage[ $id ] ?? 0, 'description' => $field['description'] ?? '', ); } // Sorting // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only sort parameter $orderby = isset( $_GET['orderby'] ) ? sanitize_text_field( wp_unslash( $_GET['orderby'] ) ) : 'slug'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only sort parameter $order = isset( $_GET['order'] ) ? sanitize_text_field( wp_unslash( $_GET['order'] ) ) : 'asc'; $valid_columns = array( 'name', 'slug', 'type', 'forms' ); if ( ! in_array( $orderby, $valid_columns, true ) ) { $orderby = 'slug'; } $order_asc = ( 'desc' !== strtolower( $order ) ); usort( $data, function ( $a, $b ) use ( $orderby, $order_asc ) { if ( $orderby === 'forms' ) { $result = $a['forms'] - $b['forms']; } else { $result = strcasecmp( $a[ $orderby ], $b[ $orderby ] ); } return $order_asc ? $result : -$result; } ); $this->items = $data; } protected function get_default_primary_column_name() { return 'name'; } }