#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');