2016-03-13 2 views
0

У меня есть плагин WP, который отправляет ссылку на электронное письмо для загрузки файла в скрытом месте. Пользователь выбирает файл, затем в базу данных записывается токен, содержащий идентификатор файла и т. Д., И отправляется ссылка. Нажав на ссылку (например, mysite.com/thank-you/?id=asd687asd68as7d6a8sdd7sd768as7d6, страница «спасибо» делает запрос к функции php для загрузки файла.WP не отправляет правильные заголовки для загрузки файла

Существует также фиктивный «загрузочный движок», страница с коротким кодом [download_page], который инициирует загрузку.

Странно то, что, хотя эта настройка работает очень хорошо в тестовой среде и более года работает на производственной площадке, она внезапно перестала работать: call for DownloadFile() возвращает 0KB и исправляет заголовки на тестовом сайте и инициирует загрузку, но возвращает полный HTML-файл и, конечно, не загружается.

Я не вижу никаких изменений в конфигурации (оба сайта работают с WP 4.2.7). Единственное отличие - это плагин WooCommerce, а также фрагмент Google Analytics, включенный в производственный сайт. И что на тестовом сайте работает PHP 5.3, а на продуктовом сайте - 5.6.

Я был бы очень признателен, если бы кто-нибудь понял, что происходит. Почему заголовки игнорируются? (Нет ошибки «Заголовки уже отправлены».) Почему отображается полный HTML-файл макета «загрузочный двигатель»?

Кстати, это тема из коробки, но я не вижу в ней никаких недостатков. Но все же, может быть. Где я должен искать виновных? Что может заставить страницу показать полный HTML вместо заголовков, отправленных php?

Соответствующий код такой: (скачать manager.php):

<?php 
    /* 
    Plugin Name: Hidden Download Manager 
    Description: Bla bla 
    */ 
    include_once('add_meta_boxes.php'); 
    include_once('mfdm_frontend_functions.php'); 
    add_action('init', 'program_register'); 
    add_shortcode('download_page', 'downloadFile'); 
?> 

(thank_you.tpl.php)

<?php 
    /** 
    Template Name: Thank You 
    */ 
    $HOST = get_option('mfdm_dbhost'); 
    $USER = get_option('mfdm_dbuser'); 
    $PWORD = get_option('mfdm_dbpwd'); 
    $DB = get_option('mfdm_dbname'); 
    $connect_db = mysqli_connect($HOST,$USER,$PWORD,$DB) or die("Some error occurred during connection " . mysqli_error($connect_db)); 
    if(get_magic_quotes_gpc()) { 
    $id = stripslashes($_GET['id']); 
    } else { 
    $id = $_GET['id']; 
    } 
    $result = $connect_db->query("SELECT * FROM 3_downloadkey WHERE uniqueid = '$id'"); 
    $row = resultToArray($result); 
    $redirect = ''; 
    if (!$row) { 
    // redirect to 'invalid' page 
    $redirect = get_option('mfdm_link_invalid_page'); 
    wp_redirect($redirect); 
    exit; 
    } 
    get_header(); 
    $plugindir = plugin_dir_url(0).'mouseful_download/'; 

    // embed the javascript file that makes the AJAX request 
    wp_enqueue_script('processLink_request', $plugindir . 'mf_downloads.js', array('jquery')); 

    // declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php) 
    wp_localize_script('processLink_request', 'ProcessLink', array(
     'ajaxurl' => admin_url('admin-ajax.php'), 
     'postCommentNonce' => wp_create_nonce('ProcessLink-post-comment-nonce'), 
     'downloadHiddenPage' => get_option('mfdm_download_hidden_page') 
    ) 
); 
?> 
<link rel="stylesheet" type="text/css" media="all" href="<?=$plugindir;?>mf_downloads.css"> 


<body onLoad="setTimeout('downloadLink()', 1000)"></body> 
<div class="contents about"> 
    <div class="row"> 
    <div class="col banner"> 
     <p><?php the_title(); ?></p> 
    </div> 
    </div>   
<div class="row2"><div class="col"> 
<?php 
    while (have_posts()) : the_post(); 
     the_content(); 
    endwhile; 
?> 
</div></div></div> 
<?php 
    get_footer(); 
?> 

(mfdm_frontend_functions.php):

<?php 
    add_action('wp_ajax_nopriv_downloadLink-submit', 'downloadFile'); 
    add_action('wp_ajax_downloadLink-submit', 'downloadFile'); 

function downloadFile() { 
    $HOST = get_option('mfdm_dbhost'); 
    $USER = get_option('mfdm_dbuser'); 
    $PWORD = get_option('mfdm_dbpwd'); 
    $DB = get_option('mfdm_dbname'); 
    $id = $_POST['app']; 
    $connect_db = mysqli_connect($HOST,$USER,$PWORD,$DB); 
    $result = $connect_db->query("SELECT * FROM 3_downloadkey WHERE uniqueid = '$id'"); 
    $row = resultToArray($result); 
    $app_ID = $row[0]['app_ID']; 
    ob_start(); 
    // get app name 
    $base_dir = get_option('mfdm_applications_folder'); 
    define('BASE_DIR',$base_dir); 
    $fname = get_post_meta($app_ID, 'meta_source', true); 
    $app_download_name = get_post_meta($app_ID, 'meta_program_name', true); 

    $file_path = ''; 
    $file_path = find_file1(BASE_DIR, $fname, $file_path); 
    if (!is_file($file_path)) { 
    die("File does not exist. Make sure you specified correct file name."); 
    } 
    $fsize = filesize($file_path); 
    $fext = strtolower(substr(strrchr($fname,"."),1)); 
    $mime_types = array(
    'msi' => 'application/x-ole-storage', 
    'zip' => 'application/zip', 
    'exe' => 'application/x-msdownload', 
    'sh' => 'application/x-sh', 
    'iso' => 'application/octet-stream', 
    'dmg' => 'application/octet-stream', 
    'pdf' => 'application/pdf', 
); 
    $mm_type = $mime_types[$fext]; 
    if ($fd = fopen ($file_path, "r")) { 
    $fsize = filesize($file_path); 
    $path_parts = pathinfo($file_path); 
    $ext = strtolower($path_parts["extension"]); 
    header("Content-type: $mm_type"); 
    header("Content-Disposition: attachment; filename=\"".$app_download_name."\""); 
    header("Content-length: $fsize"); 
    header("Cache-control: private"); //use this to open files directly  
    while(ob_POST_level() > 0) { 
    @ob_end_clean(); 
    } 
    while(!feof($fd)) { 
    $buffer = fread($fd, 2048); 
    echo $buffer; 
    } 
} 
fclose ($fd); 
} 
?> 

(mf_downloads.js):

function downloadLink() { 
    var id = window.location.search.replace("?", "").split("&")[0]; 
    id = id.split("=")[1]; 
    var url = ProcessLink.downloadHiddenPage; 
    var form = jQuery('<form action="' + url + '" method="post">' + '<input type="text" name="app" value="' + id + '" hidden="hidden"/>' + '</form>'); 
    jQuery('body').append(form); 
    form.submit(); 
} 

ответ

0

Ваша функция 'downloadFile' в 'mfdm_frontend_functions.php' должна заканчиваться на wp_die(), чтобы вернуть proper response.

wp_die(); // this is required to terminate immediately and return a proper response 

Загрузить определенные пользователем php.ini для вашего вебсервера, содержащий следующую строку:

default_charset = "" 
+0

Очень разумное предложение. Однако, даже если я положил wp_die(); до самого начала 'mfdm_frontend_functions.php' downloadFile(), страница 'download-engine' все еще вызывается и отображается полностью. Это странно: страница не должна отображаться, если она? – Konservin

+0

@ Konservin вы должны добавить wp_die в конец вашего скрипта (ниже fclose ($ fd);). – dontanios

+0

@ Konservin где ваша функция ajax? – dontanios

Смежные вопросы