Поле ввода текста для фильтрации пользовательского типа записи на странице пользовательского архива в WordPress

#php #html #wordpress

Вопрос:

Я создал пользовательский архив глоссария для пользовательского типа записи «слова», и я пытаюсь добавить строку поиска/поле ввода текста, которое будет фильтровать слова и показывать только те, в которых _word_korean_value_key или _word_english_value_key метабоксы содержат строку поиска. Я уже реализовал фильтр категорий, но не могу понять, как перейти к строке поиска.

страница глоссария

Вот мой archive-words.php:

 <?php get_header(); ?>

<div class="container kbites-container">
  
    <h2 class='glossary-title'>Glossary </h2>
    <div class="filter-custom-taxonomy speech-part-links">
      <a href='<?php echo home_url() ?>/words' class='speech-part-link'>All </a>
          <?php
              $terms = get_terms( 'speech_parts' ); //retrieves terms in speech parts taxonomy
              foreach ( $terms as $term ) { ?>
              <a href="<?php echo home_url() ?>/words/?getby=catamp;cat=<?php echo esc_attr( $term->slug ); ?>" class="speech-part-link">
              <?php echo esc_html( $term->name ); ?>
              </a>
          <?php }; ?>
    </div>


   <!-- Use Bootstrap Accordion for words display -->
    <div class="accordion" id="accordionExample">

  <?php 
  
    if(have_posts()) {
        while(have_posts()) {
            the_post();
  ?>



<div class="accordion-item">
    <h2 class="accordion-header" id="heading-<?php echo get_the_ID(); ?>">
      <button class="accordion-button collapsed " type="button" data-bs-toggle="collapse" data-bs-target="#collapse-<?php echo get_the_ID(); ?>" aria-expanded="true" aria-controls="collapse-<?php echo get_the_ID(); ?>">
      <?php 
        echo get_post_meta( get_the_ID(), '_word_korean_value_key', true); ?> - <?php
        echo get_post_meta( get_the_ID(), '_word_english_value_key', true);
      ?>
      </button>
    </h2>
    <div id="collapse-<?php echo get_the_ID(); ?>" class="accordion-collapse collapse" aria-labelledby="heading-<?php echo get_the_ID(); ?>" >
      <div class="accordion-body">
      <?php echo the_content(); ?>
      <?php $id = get_post_meta( get_the_ID(), '_word_source_value_key', true); //retrieve source post id
      echo '<a class = "glossary-source-link" href="'.get_permalink( $id ).'">'.'Go to post: '.get_the_title( $id ).'</a>'; ?>
      </div>
    </div>
        </div>


    <?php }}
     wp_reset_query(); ?>

</div>

<div class="pagination">
<?php the_posts_pagination( array( 'mid_size' => 2, 'prev_text' => __( '< Prev', 'textdomain' ),
    'next_text' => __( 'Next >', 'textdomain' ),) ); ?>

  </div>
</div>

<?php get_footer(); ?>
 

Пользовательский тип записи:

 //Glossary word post type
function kbites_words_post() {
    $labels = array(
        'name' => 'Words',
        'singular_name' => 'Word',
        'add_new' => 'Add New Word',
        'all_items' => 'All Words',
        'add_new_item' => 'Add Word',
        'edit_item' => 'Edit Word',
        'new_item' => 'New Word',
        'view_item' => 'View Word',
        'search_item' => 'Search Word'

    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'publicly_queryable' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'show_in_rest' => true,
        'supports' => array('editor', 'thumbnail', 'revisions'),
        'menu_position' => 3,
        'exclude_from_search' => true,
        'menu_icon' => 'dashicons-translation',
    );

    register_post_type('words',$args);
}

add_action('init', 'kbites_words_post');
 

And the code I used for the category filter:

 function kbites_words_filter_archive( $query ) {
      if ( ! $query->is_main_query() )
      return $query;
      if ( is_admin() ) {
              return;
      }
      if ( is_post_type_archive('words') ) {
        if (isset($_GET['getby'])) {
              if ( 'cat' === $_GET['getby'] ) {
                          $taxquery = array(
                                  array(
                                          'taxonomy' => 'speech_parts',
                                          'field' => 'slug',
                                          'terms' => $_GET['cat'],
                                  ),
                          );
                          $query->set( 'tax_query', $taxquery );
              }
      }
      $query->set( 'posts_per_page', 30 );
    }
      return $query;
}
add_action( 'pre_get_posts', 'kbites_words_filter_archive');