Existem pelo menos três maneiras de implementar pontos de extremidade Ajax em plugins ou temas do WordPress. Admin-Ajax é algo que existe há muito tempo, e WP_REST é a forma nova. Regras de reescrita(Rewrite-Rule) são outra abordagem. Vou explicar todas as três variantes com exemplos de código e tentar identificar vantagens e desvantagens.
Admin-Ajax
O arquivo admin-ajax.php está localizado no diretório wp-admin desde a versão 2.1.0 do WordPress. Seu nome sugere o uso apenas no painel de administração, mas ele pode ser usado para solicitações não autenticadas e autenticadas.
Uma solicitação a este arquivo iniciará o núcleo do WordPress, as funções do tema (e do tema filho) e os plugins, mas não resultará na execução global de WP_Query ou na resolução de modelos. Pode ser usado para qualquer tipo de método de solicitação (GET, POST, PUT, PATCH, DELETE) desde que o valor de $_REQUEST['action'] seja fornecido. Esse valor de ação é usado para acionar uma ação. Se nenhum manipulador de ação estiver registrado, uma string '0' será retornada.
Exemplo básico não autenticado de Admin-Ajax
<?php namespace PublicFunctionOrg\WordPress\CodeSamples; // ------------------------------------------------ // /wp-admin/admin-ajax.php?action=my_action // ------------------------------------------------ function my_unauthorized_action_handler(){ $latestPostTitles = array_map(function($post){ return $post->post_title; }, get_posts()); wp_send_json($latestPostTitles); exit; } add_action('wp_ajax_nopriv_my_action',__NAMESPACE__.'\my_unauthorized_action_handler'); // Na maioria das vezes, você deseja que usuários autorizados possam usar também os pontos de extremidade públicos. add_action('wp_ajax_my_action',__NAMESPACE__.'\my_unauthorized_action_handler');
Com essas poucas linhas de código, podemos chamar nosso novo ponto de extremidade Ajax com a URL /wp-admin/admin-ajax.php?action=my_action. É importante notar que a ação wp_ajax_noproiv_{action} só funcionará se sua solicitação não estiver autenticada. Se você tiver uma sessão de login em execução no navegador, a resposta será '0'. Portanto, na maioria dos casos, você também deve adicionar a ação autenticada.
Exemplo básico autenticado de Admin-Ajax
Se você deseja fornecer dados restritos a usuários autenticados, é necessário registrar um manipulador de ação wp_ajax_{action}. Solicitações não autenticadas recebem uma resposta de string '0'.
<?php namespace PublicFunctionOrg\WordPress\CodeSamples; // ------------------------------------------------ // /wp-admin/admin-ajax.php?action=my_action // ------------------------------------------------ function my_authorized_action_handler(){ wp_send_json([ "firstname" => wp_get_current_user()->first_name, "lastname" => wp_get_current_user()->last_name, ]); exit; } add_action('wp_ajax_my_action',__NAMESPACE__.'\my_authorized_action_handler');
O método Admin-Ajax é muito simples de implementar, mas não é adequado para criar APIs grandes.
WP_REST
O WP_REST 1.0 foi lançado com a versão 4.4 do WordPress. Quando o Gutenberg foi lançado com o WordPress 5.0, as coisas se tornaram muito mais assíncronas no backend. Houve a necessidade de uma maneira mais estruturada de implementar chamadas Ajax, o que levou ao WP_REST 2.0.
Exemplo básico não autenticado do WP_REST
Use a ação rest_api_init para registrar seus próprios endpoints da API. Você pode registrar novas rotas com a função register_rest_route.
<?php namespace PublicFunctionOrg\WordPress\CodeSamples; // ------------------------------------------------ // GET /wp-json/code-samples/v1/basic // ------------------------------------------------ add_action( 'rest_api_init', function () { register_rest_route( "code-samples/v1", "/basic", [ 'methods' => \WP_REST_Server::READABLE, 'permission_callback' => '__return_true', 'callback' => function (\WP_REST_Request $request) { return array_map( function ( $post ) { return $post->post_title; }, get_posts() ); }, ] ); } );
Agora podemos chamar nossa rota Ajax com a URL /wp-json/wp/v2/code-samples/v1/basic.
O primeiro parâmetro é o namespace, que normalmente consiste no slug do seu plugin ou uma string que descreve o conteúdo, e uma string de versão. O segundo parâmetro é a rota dentro desse namespace.
O terceiro parâmetro é uma matriz de configuração. O argumento methods permite que você selecione os métodos de solicitação que serão aceitos para esta rota. Normalmente, apenas um método por rota é fornecido, mas você também pode especificar vários métodos como uma lista separada por vírgulas ou uma matriz de métodos. As constantes para strings de métodos válidos podem ser encontradas na classe WP_REST_Server. Se você não especificar explicitamente um método, GET será usado. Você também deve definir um permission_callback. Como nossa rota aceita qualquer solicitação GET, podemos usar uma função central chamada __return_true que concede permissão para prosseguir com todas as solicitações, sempre retornando true. Por último, mas não menos importante, o argumento callback. Ele espera um valor invocável que retorna os dados de resposta. O formato de resposta é JSON.
Exemplo básico autenticado do WP_REST
É praticamente idêntico ao exemplo de código não autenticado, exceto pelo argumento permission_callback.
<?php namespace PublicFunctionOrg\WordPress\CodeSamples; // ------------------------------------------------ // GET /wp-json/code-samples/v1/basic // ------------------------------------------------ add_action( 'rest_api_init', function () { register_rest_route( "code-samples/v1", "/basic", [ 'methods' => \WP_REST_Server::READABLE, 'permission_callback' => function (\WP_REST_Request $request) { return is_user_logged_in(); }, 'callback' => function (\WP_REST_Request $request) { return [ "firstname" => wp_get_current_user()->first_name, "lastname" => wp_get_current_user()->last_name, ]; }, ] ); } );
Este endpoint aceita apenas solicitações autorizadas porque verificamos o status de login com a função is_user_logged_in(). No entanto, se você tiver uma sessão de login válida no seu navegador e chamar esta URL, receberá uma resposta de erro não autorizada. Isso ocorre porque a API WP_REST usa tokens nonce para verificação de autorização. Você pode usar o pacote @wordpress/api-fetch, que lida automaticamente com a manipulação de tokens nonce se estiver conectado.
Os endpoints ainda são relativamente fáceis de implementar, mas você é obrigado a especificar namespaces, métodos de solicitação e tratamento de permissões, o que o ajudará em projetos maiores.
Regras de reescrita (Rewrite-Rule)
Adicionar regras de reescrita é a mais complexa das três variantes. Precisamos usar duas ações e um filtro para fazê-la funcionar.
<?php namespace PublicFunctionOrg\WordPress\CodeSamples; // ------------------------------------------------ // /my/custom/route // ------------------------------------------------ add_filter( 'query_vars', function( $vars ) { $vars[] = "my_route"; return $vars; }); add_action( 'init', function(){ add_rewrite_rule( '^my/custom/route/?', 'index.php?my_route=1' ); }); add_action( 'parse_request', function($wp){ if ( isset( $wp->query_vars[ "my_route"] ) && "1" === $wp->query_vars[ "my_route"] ) { $latestPostTitles = array_map(function($post){ return $post->post_title; }, get_posts()); wp_send_json($latestPostTitles); exit; } });
Primeiro, precisamos adicionar uma variável de consulta para que possamos identificar nossas solicitações Ajax. Segundo, adicionamos uma regra de reescrita personalizada ao sistema e a mapeamos para nossa variável de consulta. Na última etapa, interceptamos o analisador de solicitações e verificamos se nossa variável está presente. Se estiver, podemos assumir que nossa rota foi chamada e fornecer a resposta.
Conclusão
Use o Admin-Ajax apenas em casos muito simples com um ou dois pontos de extremidade muito simples.
Na minha opinião, o WP_REST é a escolha certa para a maioria dos casos. Ele o obriga a pensar em nomear suas rotas e lidar com permissões, e possui muitos recursos úteis para validar e limpar as variáveis de solicitação. Você pode projetar entidades RESTful adequadas, mas também usá-lo para rotas Ajax simples.
Apenas se você tiver requisitos rigorosos de formato de URL ou formato de resposta que não podem ser atendidos com o Admin-Ajax ou WP_REST, recorra à variante Regras de reescrita(Rewrite-Rule).
Sugestões de cursos
Descubra o caminho para se tornar um especialista em programação web. Aprenda HTML, CSS, JavaScript e os principais frameworks nesta jornada emocionante. Com instrutores experientes e materiais práticos, você desenvolverá habilidades práticas para criar sites impressionantes e aplicativos interativos. Impulsione sua carreira na indústria de tecnologia e abra portas para oportunidades de emprego lucrativas. Garanta sua vaga hoje mesmo e inicie sua jornada para se tornar um desenvolvedor web de sucesso.
Método Para Aprender a Programar do Absoluto ZERO com Node.js, React e React Native.
As tecnologias ensinadas no curso são responsáveis por muitas vagas no mercado de trabalho.
Além da alta demanda, os salários vão de R$47.000,00 até R$197.000,00 anuais tendo empresas que possibilitam o trabalho remoto e até vagas Internacionais.
Para que você possa estar apto a preencher uma dessas vagas eu vou te apresentar o passo a passo para você se tornar um verdadeiro expert nessas tecnologias.
O curso te dará o passo a passo de como criar estruturar de um sistema do zero com Node.js, React e React Native.