isset( $_GET['search_source'] ) ? sanitize_text_field( wp_unslash( $_GET['search_source'] ) ) : '', 'search_trans' => isset( $_GET['search_trans'] ) ? sanitize_text_field( wp_unslash( $_GET['search_trans'] ) ) : '', 'search_url' => isset( $_GET['search_url'] ) ? sanitize_text_field( wp_unslash( $_GET['search_url'] ) ) : '', 'language_from' => isset( $_GET['language_from'] ) ? sanitize_text_field( wp_unslash( $_GET['language_from'] ) ) : '', 'language_to' => isset( $_GET['language_to'] ) ? sanitize_text_field( wp_unslash( $_GET['language_to'] ) ) : '', 'engine' => isset( $_GET['engine'] ) ? sanitize_text_field( wp_unslash( $_GET['engine'] ) ) : '', 'type' => isset( $_GET['type'] ) ? sanitize_text_field( wp_unslash( $_GET['type'] ) ) : '', 'only_empty' => ! empty( $_GET['only_empty'] ), ); $apgt_paged = isset( $_GET['paged'] ) ? max( 1, (int) $_GET['paged'] ) : 1; $apgt_pagesize = isset( $_GET['pagesize'] ) ? max( 5, min( 200, (int) $_GET['pagesize'] ) ) : 20; // phpcs:enable WordPress.Security.NonceVerification.Recommended $apgt_has_filter = false; foreach ( $apgt_filters as $apgt_k => $apgt_v ) { if ( 'only_empty' === $apgt_k ? $apgt_v : '' !== $apgt_v ) { $apgt_has_filter = true; } } $apgt_result = APGT_Store::query( array_merge( $apgt_filters, array( 'paged' => $apgt_paged, 'pagesize' => $apgt_pagesize, ) ) ); $apgt_total = (int) $apgt_result['total']; $apgt_rows = $apgt_result['rows']; $apgt_pages = (int) ceil( $apgt_total / $apgt_pagesize ); $apgt_engines = APGT_Store::distinct_engines(); $apgt_types = APGT_Store::distinct_types(); $apgt_langs = APGT_Store::distinct_languages(); // 语言下拉的候选:库里出现过的 + 站点配置的,去重。 $apgt_from_opts = array(); $apgt_to_opts = array(); foreach ( $apgt_langs as $apgt_pair ) { if ( '' !== $apgt_pair['language_from'] ) { $apgt_from_opts[ $apgt_pair['language_from'] ] = true; } if ( '' !== $apgt_pair['language_to'] ) { $apgt_to_opts[ $apgt_pair['language_to'] ] = true; } } foreach ( array_keys( APGT_Settings::target_languages() ) as $apgt_iso ) { $apgt_to_opts[ $apgt_iso ] = true; } $apgt_from_opts = array_keys( $apgt_from_opts ); $apgt_to_opts = array_keys( $apgt_to_opts ); sort( $apgt_from_opts ); sort( $apgt_to_opts ); /** * 生成保留当前筛选的链接。 * * @param array $extra 要覆盖的参数。 * @return string */ function apgt_data_url( $extra = array() ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $base = $_GET; unset( $base['_wpnonce'] ); $base = array_merge( $base, $extra ); $base['page'] = APGT_Admin::PAGE_DATA; return admin_url( 'admin.php?' . http_build_query( array_map( 'strval', array_filter( $base, 'strlen' ) ) ) ); } /** * paginate_links 的 base。 * * 占位符 %#% 不能经 http_build_query(会被编码成 %25%23%25,所有页码就都 * 指向同一个无效地址了),先塞一个不会被编码的记号再换回来。 * * @return string */ function apgt_data_page_base() { return str_replace( 'APGTPAGEDPLACEHOLDER', '%#%', apgt_data_url( array( 'paged' => 'APGTPAGEDPLACEHOLDER' ) ) ); } /** * 输出分页导航。 * * @param int $pages 总页数。 * @param int $current 当前页。 * @return void */ function apgt_data_pagination( $pages, $current ) { if ( $pages < 2 ) { return; } echo wp_kses_post( paginate_links( array( 'base' => apgt_data_page_base(), 'format' => '', 'prev_text' => '‹', 'next_text' => '›', 'total' => $pages, 'current' => $current, 'type' => 'plain', ) ) ); } ?>