1

Ich bin die offizielle guide in ACF-Dokumentation, aber war nicht in der Lage, es richtig zu machen. Ich verwende erweiterte benutzerdefinierte Felder und benutzerdefinierte Post-Typ-UI-Plugins.ACF Filter benutzerdefinierte Beiträge nach Unterfeld Repeater Feld

ich eine benutzerdefinierte Post Typ Materialien, jedes Material hat eine Dateien Repeater Feld, einer der Unterfeld ist Titel benannt haben. Ich möchte die Beiträge basierend auf dem Titel abfragen und die Ergebnisse mit Ajax auf die Seite stellen.

Hier ist meine 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'); 

meine Ajax hier:

(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); 

Die Ajax und Abfrage funktionieren, wenn ich alle Materialien veröffentlichen abfragen, ohne den Titel Filterung so die denken, nur das ist, falsch ist die Abfrage selbst. Ich folgte dem Führer, steckte aber stundenlang fest.

+0

Ich verstehe, dass Sie möchten, dass Ihre Abfrage alle 'Materialien' abruft, die mit dem Unterfeld' title' für jede Zeile auf dem Repeater 'files' übereinstimmen, richtig? –

+0

Ja, genau das möchte ich @JordiNebot – YaphatS

Antwort

0

Ich denke, Ihr einziger Fehler ist innerhalb der meta_query selbst. Neben der (optionalen) ersten Ebene relation muss eine meta_query ein Array von Arrays sein. Versuchen:

$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, 
     ) 
    ) 
); 

Von WP Codex:

meta_query (Array) - Enthält eine oder mehr Arrays mit folgenden Tasten: [...]

ich Ihren Fall repliziert (außer für die Ajax) und die Abfrage funktionierte gut, also denke ich, dass dies auch über Ajax-Aufrufe funktionieren sollte.

Verwandte Themen