У меня есть страница, которая отображает список типов сообщений, и я хотел бы добавить на эту страницу функцию поиска / фильтрации. Однако я стою по запросу ajax и пытаюсь использовать PostQuery для заголовка. Похоже, что PostQuery не работает с заголовком сообщения. Поэтому я подумал о том, чтобы сначала выполнить стандартный запрос WP, чтобы отфильтровать мое сообщение по заголовку; а затем получить все идентификаторы сообщений, возвращаемых этим запросом, и выложить их в PostQuery, чтобы получить правильную структуру для моего просмотра.
Так что мне интересно, есть ли лучшее решение: /
Вот что я сейчас делаю:
В моей функции. php Я настраиваю свое маршруты любит это:
Routes::map('/my-post-type', function ($params) {
if (!is_user_logged_in()) {
wp_redirect(home_url().'/login');
exit();
}
$user = wp_get_current_user();
if ($user->roles[0]=="subscriber") {
$post_type="publish";
} else {
$post_type="any";
}
$query = 'post_type=my-post-type&order=ASC&orderby=title&post_status='.$post_type;
Routes::load('my-post-type.php', $params, $query, 200);
});
my-post-type. php:
<?php
use Timber\Timber;
use Timber\Post;
$context = Timber::context();
$context['post']= new Post();
$url = $_SERVER['REQUEST_URI'];
if (strpos($url,'/page/')==true){
$url = substr($url, 0, strpos($url, "page/"));
}
$context['url'] = $url;
\Timber\Timber::render('my-post-type/list.twig', $context);
Мой вид ветки с формой поиска (list.twig):
<div class="list-search">
<form id="search" method="GET" action="{{ site.link }}/wp-admin/admin-ajax.php" class="procedure">
<input type="text" class="search-field" name="searchName" placeholder="Post name">
<input type="hidden" name="action" value="dynamic_search">
<input type="hidden" name="entity" value="my-post-type">
<input type="submit" value="Search">
</form>
</div>
<div>
{% include 'my-post-type/list-item.twig' %}
</div>
Вот мой список list-item.twig, который отображает список с нумерацией страниц:
{% if posts is not empty %}
<div class="list-item">
{% for i, post in posts %}
{% set description = post.meta('procedure-description') %}
{% set file = post.meta('procedure-file') %}
{% set link = post.meta('procedure-link') %}
{% if description is not empty %}
<div class="list-item__body item-{{ i }} {% if post.post_status != "publish" %}not-publish{% endif %}">
{% if post.post_status != "publish" %}
<div class="ribbon ribbon-top-right"><span>DRAFT</span></div>
{% endif %}
<div class="list-item__title">
<a href="{{ url }}./{{ post.slug }}">
<h2>{{ post.post_title }}</h2>
</a>
</div>
<div class="list-item__description">
{{ description |raw | nl2br |truncate(25)}}
</div>
<div class="list-item__info">
<div class="list-item-info__title">
<h2>Information :</h2>
</div>
<div class="list-item-info__content">
<div class="procedure__link">
{% if link is not empty %}
<a href="{{ link }}" target="_blank">
<h2>Link <i class="fas fa-external-link-alt"></i></h2>
</a>
{% else %}
<h2>No link</h2>
{% endif %}
</div>
<div class="procedure__file">
{% if file is not empty %}
<a href="{{ file.url }}" target="_blank">
<h2>File <i class="fas fa-file-pdf"></i></h2>
</a>
{% else %}
<h2>No file</h2>
{% endif %}
</div>
</div>
</div>
<div class="list-item__more">
<a href="{{ url }}./{{ post.slug }}">Read more <i class="fas fa-arrow-right"></i></a>
</div>
</div>
{% endif %}
{% endfor %}
</div>
<div class="list-pagination">
{% if posts.pagination.prev %}
<div class="list-pagination__action list-pagination__prev">
<i class="left fas fa-arrow-left"></i>
<a href="{{posts.pagination.prev.link}}" class="prev {{posts.pagination.prev.link|length ? '' : 'invisible'}}">Previous page</a>
</div>
{% endif %}
{% if posts.pagination.next %}
<div class="list-pagination__action list-pagination__next">
<a href="{{posts.pagination.next.link}}" class="next {{posts.pagination.next.link|length ? '' : 'invisible'}}">Next page</a>
<i class="right fas fa-arrow-right"></i>
</div>
{% endif %}
</div>
{% else %}
<p>No elements found</p>
{% endif %}
Мой ajax запрос на стороне JS:
var handleSearchPosts = () => {
const form = $("#search");
form.submit(function () {
$.ajax({
url : '/wp/wp-admin/admin-ajax.php',
type : 'GET',
data: form.serialize(),
dataType:'html',
success: function (data) {
$('.list-item').html(data);
},
error: function (r,s,e) {
}
});
return false;
})
};
И, наконец, запрос Ajax на стороне php:
public function dynamicSearch() {
$context = Timber::context();
//print_r($context);
$context['posts']= [];
if ($user = wp_get_current_user()) {
$user->roles[0]=="subscriber"?$isSubscriber=true:$isSubscriber=false;
if (isset($_REQUEST["entity"])) {
$search = isset($_REQUEST["searchName"])?$_REQUEST["searchName"]:"";
$searchContain = $_REQUEST["searchType"]==="contain"?true:false;
$context['posts'] = $this->searchElem($search, $_REQUEST["entity"], $isSubscriber, $searchContain);
}
} else {
$context['posts'] = 'Your are not authorize to use this search.';
}
$filename = $_REQUEST["entity"].'s/list-item.twig';
Timber::render($filename, $context);
die;
}
public function searchElem($search, $post_type, $isSubscriber, $searchContain){
global $wpdb;
$posts = [];
$query = "
SELECT *
FROM {$wpdb->prefix}posts
WHERE post_type = '".$post_type."'";
if ($isSubscriber){
$query .= " AND post_status = 'publish'";
}
if (!empty($search)) {
if($searchContain){
$query .= " AND post_title LIKE '%".$search."%'";
}else{
$query .= " AND post_title LIKE '".$search."%'";
}
}
$results = $wpdb->get_results($query);
if(!empty($results)){
foreach ($results as $result) {
$posts[] = $result->ID;
}
$args = [
'post__in' => $posts,
'post_type' => $post_type,
'order' => 'ASC',
'orderby' => 'title'
];
return new PostQuery($args);
}
return [];
}
Тем не менее, с помощью этого решения я могу фильтровать по определенной c части заголовка, но разбиение на страницы не работает. У меня нет идеи заставить его работать с моим возвращением ajax. На данный момент результат таков: моя страница изменила sh страницу, и я потерял фильтрацию Ajax.
Спасибо за помощь и ваше время.