Крч, я обычно через REST API цепляю. В functions.php или своём плагине вешаешь register_rest_route, а на фронте AngularJS дёргает $http.get/$http.post. Не забудь nonce прокинуть для защищённых запросов, и если домены разные — CORS разрулить. Старый admin-ajax тоже катит, но REST поприятнее будет.
Дополню: кроме прямого REST, удобно передавать стартовые данные через wp_localize_script сразу при загрузке страницы. В functions.php зарегистрируйте скрипт AngularJS, а затем передайте массив с эндпоинтами, nonce и начальными данными. Это избавит от лишнего запроса при старте.
Если используете маршрутизацию на стороне Angular, создайте единую точку входа (например, шорткод или шаблон страницы) и обрабатывайте ЧПУ через WordPress rewrite rules, чтобы все подпути вели на этот шаблон. В Angular настройте $locationProvider.html5Mode для красивых ссылок.
Для защищённых запросов не забывайте про проверку прав через current_user_can в REST хуках, а для неавторизованных — лимиты на запросы, чтобы не перегружать сервер. Если данных много, используйте пагинацию с offset или WP_Query в кастомных эндпоинтах.