Como gerenciar chamadas ajax e JSON no wordpress


13

Eu tenho um tipo de post personalizado que eu quero acessar através do jQuery - de preferência usando JSON.

Então, as primeiras coisas primeiro. criar uma função que retorne / eco json é fácil, mas como eu a acessaria através do jquery.

como Mike escreve nesta pergunta , ele - tanto quanto eu entendo - coloca-o na raiz do wordpress. o que tornaria acessível usando o nome do arquivo php - mas isso é recomendável? Prefiro colocá-lo dentro de uma pasta de plugins.

Eu tentei ler o codex wordpress, mas a maneira como as chamadas ajax são manipuladas me confunde, pois você está postando todas as chamadas ajax no admin-ajax.php, mesmo que não seja uma página de administrador?

Alguém pode resolver os problemas que estou tendo?

/Tempestade

editar

O problema que tive foi entender como as chamadas ajax seriam feitas no wordpress, bem como onde colocar seu código php e js para fazer / manipular as chamadas.

Na outra questão à qual vinculei, você criou uma função colocando o arquivo na raiz wp - não quero fazer isso. Mas agora eu aprendi como usar a wp_ajax_ (nopriv _) [action] e posso acessar efetivamente o json que eu criei. O problema restante é onde eu devo colocar o JS para fazer a chamada. Eu quero colocá-lo no arquivo plugins js, mas como isso deve ser apresentado em uma página, não no site de administração, o ajaxurl não está definido, então eu tenho que ecoar usando php.

echo admin_url('admin-ajax.php');

Portanto, a questão passa a ser: como devo combinar esse php com o javascript e como devo enfileirá-lo, visto que não é um arquivo ou um script.


Gostaria de editar o título da sua pergunta para fornecer um título mais descritivo, mas, depois de ler, ainda não tenho 100% de certeza de qual é a sua pergunta. Você está simplesmente perguntando como acessar um feed JSON, não relacionado a tipos de postagem personalizados (o CPT não é realmente importado para sua pergunta?) E é importante que ele não esteja na raiz? É para funcionalidade de administrador? Talvez ajude se você explicar o que realmente está tentando realizar na perspectiva do usuário final, além da abordagem técnica com a qual está lutando?
precisa saber é o seguinte

Sim, posso acrescentar que o título não é o mais descritivo de todos os tempos. Eu apenas coloquei algo lá porque eu postei com um ainda pior no começo. Postagem editada com mais informações.
Storm

O tipo de postagem personalizada que acabei de inserir, porque o plug-in json-api que parece popular na verdade não abrange os tipos de postagem personalizados.
Storm

Respostas:


17

Ajax Handler

É realmente um pouco confuso que o manipulador do Ajax esteja no wp-admin/diretório, mas sim, você pode e deve usá-lo também para solicitações não administrativas. Em seguida, você registra um manipulador para o wp_ajax_nopriv_[action]gancho, em vez do normal wp_ajax_[action]. Nesse caso, você só precisa seguir as primeiras linhas deadmin-ajax.php , uma vez que uma solicitação feita por um usuário que não está logado já deixará a página em torno da linha 50.

Portanto, registre uma função para o gancho wp_ajax_nopriv_get_custom_post_data, e ela será chamada se você solicitar admin-ajax.phpcom o actionparâmetro definido como get_custom_post_data. Certifique-se de ligar die()no final do seu manipulador, caso contrário, o padrão die(-1)será retornado. E também registre a versão conectada wp_ajax_get_custom_post_data(para a mesma função de manipulador, sem problemas), pois se você estiver conectado ao seu site, não terá problemas nopriv.

Configuração do servidor para Javascript

O truque para enviar dados de configuração do servidor (como o admin-ajax.phpURL) é wp_localize_script(). Você passa uma matriz de chaves e valores que serão incluídos na parte superior da página. Provavelmente, isso foi originalmente criado apenas para cadeias localizáveis, mas você também pode usá-lo para passar dados de configuração.

wp_localize_script('storm_json_config', 'storm_config', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
));

storm_json_configé o nome do identificador (se você deseja removê-lo da fila mais tarde), storm_configé o nome do objeto Javascript que conterá seus dados. Portanto, seu arquivo Javascript estático pode conter uma linha como jQuery.post(storm_config.ajaxurl, ...).

Veja também a resposta do bueltge a uma pergunta semelhante .

Javascript estático no diretório dir do plugin

Para carregar um arquivo Javascript estático a partir do seu próprio diretório de plug-in, use wp_enqueue_script(). Isso seria algo como isto:

wp_enqueue_script('storm_json', plugin_dir_url(__FILE__) . 'js/json.js', array('jquery'), '20101105');

Onde storm_jsonestá novamente um nome de identificador, você fornece o link para o arquivo, as dependências (podem ser null) e um número de versão que será adicionado após a solicitação para superar os caches do navegador nas atualizações.


Ótima resposta. Era isso que eu estava pensando, e parece que consegui funcionar. Agora posso acessar /wp-admin/admin-ajax.php?action=[action] e obter um resultado json. Meu problema agora é onde colocar os js para fazer a chamada ajax. Desde que eu preciso colocar echo admin_url ('admin-ajax.php'); como url, não posso colocá-lo no meu arquivo js de plugins. Então, como eu iria enfileirá-lo? Eu não quero apenas imprimir o script no meio de uma página.
Storm

@ Tempestade: ampliei minha resposta com a wp_localize_script()qual você pode enviar dados de configuração do servidor para o navegador. (Small dica: Se você adicionar @a um nome de usuário, essa pessoa receberá uma notificação da sua resposta assim. @Mike: I updated the titleQue se certificar de que ele vê o seu comentário)
Jan Fabry

Muito obrigado Jan. Agora acho que entendo todo o pacote. Vou ter que mexer um pouco com tudo para entender completamente, mas você tem sido uma grande ajuda! Resposta aceita =) btw obrigado pela nota @. Mas enquanto estou comentando sua resposta agora, você ainda receberá um alerta, certo?
Storm

@ Tempestade: Sim, o alerta vai para o autor da pergunta ou resposta que você está comentando e, adicionalmente, pode ir para outro participante mencionado em um comentário @. Portanto, recebi sua notificação "de graça", mas você não receberia uma para esta mensagem se eu não a incluísse. Há uma explicação completa no meta site geral da rede Stack Exchange.
Jan Fabry
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.