В настоящее время я разрабатываю расширения для Факир и я узнал, что они используют Underscore.js. Я проверяю с разработчиком, чтобы выполнить php-код, такой как wp_query и так далее, и они ответили:
content_template
работает только в редакторе и является Подчеркни шаблонный движок (JS), поэтому PHP не будет работать здесь.
Я хотел бы знать, если кто-нибудь знает способ расширить Underscore.JS для выполнения кода PHP любым способом?
Пример кода на PHP
while ( $wp_query->have_posts() ) : $wp_query->the_post();
echo 'something';
endwhile;
Я думаю, вы неправильно понимаете, как работают эти языки. PHP выполняется на стороне сервера, а затем отправляется клиенту (браузеру) уже отрендеренным. Каждый раз, когда вы хотите выполнить PHP, вы ДОЛЖНЫ попасть на сервер.
JavaScript, с другой стороны, является языком на стороне клиента (браузера), что означает, что он отправляется клиенту, а клиент (браузер) выполняет его.
При этом есть несколько способов «выполнить» php-код в JavaScript.
Первый способ — выполнить php перед отправкой ответа клиенту, но держать его скрытым до тех пор, пока он не понадобится в JavaScript. Это своего рода хак и не масштабируется, однако в некоторых случаях это может сработать.
Второй способ, который, я думаю, вы захотите использовать, — это AJAX. Он отправит запрос на сервер в фоновом режиме без перезагрузки страницы. Конечно, будет задержка во времени, которое требуется серверу для ответа на запрос.
Вот пример вызова AJAX с WordPress.
Backend:
// Add the "fetch_posts" AJAX action.
add_action('wp_ajax_nopriv_fetch_posts', 'fetch_posts');
add_action('wp_ajax_fetch_posts', 'fetch_posts');
function fetch_posts() {
if (isset($_POST['ids'])) {
$html = '';
// set $wp_query using the post ids sent.
while ( $wp_query->have_posts() ) : $wp_query->the_post();
$html .= 'something';
endwhile;
wp_send_json_success($html);
}
}
Внешний интерфейс:
<div id="posts-container">
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post();
echo 'something';
endwhile; ?>
</div>
<br/><br/>
<a id="change-posts">Click Here</a>
<script>
$('#change-posts').on('click', function() {
// This is where you get to use the 'fetch_posts' action name that you created above.
data = {
ids: [147, 148, 149],
action: 'fetch_posts'
};
$.ajax({
url: "<?php echo admin_url('admin-ajax.php') ?>",
method: "POST",
data: data
}).done(function(response) {
$('#posts-container').html(response.data);
});
});
</script>
Других решений пока нет …