Me resulta bastante curioso. Tengo un archivo de prueba php como este:
<div class="live-ajax-messages">message from deep ajax</div>Lo obtendré usando esta función:
public function get_ajax_messages_template() { ob_start(); include(__DIR__. '/../templates/search-results-messages.php'); $content = ob_get_contents(); exit($content); }Obtendré esa salida de función como esta:
load_ajax_messages_template: function(){ jQuery.ajax({ url: ajax_url, data: 'action=my_action', // executes get_ajax_messages_template dataType: 'html', type: "GET", success: function(response){ console.log(response); // getting 2 times <div class="live-ajax-messages">message from deep ajax</div> //this.results_el.find('.ajax-results').html(response); }.bind(this), }) },Básicamente, conseguiré
<div class="live-ajax-messages">message from deep ajax</div> <div class="live-ajax-messages">message from deep ajax</div>¿Por qué?
El almacenamiento en búfer de salida (las funciones ob_* ) almacena temporalmente la salida. Si el script finaliza mientras todavía hay una salida almacenada en el búfer, se escribirá en la respuesta.
Entonces, aquí está almacenando en búfer la salida de search-results-messages.php . La llamada a ob_get_contents devuelve el búfer actual, pero no lo borra.
Luego, cuando llama a exit($contents) está escribiendo el contenido en la respuesta, luego vaciando el búfer de salida que también contiene el contenido.
Hay dos soluciones posibles aquí. (1) es reemplazar ob_get_contents con ob_get_clean que hace lo mismo, pero borra el búfer.
La otra solución (más simple) es simplemente incluir el archivo sin almacenamiento en búfer de salida, ya que desea escribir su contenido de todos modos, luego simplemente llame a exit(); sin parámetros.