Как обработать поиск Ajax с помощью PostQuery по заголовку и нумерации страниц? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть страница, которая отображает список типов сообщений, и я хотел бы добавить на эту страницу функцию поиска / фильтрации. Однако я стою по запросу 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.

Спасибо за помощь и ваше время.

...