Adicionando admin-ajax.php ao frontend. Boa ou má ideia?

17

Eu amo admin-ajax.php. Mas eu odeio ter que localizar para apontar scripts de front-end para ele e gostaria que houvesse um arquivo equivalente e fácil de encontrar para os temas. (Também me incomoda ver solicitações de front-end passarem por "/ wp-admin /". Nenhuma razão prática, apenas parece IMO feia.)

Então, eu simplesmente copiei admin-ajax.php no diretório raiz em "/ajax.php", ajustei os caminhos de inclusão e removi a definição constante WP_ADMIN. Parece funcionar como gangbusters (agora posso direcionar todos os meus pedidos de AJAX de frontend para /ajax.php! E ainda posso usar os ganchos wp_ajax normais nos meus plugins!).

Mas isso é seguro? O que pode dar errado? Como isso não está embutido no núcleo, presumo que exista uma boa razão para isso. Mas, olhando o código, não vejo nenhum problema imediato.

Você é inteligente - me diga se essa abordagem é louca. Ou se houver um método mais simples que estou ignorando.

MathSmath
fonte
Você pode esquecer e perder esse arquivo durante as atualizações automáticas, o que pode resultar na quebra de itens e na manutenção de vulnerabilidades de segurança.
Hemm 16/05

Respostas:

19

Você pode simplesmente usar uma RewriteRule no seu .htaccess acima das regras regulares de reescrita de link permanente:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

Agora envie suas solicitações de AJAX para example.com/ajaxe nunca perca as alterações principais nesse arquivo após as atualizações.

fuxia
fonte
Boa ideia! É uma daquelas coisas que, depois de ouvir, você pensa "isso é tão simples e óbvio!" Obrigado.
precisa saber é o seguinte
Eu adicionei a regra de reescrita de acordo com a sua sugestão, mas o example.com/ajaxURL 404. Você poderia explicar exatamente onde .htaccessdevo adicionar isso. Eu tenho atualmente entre # BEGIN WordPress <IfModule mod_rewrite.c>e</IfModule> # END WordPress
John
Isso funciona. Eu estava sentindo falta da barra à direita. Tenho permalinks definidos como /% postname% /
João
7

Primeiro: padronização. Se você planeja usar plug-ins da comunidade, é provável que eles não se importem com o seu/ajax.php arquivo na raiz do documento. Então eles não vão usá-lo.

Se você vai rolar tudo sozinho, isso não é um problema.

Segundo: e se o núcleo for atualizado? Você irá monitorar e alterar seu arquivo ajax?

Terceiro : apesar de admin-ajax.phpresidir wp-admin, ele não carrega nenhum material da área de administração (por exemplo, tabelas de listas, etc.). Também não verifica a autenticação nem expõe nada sensível a usuários não conectados. É como um arquivo front-end, em outras palavras. Nada para se preocupar.

Quarto: relacionados ao primeiro problema, alguns plugins serão verificados antes de carregar cegamente a funcionalidade relacionada ao ajax. Um exemplo está abaixo. Seu ajax.php modificado provavelmente não fará com que isso seja carregado.

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

Finalmente: que você se queixa, é uma boa coisa usar a localização para obter o URL do Ajax. Por quê? Porque seus arquivos JS não estão cientes de nada do lado do servidor. Você está dificultando um URL que quebrará se / quando o site for movido? Parece uma má escolha.

Se você realmente não deseja localizar todos os scripts que usam o Ajax, conecte-se wp_headmuito cedo e cuspa a URL do administrador do ajax. Problema resolvido (a propósito, é exatamente assim que a área administrativa).

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}
chrisguitarguy
fonte
Obrigado Chris! Todos os pontos válidos. A maior coisa que você me ajudou a perceber é que, embora eu não estivesse pensando nisso como um "hack principal" (desde que eu adicionava, não modificava um arquivo), na verdade é porque depende de outras funcionalidades do núcleo que podem mudar . Não muito diferente de qualquer outro plug-in (que também pode morrer após alterações na funcionalidade principal), mas definitivamente filosoficamente diferente. Obrigado pelos pensamentos!
precisa saber é o seguinte
Re: " Terceiro: ... Nada para se preocupar. ", O que dizer quando se tenta bloquear o diretório wp-admin, por exemplo, usando regras .htaccess para limitar a intervalos de IP conhecidos e seguros? Presumo que algum tipo de exceção precisaria ser feito para o arquivo ajax-admin.php? (Eu digo "presumo" porque sou um tonto quando se trata de regras de .htaccess e realmente não sei se isso é possível?).
Sepster
Deveria ser possível permitir um único arquivo, sim.
Chrisguitarguy
@chrisguitarguy esta é uma resposta brilhante, obrigado. Estou tentando ter o admin-ajax carregado no front-end, pois estou executando o proxy reverso do siteurl no meu URL de teste / home. Por favor, veja o seguinte: link É possível fazer isso com o plug-in de terceiros? Minha abordagem está incorreta?
paranza
5

Tal como acontece com muitas coisas no WordPress, há um número quase infinito de maneiras de esfolar o gato. Embora todos os métodos aceitos funcionem, eu descobri que eles são menos "legais" do que usar wp_localize_script para incluir o recurso ajax no front-end.

Veja isso:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

E então no se83650.jsarquivo, você referenciaria sua variável se83650Ajax.ajaxurl.

O benefício dessa técnica é que, se você acabar com muitos plug-ins que tentam duplicar essa funcionalidade, eles não estão incluindo ou substituindo a mesma variável. ajaxurlé bastante genérico de incluir, isso deixa você mais contido e fica mais agradável com outros desenvolvedores.

bybloggers
fonte