programing

워드프레스:필터가 있는 보관 페이지가 작동하지 않음(ACF)

topblog 2023. 6. 12. 21:04
반응형

워드프레스:필터가 있는 보관 페이지가 작동하지 않음(ACF)

ACF의 확인란 필드를 기준으로 사용자 지정 게시물 유형을 필터링하려고 합니다.저는 이 튜토리얼을 사용합니다: https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/

이제 사용자 지정 게시물 유형의 보관 페이지에 있는 확인란 위에 필터링하면 아무것도 변경되지 않는다는 문제가 발생했습니다.올바른 URL만 생성하고 게시물은 필터링하지 않습니다.

어떤 사람들은 왜 그런지 아나요?

기능.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(); ?>

저는 당신의 코드를 사용하여 당신의 문제를 다시 만들어 보았는데 여러 가지 문제가 발생했지만 작동했습니다.제공한 링크에서 비디오 튜토리얼은 샘플 코드와 다르게 작동합니다.

제가 가장 먼저 깨달은 것은 당신이 함수에서 $query를 변경하고 아카이브 프로젝트에서 재정의하고 있다는 것입니다.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();         
      //.......
   }
}

두 번째로 워드프레스 관리자에서 고급 사용자 지정 필드(mitglyder)를 확인란으로 설정하면 필터 div에서 create_field()에 의해 프런트 엔드에서 확인란으로 렌더링되지만, 문제는 확인란이 메타데이터에 직렬화된 데이터로 저장되어 작동하지 않아서 고급 사용자 지정 필드를 모두 라디오 버튼으로 변경했다는 것입니다.잘 작동합니다.

이로 인해 발생한 새로운 문제는 필터 div에 라디오 버튼이 있다는 것입니다.그래서 create_field를 사용하는 대신 $field의 각 루프에 대한 비디오 튜토리얼과 출력 확인란을 보았습니다. 이는 Javascript도 변경해야 한다는 것을 의미합니다.

이제 남은 유일한 문제는 프로젝트 게시물 중 하나에 둘 이상의 mitglyder 값이 포함되도록 고급 사용자 지정 필드를 확인란으로 지정해야 하는 경우 필터가 올바르게 작동하려면 직렬화된 메타 데이터로 작업해야 합니다.

이것은 집과 침실을 사용하는 ACF 예제 비디오처럼 작동하며, 이 경우 집은 침실 2개짜리 집과 침실 3개짜리 집이 동시에 될 수 없습니다.

언급URL : https://stackoverflow.com/questions/55783399/wordpress-archive-page-with-filter-doesnt-work-acf

반응형