Yo hace unos meses tuve que hacer algo parecido aunque no para wordpress, si no para el sistema que desarrollamos.
Hice un formulario donde pones la fecha o los selects / datepickers a filtrar y mediante Ajax envias la peticion al servidor. Este responde con los datos con JSON y luego con Javascript puedes crear el fichero csv y forzar la descarga.
Te dejo el codigo
function consultaCarregaPersona() {
var RGXCurs = new RegExp("^\\d{4}$");
var curs = $("#curs").val();
var areainput = $("#area").val().trim();
var tipuscontracte = $("#tipuscontracte").val().trim();
var dni = $("#persona").val();
var format = $("#format").val();
var urlAJAX = $("#urlAJAX").val()+"?/aplicacio=2705&/tipus_plana=1003&curs="+curs+"&contracte="+tipuscontracte+"&area="+areainput+"&dni="+dni;
if ( !curs.trim().match(RGXCurs) ) { swal("ERROR","El curs posat no te un format valid","error"); return false; }
// LIMPIAMOS LOS RESULTADOS ANTERIORES
$("#resultat").html("");
$.ajax({
url: urlAJAX,
async: true,
success: function (result) {
var respuestaParseada = jQuery.parseJSON(result);
if ( respuestaParseada["response"] == "OK" ) {
var total_hores = 0; var total_calcul = 0;
if (format == "CSV") {
var nom_fitxer= "";
if (areainput != "" ) { nom_fitxer += "_Area["+$("#area option:selected").text()+"]"; }
if (tipuscontracte != "" ) { nom_fitxer += "_Contracte["+$("#tipuscontracte option:selected").text()+"]"; }
if (dni != "" ) {
var nompersona = $("#persona option:selected").text();
nompersona = nompersona.replace(",","_");
nompersona= nompersona.replace(/ +/g,'_');
nompersona= nompersona.replace(/\_+/g,'_');
nom_fitxer += "_Persona["+nompersona+"]";
}
var csvContent = "data:text/csv;charset=utf-8,";
// csvContent+= "Departament;Contracte;Àrea;Projecte;Subprojecte;Persona;Grup;Tipus Càrrega [Factor];Hores Càrrega;Càlcul\n";
csvContent+= "Departament;Contracte;Àrea;Projecte;Subprojecte;Persona;Grup;Tipus Càrrega [Factor];Hores Càrrega;Càlcul\n";
$.each(respuestaParseada["llistat"], function (row, elem) {
// csvContent += elem["departament"]+";";
// csvContent += elem["contracte"]+";";
csvContent += elem["area"]+";";
csvContent += elem["projecte"]+";";
csvContent += elem["subprojecte"]+";";
csvContent += elem["persona"]+";";
csvContent += elem["grup"]+";";
csvContent += elem["tipuscarrega"]+";";
csvContent += elem["hores_carrega"]+";"; if ( elem["hores_carrega"].length != 0 && !isNaN(elem["hores_carrega"]) ) { total_hores += parseFloat(elem["hores_carrega"]); }
csvContent += elem["calcul"]+"\n"; if ( elem["calcul"].length != 0 && !isNaN(elem["calcul"]) ) { total_calcul += parseFloat(elem["calcul"]); }
});
csvContent += ";;;;;Total;"+total_hores.toFixed(2)+";"+total_calcul.toFixed(2)+"\n";
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "InformePersones_"+curs+nom_fitxer+".csv");
link.click();
} else {
// FORMATO HTML
var htmlCode = "";
htmlCode+= "<div class='col-lg-12 col-md-12'>";
htmlCode+= "<table id='resultats-persona' class='table table-striped table-condensed table-bordered'>";
//htmlCode+= "<thead><tr><th>Departament</th><th>Contracte</th><th>Àrea</th><th>Projecte</th><th>Subprojecte</th><th>Grup</th><th>Tip.Càrrega [Factor]</th><th>Càlcul</th></tr></thead><tbody>";
htmlCode+= "<thead><tr><th>Àrea</th><th>Projecte</th><th>Subprojecte</th><th>Persona</th><th>Grup</th><th>Tip.Càrrega [Factor]</th><th>Hores</th><th>Càlcul</th></tr></thead><tbody>";
$.each(respuestaParseada["llistat"], function (row, elem) {
htmlCode += "<tr>";
//htmlCode += "<td class='text-left'>"+elem["departament"]+"</td>";
//htmlCode += "<td class='text-left'>"+elem["contracte"]+"</td>";
htmlCode += "<td class='text-left'>"+elem["area"]+"</td>";
htmlCode += "<td class='text-left'>"+elem["projecte"]+"</td>";
htmlCode += "<td class='text-left'>"+elem["subprojecte"]+"</td>";
htmlCode += "<td class='text-left'>"+elem["persona"]+"</td>";
htmlCode += "<td class='text-left'>"+elem["grup"]+"</td>";
htmlCode += "<td class='text-left'>"+elem["tipuscarrega"]+"</td>";
htmlCode += "<td class='text-right'>"+elem["hores_carrega"]+"</td>"; if ( elem["hores_carrega"].length != 0 && !isNaN(elem["hores_carrega"]) ) { total_hores += parseFloat(elem["hores_carrega"]); }
htmlCode += "<td class='text-right'>"+elem["calcul"]+"</td>"; if ( elem["calcul"].length != 0 && !isNaN(elem["calcul"]) ) { total_calcul += parseFloat(elem["calcul"]); }
htmlCode += "</tr>";
});
htmlCode += "</tbody>";
htmlCode += "<tfoot><tr>";
htmlCode += "<th></th><th></th><th></th><th></th><th></th><th class='text-right'>Total:</th><th class='text-right'>"+total_hores.toFixed(2)+"</th><th class='text-right'>"+total_calcul.toFixed(2)+"</th>";
htmlCode += "</tr></tfoot>";
htmlCode += "</table>";
// PINTAMOS LOS DATOS EN EL HTML
$("#resultat").html(htmlCode);
}