Wordpress:带有过滤器的存档页面不起作用(ACF)

Posted

技术标签:

【中文标题】Wordpress:带有过滤器的存档页面不起作用(ACF)【英文标题】:Wordpress: Archive page with Filter doesn't work (ACF) 【发布时间】:2019-09-10 23:55:43 【问题描述】:

我试图通过 ACF 的复选框字段过滤我的自定义帖子类型。 我使用本教程:https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/

现在我遇到的问题是,当我过滤自定义帖子类型的存档页面上的复选框时,没有任何变化。它只生成正确的 URL,但不过滤帖子。

有人知道为什么吗?

function.php:

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

// action
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(
            array(
                'key'       => $name,
                'value'     => $value,
                'compare'   => 'IN',
            )
        );

     


    // update meta query
    $query->set('meta_query', $meta_query ); 

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

register_taxonomy_for_object_type('category', 'projekte'); // Register Taxonomies for Category
$labels = array(
    'name' => __('Projekte', 'projekte'), // Rename these to suit
    'singular_name' => __('Projekt', 'projekte'),
    'add_new' => __('Projekt hinzufügen', 'projekte'),
    'add_new_item' => __('Neues Projekt hinzufügen', 'projekte'),
    'edit' => __('Bearbeiten', 'projekte'),
    'edit_item' => __('Projekt bearbeiten', 'projekte'),
    'new_item' => __('Neues Projekt', 'projekte'),
    'view' => __('Anschauen', 'projekte'),
    'view_item' => __('Projekt anschauen', 'projekte'),
    'search_items' => __('Projekte durchsuchen', 'projekte'),
    'not_found' => __('Projekt wurde nicht gefunden', 'projekte'),
    'not_found_in_trash' => __('Projekt wurde nicht im Papierkorb gefunden', 'projekte')
);
$args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'hierarchical' => true, // Allows your posts to behave like Hierarchy Pages
    'has_archive' => true,
    'supports' => array(
        'title',
        'excerpt'
    ), // Go to Dashboard Custom html5 Blank post for supports
    'can_export' => true, // Allows export in Tools > Export
    'taxonomies' => array(
        'category',
    ) // Add Category and Post Tags support
);
register_post_type('projekte', $args);

归档项目.php:

            <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="checkbox"]', function()
                        // vars
                        var url = '<?php echo home_url('projekte'); ?>';
                            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 );
                    );

                    $('.button.acf-add-checkbox').parent().remove();
                )(jQuery);
            </script>


            <div class="projekt-archive">
                <?php
                    $args = array(
                        'post_type' => 'projekte',
                        'post_status' => 'publish',
                        'posts_per_page' => '-1'
                    );
                    $the_query = new WP_Query( $args );

                    if ( $the_query->have_posts() ) : ?>
                        <?php while ( $the_query->have_posts() ) : ?>
                       ......
                <?php 
                    endwhile; 
                  endif;
                ?>
                <?php wp_reset_query(); ?>

【问题讨论】:

浏览器控制台是否有任何错误,或者创建存档文件后是否重置永久链接? 是的,我已经更新了永久链接,不幸的是没有错误消息。当我有这个代码“$meta_query[] = array(...”而不是这个“$meta_query = array(array(...”。 【参考方案1】:

我使用您的代码尝试重新创建您的问题,并遇到了许多问题,但都可以正常工作。在您提供的链接上,视频教程的作用与示例代码不同。

我注意到的第一件事是您正在更改函数中的 $query 然后在 archive-projekte.php 中重新定义它

$args = array(
      'post_type' => 'projekte',
      'post_status' => 'publish',
      'posts_per_page' => '-1'
);
$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) : 
   while ( $the_query->have_posts() ) : 
      //......
   endwhile; 
endif;

wp_reset_query();

您可以只使用标准循环的一个版本

if ( have_posts() )   
   while ( have_posts() ) 
      the_post();         
      //.......
   

其次,当我将 Wordpress admin 中的高级自定义字段(mitglieder)设置为复选框时,它会在过滤器 div 中由 create_field() 呈现为前端的复选框,但问题是复选框保存在元数据作为序列化数据,所以它不起作用,所以我将高级自定义字段更改为单选按钮,一切正常。

由此产生的新问题是过滤器 div 现在具有单选按钮。所以我观看了视频教程并在 $field 上使用 foreach 循环而不是使用 create_field 输出复选框,这意味着 JavaScript 也需要更改。

现在唯一的问题是,如果您需要将高级自定义字段设置为复选框,以便您的项目帖子之一具有多个 mitglieder 值,那么您需要使用序列化的元数据才能使过滤器正常工作正确。

这就像使用房屋和卧室的 ACF 示例视频一样,在这种情况下,房屋不能同时是 2 卧室房屋和 3 卧室房屋。

【讨论】:

以上是关于Wordpress:带有过滤器的存档页面不起作用(ACF)的主要内容,如果未能解决你的问题,请参考以下文章

WordPress:next_posts_link() 在页面模板循环之前不起作用

存档页面日期的 WP_Query 不起作用

重力形式总字段在 Wordpress 页面中不起作用

通过自定义日期字段的 Wordpress 自定义存档页面链接

在 Wordpress 中显示存档帖子

控制 wordpress 存档页面上的帖子数量