Source: includes/ajax/class-settings.php

<?php
namespace jb\ajax;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! class_exists( 'jb\ajax\Settings' ) ) {


	/**
	 * Class Settings
	 *
	 * @package jb\ajax
	 */
	class Settings {


		/**
		 * Settings constructor.
		 */
		public function __construct() {
		}


		/**
		 * AJAX callback for getting the pages list
		 */
		public function get_pages_list() {
			JB()->ajax()->check_nonce( 'jb-backend-nonce' );
			// phpcs:disable WordPress.Security.NonceVerification -- is verified above

			// we will pass post IDs and titles to this array
			$return = array();

			$search_query = ! empty( $_GET['search'] ) ? sanitize_text_field( wp_unslash( $_GET['search'] ) ) : '';
			$paged        = ! empty( $_GET['page'] ) ? absint( $_GET['page'] ) : 1;

			/**
			 * Filters the predefined pages list in dropdown results.
			 *
			 * Note: It's an internal hook for integration with multilingual plugins.
			 *
			 * @since 1.1.1
			 * @hook jb_admin_settings_get_pages_list
			 *
			 * @param {bool|array} $pre_result `false` or WP_Query results with the list of the pages.
			 *
			 * @return {bool|array} WP_Query results with the list of the pages. Otherwise `false`.
			 */
			$pre_result = apply_filters( 'jb_admin_settings_get_pages_list', false );
			if ( false === $pre_result ) {
				// you can use WP_Query, query_posts() or get_posts() here - it doesn't matter
				$search_results = new \WP_Query(
					array(
						'post_type'           => 'page',
						's'                   => $search_query, // the search query
						'post_status'         => 'publish', // if you don't want drafts to be returned
						'ignore_sticky_posts' => 1,
						'posts_per_page'      => 10, // how much to show at once
						'paged'               => $paged,
						'orderby'             => 'title',
						'order'               => 'asc',
					)
				);

				if ( $search_results->have_posts() ) {
					while ( $search_results->have_posts() ) {
						$search_results->the_post();

						// shorten the title a little
						$title = ( mb_strlen( $search_results->post->post_title ) > 50 ) ? mb_substr( $search_results->post->post_title, 0, 49 ) . '...' : $search_results->post->post_title;

						// translators: %1$s is a post title; %2$s is a post ID.
						$title    = sprintf( __( '%1$s (ID: %2$s)', 'jobboardwp' ), $title, $search_results->post->ID );
						$return[] = array( $search_results->post->ID, esc_html( $title ) ); // array( Post ID, Post Title )
					}
				}

				$return['total_count'] = $search_results->found_posts;
			} else {
				// got already calculated posts array from 3rd-party integrations (e.g. WPML, Polylang)
				$return = $pre_result;
			}

			wp_send_json( $return );

			// phpcs:утфиду WordPress.Security.NonceVerification -- is verified above
		}
	}
}