handleSubmission(); // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Read-only search and pagination. $search = isset( $_GET['phone'] ) ? sanitize_text_field( wp_unslash( $_GET['phone'] ) ) : ''; $page = isset( $_GET['paged'] ) ? max( 1, absint( wp_unslash( $_GET['paged'] ) ) ) : 1; // phpcs:enable WordPress.Security.NonceVerification.Recommended $list = Optouts::page( $page, self::PER_PAGE, $search ); Ui::pageOpen( __( 'فهرست لغو', 'rahkar-toolkit' ), __( 'شماره‌هایی که پیامک تبلیغاتی نمی‌گیرند. پیامک سفارش و کد ورود همچنان برایشان می‌رود.', 'rahkar-toolkit' ), Help::link( 'notifications', __( 'اطلاع‌رسانی', 'rahkar-toolkit' ) ) ); if ( null !== $notice ) { echo wp_kses( Ui::notice( $notice[0], $notice[1] ), Ui::allowedHtml() ); } $this->renderAddForm(); $this->renderSearch( $search ); $this->renderTable( $list['rows'] ); $pages = (int) ceil( $list['total'] / self::PER_PAGE ); echo wp_kses( Ui::pagination( $page, $pages, static fn( int $n ): string => add_query_arg( [ 'page' => self::SLUG, 'paged' => $n, ], admin_url( 'admin.php' ) ), /* translators: %s: number of numbers on the list */ sprintf( __( '%s شماره', 'rahkar-toolkit' ), number_format_i18n( $list['total'] ) ) ), Ui::allowedHtml() ); Ui::pageClose(); } /** * Add or remove a number, if the form was posted. * * @return array{0: string, 1: string}|null Notice status and text. */ private function handleSubmission(): ?array { if ( ! isset( $_POST['rahkar_optout_action'] ) ) { return null; } check_admin_referer( self::NONCE ); $action = sanitize_key( wp_unslash( $_POST['rahkar_optout_action'] ) ); $phone = isset( $_POST['phone'] ) ? sanitize_text_field( wp_unslash( $_POST['phone'] ) ) : ''; if ( 'add' === $action ) { return Optouts::add( $phone, 'admin' ) ? [ 'success', __( 'شماره به فهرست لغو اضافه شد.', 'rahkar-toolkit' ) ] : [ 'warning', __( 'شماره معتبر نیست یا از قبل در فهرست است.', 'rahkar-toolkit' ) ]; } if ( 'remove' === $action ) { return Optouts::remove( $phone, 'admin' ) ? [ 'success', __( 'شماره از فهرست لغو برداشته شد و دوباره پیامک تبلیغاتی می‌گیرد.', 'rahkar-toolkit' ) ] : [ 'warning', __( 'این شماره در فهرست نبود.', 'rahkar-toolkit' ) ]; } return null; } /** * The add and remove form. Both need the full number, since the list keeps none. */ private function renderAddForm(): void { Ui::panelOpen( __( 'افزودن یا برداشتن شماره', 'rahkar-toolkit' ) ); Ui::formOpen(); wp_nonce_field( self::NONCE ); Ui::toolbarOpen( false ); echo wp_kses( Ui::input( 'tel', 'phone', '', [ 'placeholder' => '0912…' ], true ), Ui::allowedHtml() ); echo wp_kses( Ui::button( __( 'افزودن به فهرست', 'rahkar-toolkit' ), 'primary', [ 'type' => 'submit', 'name' => 'rahkar_optout_action', 'value' => 'add' ] ), Ui::allowedHtml() ); echo wp_kses( Ui::button( __( 'برداشتن از فهرست', 'rahkar-toolkit' ), 'secondary', [ 'type' => 'submit', 'name' => 'rahkar_optout_action', 'value' => 'remove' ] ), Ui::allowedHtml() ); Ui::toolbarClose(); Ui::formClose(); Ui::panelClose(); } /** * Look a number up. * * @param string $search Current search. */ private function renderSearch( string $search ): void { Ui::formOpen( 'get' ); printf( '', esc_attr( self::SLUG ) ); Ui::toolbarOpen(); echo wp_kses( Ui::input( 'search', 'phone', $search, [ 'placeholder' => __( 'جست‌وجوی شماره', 'rahkar-toolkit' ) ], true ), Ui::allowedHtml() ); echo wp_kses( Ui::button( __( 'جست‌وجو', 'rahkar-toolkit' ), 'secondary', [ 'type' => 'submit' ] ), Ui::allowedHtml() ); Ui::toolbarClose(); Ui::formClose(); } /** * The list. * * @param list $rows Rows to show. */ private function renderTable( array $rows ): void { $sources = [ 'sms_reply' => __( 'پاسخ پیامکی', 'rahkar-toolkit' ), 'provider' => __( 'گزارش درگاه', 'rahkar-toolkit' ), 'admin' => __( 'دستی', 'rahkar-toolkit' ), ]; Ui::tableOpen( [ __( 'شماره', 'rahkar-toolkit' ), __( 'منبع', 'rahkar-toolkit' ), __( 'زمان', 'rahkar-toolkit' ) ], true ); if ( [] === $rows ) { echo wp_kses( Ui::tableEmptyRow( 3, __( 'هیچ شماره‌ای در فهرست نیست.', 'rahkar-toolkit' ) ), Ui::allowedHtml() ); } foreach ( $rows as $row ) { $time = strtotime( $row['created_at'] . ' UTC' ); printf( '%s%s%s', esc_html( $row['phone_masked'] ), esc_html( $sources[ $row['source'] ] ?? $row['source'] ), esc_html( false === $time ? '' : (string) wp_date( 'Y/m/d H:i', $time ) ) ); } Ui::tableClose(); } }