wordpress — выполнение фрагмента PHP с помощью Underscore.js

В настоящее время я разрабатываю расширения для Факир и я узнал, что они используют 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;

0

Решение

Я думаю, вы неправильно понимаете, как работают эти языки. 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>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]