使用自定义字段筛选器创建WP存档

2022-04-12 00:00:00 php wordpress advanced-custom-fields
因此,我正在尝试创建一个高级自定义过滤器专业插件的过滤器,在自定义帖子类型存档页面上,但它不过滤。它会更改URL,尽管它会列出页面上的所有项目,而不考虑所选内容。

我正在尝试按照本教程进行复制:https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/

我已经使用以下内容设置了unctions.php:

<?php

function theme_enqueue_styles() {
    wp_enqueue_style( 'aerious-parent-stylesheet', get_template_directory_uri() . '/style.css', array( 'aerious-google-fonts', 'aerious-libs' ) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

function aerious_child_lang_setup() {
    $lang = get_stylesheet_directory() . '/languages';
    load_child_theme_textdomain( 'aerious', $lang );
}
add_action( 'after_setup_theme', 'aerious_child_lang_setup' );


// Houses Custom Posttype

$labels = array(
    'name'                  => 'Houses',
    'singular_name'         => 'House',
    'add_new'               => 'Add New',
    'add_new_item'          => 'Add New House',
    'edit_item'             => 'Edit Houses',
    'new_item'              => 'New House',
    'all_items'             => 'All Houses',
    'view_item'             => 'View House',
    'search_items'          => 'Search Houses',
    'not_found'             => 'No houses found',
    'not_found_in_trash'    => 'No houses found in Trash',
    'parent_item_colon'     => '',
    'menu_name'             => 'Houses',

);


$args = array(
    'labels'                => $labels,
    'public'                => true,
    'publicly_queryable'    => true,
    'show_ui'               => true,
    'show_in_menu'          => true,
    'query_var'             => true,
    'rewrite'               => array( 'slug' => 'houses' ),
    'capability_type'       => 'post',
    'has_archive'           => true,
    'hierarchical'          => false,
    'supports'              => array('title', 'editor', 'author', 'thumbnal')
);

register_post_type( 'house', $args);

// Custom Posttype Filter

// array of filters (field key => field name)
$GLOBALS['my_query_filters'] = array( 
    'field_5d1cafdb2f7d4'   => 'bedrooms'   
);


// action
add_action('pre_get_posts', 'my_pre_get_posts', 10, 1);

function my_pre_get_posts( $query ) {

    // bail early if is in admin
    if( is_admin() ) return;


    // bail early if not main query
    // - allows custom code / plugins to continue working
    if( !$query->is_main_query() ) return;


    // get meta query
    $meta_query = $query->get('meta_query');


    // loop over filters
    foreach( $GLOBALS['my_query_filters'] as $key => $name ) {

        // continue if not found in url
        if( empty($_GET[ $name ]) ) {

            continue;

        }


        // get the value for this filter
        // eg: http://www.website.com/events?city=melbourne,sydney
        $value = explode(',', $_GET[ $name ]);


        // append meta query
        $meta_query = array(
            'key'       => $name,
            'value'     => $value,
            'compare'   => 'IN',
        );


    } 


    // update meta query
    $query->set('meta_query', $meta_query);
    // echo '<pre>';
    // var_dump($query->query_vars);
    // echo '</pre>';
}

和我的存档-house.php:

<?php

global $aerious_options;

get_header();

do_action( 'aerious_main_layout_start' );

$class_blog_layout  = isset( $aerious_options['blog_layout'] ) ? esc_html( $aerious_options['blog_layout'] ) : 'standard';
$classes = array( 'aerious-blog-posts', 'blog-layout-'. $class_blog_layout );

$blog_pagination_type = isset( $aerious_options['blog_pagination_type'] ) ? esc_attr( $aerious_options['blog_pagination_type'] ) : 'pagination';
$blog_archive_layout = isset( $aerious_options['blog_archive_layout'] ) ? esc_attr( $aerious_options['blog_archive_layout'] ) : 'standard';

if ( $blog_pagination_type == 'loadmore' ) {
    $classes[] = 'pagination-container';
}
else {
    $classes[] = 'row';
}

if( $class_blog_layout == 'grid' ) {
    $classes[] = 'posts-grid';
}


if ( have_posts() ){ ?>
    <div <?php echo aerious_class( $classes ) ?> >

    <!-- FILTER START -->   
    <div id="archive-filters">
        <?php foreach( $GLOBALS['my_query_filters'] as $key => $name ): 

            // get the field's settings without attempting to load a value
            $field = get_field_object($key, false, false);


            // set value if available
            if( isset($_GET[ $name ]) ) {

                $field['value'] = explode(',', $_GET[ $name ]);

            }


            // create filter
            ?>
            <div class="filter" data-filter="<?php echo $name; ?>">
                <?php create_field( $field ); ?>
            </div>

        <?php endforeach; ?>
    </div>

    <script type="text/javascript">
    (function($) {

        // change
        $('#archive-filters').on('change', 'input[type="radio"]', function(){

            // vars
            var url = '<?php echo home_url('houses'); ?>';
                args = {};


            // loop over filters
            $('#archive-filters .filter').each(function(){

                // vars
                var filter = $(this).data('filter'),
                    vals = [];


                // find checked inputs
                $(this).find('input:checked').each(function(){

                    vals.push( $(this).val() );

                });


                // append to args
                args[ filter ] = vals.join(',');

            });


            // update url
            url += '?';


            // loop over args
            $.each(args, function( name, value ){

                url += name + '=' + value + '&';

            });


            // remove last &
            url = url.slice(0, -1);


            // reload page
            window.location.replace( url );


        });

    })(jQuery);
    </script>
    <!-- FILTER END --> 

        <?php

        if ( $blog_pagination_type == 'loadmore' OR $blog_archive_layout == 'grid' )  : ?>
            <div class="<?php if ( $blog_pagination_type == 'loadmore' ) { echo 'posts-append grid row'; } else { echo 'grid'; } ?>"> <?php
        endif;
            while ( have_posts() ) { the_post();
                get_template_part( 'template-parts/blog/content', 'loop' );
            }
        if ( $blog_pagination_type == 'loadmore' OR $blog_archive_layout == 'grid' )  : ?>
        </div><?php
        endif;

        if ( $blog_pagination_type == 'loadmore' ) {
            $big = 999999999;
            $loadmore_text = ( isset( $aerious_options['loadmore_text'] ) && $aerious_options['loadmore_text'] ) ? esc_html( $aerious_options['loadmore_text'] ) : esc_html__( 'Load More', 'aerious' );
            echo '<div class="pagination-loadmore">';
            echo  paginate_links( array(
                   'base'       => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                   'format'     => '?paged=%#%',
                   'current'    => max( 1, get_query_var( 'paged' ) ),
                   'total'      => $wp_query->max_num_pages,
                   'next_text'  => '<span class="aerious-btn aerious-btn-default aerious-btn-lg">'. $loadmore_text .'<span class="aerious-count-loader"><img src="'. get_template_directory_uri(). "/assets/images/loaders/loader.gif" .'" alt="..."></span></span>',
               ) );
            echo '</div>';
        }
        else {
            aerious_pagination();
        }
        ?>
    </div> <?php
}
else {
    get_template_part( 'template-parts/content','none' );
}

do_action( 'aerious_main_layout_end' );

get_footer();

搜索地址为:

https://startnow.hu/houses/?bedrooms=1,3

调试方式:

echo "<pre>"; print_r($wp_query->query_vars); echo "</pre>";

结果:


array(54) {
  ["post_type"]=>
  string(5) "house"
  ["error"]=>
  string(0) ""
  ["m"]=>
  string(0) ""
  ["p"]=>
  int(0)
  ["post_parent"]=>
  string(0) ""
  ["subpost"]=>
  string(0) ""
  ["subpost_id"]=>
  string(0) ""
  ["attachment"]=>
  string(0) ""
  ["attachment_id"]=>
  int(0)
  ["name"]=>
  string(0) ""
  ["static"]=>
  string(0) ""
  ["pagename"]=>
  string(0) ""
  ["page_id"]=>
  int(0)
  ["second"]=>
  string(0) ""
  ["minute"]=>
  string(0) ""
  ["hour"]=>
  string(0) ""
  ["day"]=>
  int(0)
  ["monthnum"]=>
  int(0)
  ["year"]=>
  int(0)
  ["w"]=>
  int(0)
  ["category_name"]=>
  string(0) ""
  ["tag"]=>
  string(0) ""
  ["cat"]=>
  string(0) ""
  ["tag_id"]=>
  string(0) ""
  ["author"]=>
  string(0) ""
  ["author_name"]=>
  string(0) ""
  ["feed"]=>
  string(0) ""
  ["tb"]=>
  string(0) ""
  ["paged"]=>
  int(0)
  ["meta_key"]=>
  string(0) ""
  ["meta_value"]=>
  string(0) ""
  ["preview"]=>
  string(0) ""
  ["s"]=>
  string(0) ""
  ["sentence"]=>
  string(0) ""
  ["title"]=>
  string(0) ""
  ["fields"]=>
  string(0) ""
  ["menu_order"]=>
  string(0) ""
  ["embed"]=>
  string(0) ""
  ["category__in"]=>
  array(0) {
  }
  ["category__not_in"]=>
  array(0) {
  }
  ["category__and"]=>
  array(0) {
  }
  ["post__in"]=>
  array(0) {
  }
  ["post__not_in"]=>
  array(0) {
  }
  ["post_name__in"]=>
  array(0) {
  }
  ["tag__in"]=>
  array(0) {
  }
  ["tag__not_in"]=>
  array(0) {
  }
  ["tag__and"]=>
  array(0) {
  }
  ["tag_slug__in"]=>
  array(0) {
  }
  ["tag_slug__and"]=>
  array(0) {
  }
  ["post_parent__in"]=>
  array(0) {
  }
  ["post_parent__not_in"]=>
  array(0) {
  }
  ["author__in"]=>
  array(0) {
  }
  ["author__not_in"]=>
  array(0) {
  }
  ["meta_query"]=>
  array(3) {
    ["key"]=>
    string(8) "bedrooms"
    ["value"]=>
    array(1) {
      [0]=>
      string(1) "1"
    }
    ["compare"]=>
    string(2) "IN"
  }
}
NULL


解决方案

好的,我已经解决了问题!

在函数.php中,教程要求编写

// append meta query
        $meta_query[] = array(
            'key'       => $name,
            'value'     => $value,
            'compare'   => 'IN',
        );

但我们需要

// append meta query
        $meta_query = [];
        $meta_query[] = array(
            'key'       => $name,
            'value'     => $value,
            'compare'   => 'IN',
        );

不管怎样,谢谢你的帮助!

相关文章