Fondo Estoy creando dinámicamente un archivo JSON de datos cuando un usuario guarda una página en el backend de Wordpress. Hago esto a través del gancho 'save_post' y guardo el archivo 'network.json' usando file_put_contents en la raíz de mi carpeta de temas. Estoy haciendo esto para poder acceder a datos específicos de un script js en mi tema.
Enfoque actual Tengo un archivo js en cola en mi tema con el siguiente JS dentro. Lo siguiente funciona, pero me pregunto si es el mejor enfoque para llamar a un archivo JSON local dentro de un tema de WP.
$.getJSON( "../wp-content/themes/ihdf/network.json", function(data) { console.log(data); });¿Es lo anterior la forma adecuada y técnicamente más sólida de hacerlo?
Otros enfoques
Anteriormente usé ajax en Wordpress poniendo en cola un script y configurando la función ajax adecuada para llamar con admin-ajax.php. Eso parece demasiado complicado para mis necesidades.
También podría establecer una variable js dentro de mi archivo de plantilla como la siguiente:
var networkJSON = <?php get_template_directory_uri() . '/network.json' ?>Cuando se trata de trabajar con solicitudes remotas en el lado del servidor, la función file_get_contents() parece ser una opción confiable, pero WordPress ya incluye una API excepcionalmente útil llamada HTTP API .
La API HTTP se puede usar para enviar y recuperar datos de API remotas, y eso también significa cualquier solicitud a su propio servidor.
Hay cuatro funciones principales que comprenden la API HTTP en WordPress:
Por ejemplo, podría usar wp_remote_get() para recuperar datos del archivo network.json y luego analizarlos junto con la función wp_localize_script() , exponiendo los datos que necesita en su archivo js en cola.
Tome como referencia la siguiente función (no probada), pero no debería tener ningún problema con ella.
-- La función --
function wp_request_localize_my_json_data() { // Helpers to define the $url path //$protocol = is_ssl() ? 'https' : 'http'; $directory = trailingslashit( get_template_directory_uri() ); // Define the URL $url = $directory . 'network.json'; // Register main js file to be enqueued wp_register_script( 'network-js', $directory . 'assets/js/network.js', array('jquery'), false, true ); // Make the request $request = wp_remote_get( $url ); // If the remote request fails, wp_remote_get() will return a WP_Error, so let's check if the $request variable is an error: if( is_wp_error( $request ) ) { return false; // Bail early } // Retrieve the data $body = wp_remote_retrieve_body( $request ); $data = json_decode( $body ); // Localize script exposing $data contents wp_localize_script( 'network-js', 'networkJSON', array( 'network_url' => admin_url( 'admin-ajax.php' ), 'full_data' => $data ) ); // Enqueues main js file wp_enqueue_script( 'network-js' ); } add_action( 'wp_enqueue_scripts', 'wp_request_localize_my_json_data', 10); Si todo va bien, probablemente terminará con los datos localizados recuperados del archivo network.json a su disposición.
Ahora supongamos que tiene una variable llamada current_user en el archivo network.json . Entonces, para acceder a esta variable dentro de su archivo JS en cola, simplemente haría lo siguiente:
<script type="text/javascript"> var my_data = networkJSON.full_data; var user = my_data.current_user; </script>si desea leer el archivo json en wordpress a través de un complemento o tema, use esta función.
function get_local_file_contents( $file_path ) { ob_start(); include $file_path; $contents = ob_get_clean(); return $contents; }esta noche quiero leer un archivo json en la carpeta json al lado de mi archivo php en el complemento y encontrar este artículo
no puedo hacerlo con file_get_contents()