1

Я следую за официальным guide в документации ACF, но не смог получить его правильно. Я использую расширенные настраиваемые поля и пользовательские плагины пользовательского типа Post.Пользовательские сообщения фильтра ACF по полю поля повторителя

У меня есть пользовательский тип записи под названием материалы, каждый материал имеет повторителя поле файлы, один из подполе название. Я хочу запросить сообщения на основе заголовка и поместить результаты на страницу с помощью ajax.

Вот мой functions.php:

function materialsSearchAjax() { 

    $html = ""; 
    $keyword = $_POST['keyword']; 
    // args 
    $args = array(
    'numberposts' => -1, 
    'posts_per_page' => -1, 
    'post_type'  => 'materials', 
    'meta_key' => 'type', 
    'meta_value' => 'students', 
    'meta_query' => 
     array(
      'key'  => 'files_%_title', 
      'compare' => 'LIKE', 
      'value'  => $keyword, 
    ) 
); 

    $query = new WP_Query($args); 
    $posts = array(); 
    $html .= '<div class="Materials-students">'; 

    while($query->have_posts()) : $query->the_post(); 
    $html .= '<div class="Files-list u-padding-left--12">'; 
     if(have_rows('files')){ 
     while (have_rows('files')) : the_row(); 
      $html .= '<div class="Files-item u-margin-right--30 u-margin-bottom--18">'; 
      $html .= '<div class="Files-itemImage"></div>'; 
      $html .= '<a href="' . the_sub_field("document") . '" target="_blank" class="Files-itemLink">'; 
      $html .= the_sub_field('title'); 
      $html .= '</a>'; 
      $html .= '</div>'; 
     endwhile; 
     } 
    $html .= '</div>'; 
    endwhile; 

    $html .= '</div>'; 

    wp_reset_query(); 
    return $html; 
} 

// filter 
function materials_where($where) { 

    $where = str_replace("meta_key = 'files_%", "meta_key LIKE 'files_%", $where); 

    return $where; 
} 

function igs_scripts_styles() { 
    wp_enqueue_script('ajaxMaterialsSearch', get_template_directory_uri() . '/assets/scripts/ajaxMaterialsSearch.js', array(), false, true); 
    wp_localize_script('ajaxMaterialsSearch', 'ajax_data_object', array('url' => admin_url('admin-ajax.php'))); 
} 

add_action('wp_ajax_nopriv_materialsSearchAjax', 'materialsSearchAjax'); 
add_action('wp_ajax_materialsSearchAjax', 'materialsSearchAjax'); 
add_filter('posts_where', 'materials_where'); 
add_action('wp_enqueue_scripts', 'igs_scripts_styles'); 

Вот мой Аякс:

(function($) { 
    // Trigger submit 
    $('.Search-magnifier').on('click', function(){ 
    var $form = $(this).parent(); 
    $($form).submit(); 
    }); 

    $('.Search-form').on('submit', function(event){ 
    event.preventDefault(); 
    var $form = $(this); 
    var searchKeyword = $($form).find('input[type="search"]').val(); 
    console.log('keyword: ' + searchKeyword); 
    $.ajax({ 
     type: 'POST', 
     url: ajax_data_object.url, 
     data: {action: 'materialsSearchAjax', keyword: searchKeyword}, 
     success: function(textStatus) { 
     // update the content 
     console.log(textStatus); 
     $('.Materials-students').replaceWith(textStatus); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
     console.log(errorThrown); 
     } 
    }); 
    }); 
})(jQuery); 

Аякс и запрос отлично работает, если я запрашиваю все материалы сообщение без фильтрации названия так только кажется, что это неправильным является сам запрос. Я последовал за гидом, но застрял часами.

+0

Я понимаю, что вы хотите, чтобы ваш запрос извлекал все 'материалы', соответствующие подполе' title' для любой строки в файлах ретранслятора ','? –

+0

да, это именно то, что я хочу @JordiNebot – YaphatS

ответ

0

Я думаю, что ваша единственная ошибка находится внутри самого meta_query. Помимо (необязательно) первого уровня relation, meta_query должен быть массивом массива. Попробуйте:

$args = array(
    'posts_per_page' => -1, 
    'post_type'  => 'materials', 
    'meta_key'  => 'type', 
    'meta_value'  => 'students', 
    'meta_query'  => array(
     array(
      'key'  => 'files_%_title', 
      'compare' => 'LIKE', 
      'value' => $keyword, 
     ) 
    ) 
); 

От WP Codex:

meta_query (массив) - Содержит один или несколько массивов со следующими ключами: [...]

Я реплицируюсь ваше дело (за исключением для Ajax), и запрос работал нормально, поэтому я предполагаю, что это также должно работать над вызовами Ajax.

Смежные вопросы