Wordpress: страница архива с фильтром не работает (ACF) - PullRequest
6 голосов
/ 21 апреля 2019

Я пытаюсь отфильтровать свои собственные типы постов по полю флажка ACF.Я работаю с этим учебным пособием: https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/

Теперь у меня возникла проблема, что ничего не изменится, когда ich отфильтрует флажки на странице архива пользовательского типа записи.Он генерирует только правильный 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);

archive-projekte.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(); ?>

1 Ответ

1 голос
/ 01 мая 2019

Я использовал ваш код, чтобы попытаться воссоздать вашу проблему, и столкнулся с рядом проблем, но все заработало.По ссылке, которую вы предоставили, видеоурок делает вещи иначе, чем пример кода.

Первое, что я заметил, это то, что вы меняете $ запрос в функциях, а затем переопределяете его в 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();         
      //.......
   }
}

Во-вторых, когда я устанавливаю расширенное настраиваемое поле (mitglieder) в Wordpress admin как флажок, оно затем отображается какустановите флажок в интерфейсе create_field () в фильтрующем элементе div, но проблема в том, что флажки сохраняются в метаданных как сериализованные данные, поэтому они не работают, поэтому я изменил расширенное настраиваемое поле на переключатель, и все работает нормально.

Новая проблема, созданная этим, заключается в том, что фильтр div теперь имеет переключатели.Поэтому я наблюдал за видеоуроками и флажками вывода, используя цикл foreach на $ field вместо create_field, это означает, что также необходимо изменить javascript.

Теперь остается только одна проблема - если вам нужны расширенные пользовательские настройкичтобы установить флажок, чтобы в одном из ваших сообщений projekte было более одного значения mitglieder, вам потребуется работать с сериализованными метаданными, чтобы фильтр работал правильно.

Это работает как пример видео ACF, которыйиспользует дома и спальни, и в этом случае дом не может быть домом с 2 спальнями и домом с 3 спальнями одновременно.

...