Intereting Posts
Перемещение из субдомена в корень Как получить все вложения, которые используются в текущем сообщении, а не только для детей? Сделать wordpress генерировать пользовательский XML-файл (а не файл Sitemap), который обновляется только при публикации нового контента? Пользовательское поле Woocommerce на выводах электронной почты «Array» Мне нужно отобразить все сообщения в одной странице Почему медиа-браузер не использует уменьшенные изображения? Как добавить скрытое поле ввода в форму пользовательского сообщения (в таблице столбцов)? Выделите комментарии зарегистрированных пользователей сайта второй признанный пост, не отображающийся на странице Как создать страницу в виде черновика из моего плагина? Является ли новая панель администратора WordPress 3.1 подключаемой и как ее можно расширить? Сохранять активный класс на странице сообщений Тип сообщения => Любая головоломка Изменение цикла на пользовательской странице, странное поведение Страницы и сообщения на слайдере ElegantTheme

Функции WP в .js

У меня огромный main.js который включает 99% JS + плагинов JS . В то время как время загрузки немного больше, когда пользователь впервые посещает сайт, он кэшируется и не будет никаких других .js для загрузки на другие страницы.

Это создает проблему: я часто нахожусь в ситуациях, когда мне нужно использовать функции WordPress или общий PHP в моем .js .

Я могу назвать main.js main.php но потом он не будет кэшироваться (по крайней мере, по умолчанию), и он потратит ненужные ресурсы сервера для обработки этого (одного из моих самых больших – в настоящее время ~ 400 КБ) файлов.


У кого-нибудь есть хорошая стратегия, как использовать функции WordPress внутри .js файла?

Чтобы получить доступ к функциям на стороне сервера, вам необходимо запустить событие сервера из JS, используя AJAX , JSON API , XML / RPC , пользовательские конечные точки или даже hook_redirect . Просто будьте уверены, чтобы щедро разбрызгивать nonces при выполнении основных функций.


Простой и проверенный метод – это вызов AJAX . Настройте пару обработчиков, когда AJAX получает action когда пользователь либо вошел в систему, либо вышел из него (nopriv).

 add_action( 'wp_ajax_add_foobar', 'prefix_ajax_add_foobar' ); add_action( 'wp_ajax_nopriv_add_foobar', 'prefix_ajax_add_foobar' ); function prefix_ajax_add_foobar() { // Handle request then generate response using WP_Ajax_Response } 

Затем активируйте действие через JS. Ответ – это то, что вы выведете в обработчике, но обычно wp_send_json_success будет работать нормально.

 jQuery.post( ajaxurl, { 'action': 'add_foobar', 'data': 'foobarid' }, function(response){ alert('The server responded: ' + response); } ); 

Если JS нуждается в доступе к переменным сервера во время выполнения, рассмотрите возможность использования wp_localize_script для более чем текстовых переводов. Это действительно ваша возможность передать встроенную JS до загрузки скрипта. Таким образом, обеспечение JS имеет доступ к соответствующим URL-адресам, настройкам и состояниям, необходимым для вашего приложения. ajaxurl может существовать для некоторых людей, но локализуя это на переменной, заверит вас, что это правильный url.

 // Register the script wp_register_script( 'some_handle', 'path/to/myscript.js' ); // Localize the script with new data $translation_array = array( 'some_string' => __( 'Some string to translate', 'plugin-domain' ), 'a_value' => '10' ); wp_localize_script( 'some_handle', 'object_name', $translation_array ); // Enqueued script with localized data. wp_enqueue_script( 'some_handle' ); 

API JSON также является хорошим выбором и очень прост в настройке. Главный недостаток заключается в том, что в ядре (начиная с 4.4) всего лишь несколько недель, а не полностью установлен (полный на 4.5). Если вы не против жить на краю, вы можете быстро и быстро работать с пользовательскими конечными точками .

 function my_awesome_func( $data ) { $posts = get_posts( array( 'author' => $data['id'], ) ); if ( empty( $posts ) ) { return null; } return $posts[0]->post_title; } add_action( 'rest_api_init', function () { register_rest_route( 'myplugin/v1', '/author/(?P<id>\d+)', array( 'methods' => 'GET', 'callback' => 'my_awesome_func', ) ); } ); 

XML RPC был достаточно крут, чтобы каждый переключился на JSON API, если они могут ему помочь. Это проверенное решение, но кто хочет XML в наши дни?

 add_filter('xmlrpc_methods', function ($methods) { $methods['myNamespace.getTotalImageCount'] = 'rpc_myNamespace_getTotalImageCount'; return $methods; }); function rpc_myNamespace_getTotalImageCount($args) { return array_sum((array)wp_count_attachments('image')); } add_action('parse_request', function () { // PULL USER CREDS FROM CURRENT USER global $current_user; $user = $current_user->user_login; $password = $user->data->user_pass; include_once(ABSPATH . WPINC . '/class-IXR.php'); include_once(ABSPATH . WPINC . '/class-wp-http-ixr-client.php'); $xmlrpc_url = home_url('xmlrpc.php'); $client = new WP_HTTP_IXR_CLIENT($xmlrpc_url); // CALL OUR CUSTOM METHOD $response = $client->query('myNamespace.getTotalImageCount', array(0, $user, $password)); echo 'Response:<pre>'; $count = $client->message->params[0]; print_r("{$count} total images"); echo '</pre>'; wp_die('FIN'); }); 

Если вам интересно, сколько AJAX вы должны использовать, то смотрите не дальше, чем будущее домашнего проекта WordPress.com Calypso, где они переопределяют админ-сервер, используя как можно больше JS.


Все эти варианты великолепны, если кто-то не выключит JS, поэтому имейте это в виду, когда вы строите свой сайт.


Есть также несколько инструментов, которые помогут вам в этом.

Postman – REST Клиентское расширение для Chrome может тестировать запросы GET и POST – DEMO .

Monkeyman Rewrite Analyzer WP плагин может дважды проверить, что ваши пользовательские конечные точки перезаписи работают правильно.