Как загрузить специальный плагин в обработчик Ajax в WordPress? - PullRequest
0 голосов
/ 16 ноября 2018

Я использую WordPress с установленным WooCommerce.Я заметил, что вызов API WordPress или WooCommerce API возвращает медленное время ответа.

Я создал пользовательский дескриптор запроса, чтобы мой вызов ajax не загружал весь WordPress для обслуживания конечных точек.Файл дескриптора пользовательского запроса будет обслуживать только контент и права доступа.

myajaxhandler.php

<?php
    // Force a short-init since we just need core WP, not the entire framework stack
    define( 'SHORTINIT', true );
    require_once('../../../wp-load.php');

    echo 'aaa';
    WC()->session->set_customer_session_cookie(true);
    exit();    
?>

custom-js.js

var custom_ajax_url = 'http://localhost/mywebsite' + '/wp-content/plugins/zb-ajax-handler/myajaxhandler.php';

$.ajax({
    type: 'GET',
    url: custom_ajax_url,
    cache: false,
    data: {
        action: 'getwcnonce'
    },
    success: function(data) {},
    error: function(xhr, status, error) {
        console.log(error);
    }
});

Вызов файла myajaxhandler.php: успешно , но я получаю сообщение об ошибке:

Неустранимая ошибка: вызовв неопределенную функцию WC () в C: \ XamppDev \ htdocs \ mywebsite \ wp-content \ plugins \ zb-ajax-handler \ myajaxhandler.php в строке 12

Я думаю, это потому, что плагин WooCommerceфайлы не распознаются.

Знаете ли вы, как я могу включить / загрузить плагин WooCommerce в мой обработчик ajax, чтобы я мог вызывать WooCommerce и его функции?

Любая идея приветствуется.Спасибо ..

1 Ответ

0 голосов
/ 22 ноября 2018

Это действительно интересный вопрос.Да, вы правы - загрузка всей вашей установки WordPress (включая WooCommerce) для каждого запроса ajax может быть медленной .Особенно, если вы делаете много запросов (вы не первый, у кого возникает эта проблема: https://wordpress.stackexchange.com/questions/26254/how-to-include-wp-load-php-from-any-location).

Однако простого включения wp-load.php может быть недостаточно.Вы можете наткнуться на отсутствующие функции и зависимости во время обработки вашего запроса, что приводит к вашей фатальной ошибке.

Одна возможность, которую я могу придумать, чтобы немного ускорить время загрузки, была бы отключить загрузкунеобязательные плагины во время вашего ajax-запроса (как вы предложили) - пример того, как это сделать, и который вы можете изменить в соответствии со своими потребностями:

    $request_uri = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $is_admin = strpos( $request_uri, '/wp-admin/' );

    // add filter in front pages only
    if( false === $is_admin && !DOING_AJAX ){
        add_filter( 'option_active_plugins', 'disable_plugins_for_request' );
    }

    function disable_plugins_for_request( $plugins ){
        global $request_uri;
        $is_contact_page = strpos( $request_uri, '/contact/' );

        $unnecessary_plugins = array();

        // conditions: deactivate plugins if not certain page u.ä.
        if( false === $is_contact_page ){
            $unnecessary_plugins[] = 'contact-form-7/wp-contact-form-7.php';
        }

        foreach ( $unnecessary_plugins as $plugin ) {
            $k = array_search( $plugin, $plugins );
            if( false !== $k ){
                unset( $plugins[$k] );
            }
        }
        return $plugins;
    }

Дополнительная информация в этом уроке: https://kinsta.com/blog/disable-wordpress-plugins/

Однако гораздо проще: Установить правильный механизм кэширования для вашего API

Просто выполняйте запросы как обычно и следуйте инструкциям из кодекса WordPress: https://codex.wordpress.org/AJAX_in_Plugins

Но кэшируйте результаты , используя плагин кэширования или даже свой собственный механизм кэширования . Вы можете сделать это, проверив, существует ли файл кэша для вашего curreNT запрос и только если вы даже не начинаете загружать WordPress.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...