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();
}
}