Как заменить конструкцию query_posts на get_posts?
Во-первых, форматируйте код адекватно, эти длинные строки читать - адски неудобно (особенно отлавливать ваши двойные $$, лишние скобки и тд):// Параметры удобнее задавать отдельно
$args = array(
    'post_type' => APP_POST_TYPE,
    'ignore_sticky_posts' => true,
    'meta_query' => array( 
        array(
            'key' => 'cp_category', 
            'value' => 'Не определено', 
            'compare' => '=',
        ),
    ), 
);
// Получаем массив постов.
$categories = get_posts( $args );

// Перебираем массив, обязательно as $post, чтобы корректно работала функция setup_postdata()
foreach( $categories as $post ) {
    // Устанавливаем текущую запись в глобальный scope
    setup_postdata( $post );
    // Подключаем шаблон, который уже сможет видеть корректные данные из глобального scope
    get_template_part( 'loop', 'ad_listing' ); 
}
// Очищаем глобальный scope
wp_reset_postdata();
Не тестил, но должно работать.
Пагинация заработает при выполнении такого условия:For getting the current pagination number on a static front page (Page template) you have to use the 'page' query variable: Ссылка на источникif ( is_front_page() ) {
        $paged = (get_query_var('page')) ? get_query_var('page') : 1;   
    } else {
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
    }