Wordpress - PDF с wp-mpdf - как запустить с php - PullRequest
0 голосов
/ 24 января 2020

Мне было интересно, можно ли вызвать wp-mpdf с php? Я думал о создании функции обратного вызова ajax для выбора (пользовательского) шаблона.

Возможно ли это? может быть с mpdf_exe c () или mpdf_output ()? mpdf_output () выглядит наиболее перспективным, так как вы можете установить путь к шаблону. Если вы можете сделать это, вам не нужно менять параметр БД: mpdf_theme.

Мой первый подход работает. Но это ужасно: он устанавливает новое значение в БД и затем запускает URL, чтобы получить pdf.

JS:

<script type="text/javascript">
    jQuery(document).ready(function ($) {

        $(".button-pdf-1").click(function (e) {
            e.preventDefault();

            var data = {
                'action': 'my_action',
                'post_id': <?php echo get_the_ID(); ?>,
                'template': 'rtt_pdf_01'
            };

            getPdf(data);

        });

        $(".button-pdf-2").click(function (e) {
            e.preventDefault();

            var data = {
                'action': 'my_action',
                'post_id': <?php echo get_the_ID(); ?>,
                'template': 'rtt_pdf_02'
            };

            getPdf(data);

        });

        function getPdf(data) {
            jQuery.post(ajaxurl, data, function (response) {

                let url = '<?php echo get_post_permalink( get_the_ID()); ?>?output=pdf';
                window.location.href = url;
            });
        }

    });
</script>

php:

add_action('wp_ajax_my_action', 'my_action');

function my_action()
{
    update_option('mpdf_theme', $_POST['template']);
    die();
}

——————-

Второй подход должен быть менее хакерским. Но я не заставляю его работать. Это текущий код: JS:

<script type="text/javascript">
    jQuery(document).ready(function ($) {

        $(".button-pdf-1").click(function (e) {
            e.preventDefault();

            var data = {
                'action': 'my_action',
                'post_id': <?php echo get_the_ID(); ?>,
                'template': 'rtt_pdf_01'
            };

            getPdf(data);

        });

        $(".button-pdf-2").click(function (e) {
            e.preventDefault();

            var data = {
                'action': 'my_action',
                'post_id': <?php echo get_the_ID(); ?>,
                'template': 'rtt_pdf_02'
            };

            getPdf(data);

        });

        function getPdf(data){
            jQuery.post(ajaxurl, data, function (response) {

                // Should I need this? Plus is this the best way?
                var blob = new Blob([response]);
                var link = document.createElement('a');
                link.href = window.URL.createObjectURL(blob);
                link.download = "FILENAME_TO_SAVE_WITH_EXTENSION.pdf";
                link.click();

            });
        }

    });
</script>

php обратный вызов:

add_action('wp_ajax_my_action', 'my_action');

function my_action()
{
    global $post, $_GET;

    // should I require this? Plus is there an easier way to get the path?
    require_once( rtt_get_current_file_path(__DIR__) ."/../../../../plugins/wp-mpdf/wp-mpdf.php");

    //catch current theme to reset it later
    $currentPdfTheme = get_option('mpdf_theme');

    // set it, since <code>mpdf_exec()</code> looks for it.
    $_GET['output'] = 'pdf';

    // set the desired template
    update_option('mpdf_theme', $_POST['template']);

    // to-do, somehow it fetches the first post instead of $_POST['post_id'] value
    $arg = array(
        'include' => [$_POST['post_id']],
    );
    $posts = get_posts( $arg );

    foreach ( $posts as $post ) {

        query_posts( 'p=' . $_POST['post_id'] );

        // Approach 1
        //mpdf_exec( 'false' );

        // Approach 2
        $pdf_output = '';
        $outputToBrowser = true;
        $pdfName = 'Export_' . get_the_title(); //could also get slug
        $templatePath = ''; // ? Do I need to set this? Also, I can maybe use this so I dont have to change DB option <code>mpdf_theme</code>?
        mpdf_output( $pdf_output, true, $outputToBrowser, $pdfName, $templatePath );
    }

    //reset original theme
    update_option('mpdf_theme', $currentPdfTheme);

    die();
}

Я на правильном пути? Как я могу успешно получить PDF с php и вернуть / загрузить его на стороне клиента?

...