Wordpress:带过滤器的存档页面不起作用 (ACF)
Wordpress: Archive page with Filter doesn't work (ACF)
我试图通过 ACF 的复选框字段过滤我的自定义 post 类型。
我使用本教程:https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/
现在我遇到的问题是,当 ich 过滤自定义 post 类型的存档页面上的复选框时,没有任何变化。它只生成正确的 URL 但不过滤 posts.
有人知道为什么吗?
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);
存档-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(); ?>
我使用你的代码尝试重现你的问题,运行 解决了很多问题,但成功了。在 link 中,您提供的视频教程与示例代码不同。
我注意到的第一件事是您正在更改函数中的 $query,然后在存档中重新定义它-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 管理中将高级自定义字段 (mitglieder) 设置为复选框时,它会在前端通过过滤器 create_field() 呈现为复选框 div但问题是复选框作为序列化数据保存在元数据中,所以它不起作用所以我将高级自定义字段更改为单选按钮它一切正常。
由此产生的新问题是过滤器 div 现在有单选按钮。所以我观看了视频教程并使用 $field 上的 foreach 循环输出复选框,而不是使用 create_field,这意味着 javascript 也需要更改。
现在唯一的问题是,如果您需要将高级自定义字段设置为复选框,以便您的一个项目帖子具有多个 mitglieder 值,那么您将需要使用序列化的元数据来制作过滤器工作正常。
这类似于使用房屋和卧室的 ACF 示例视频,在这种情况下,房屋不能同时是 2 居室房屋和 3 居室房屋。
我试图通过 ACF 的复选框字段过滤我的自定义 post 类型。 我使用本教程:https://www.advancedcustomfields.com/resources/creating-wp-archive-custom-field-filter/
现在我遇到的问题是,当 ich 过滤自定义 post 类型的存档页面上的复选框时,没有任何变化。它只生成正确的 URL 但不过滤 posts.
有人知道为什么吗?
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);
存档-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(); ?>
我使用你的代码尝试重现你的问题,运行 解决了很多问题,但成功了。在 link 中,您提供的视频教程与示例代码不同。
我注意到的第一件事是您正在更改函数中的 $query,然后在存档中重新定义它-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 管理中将高级自定义字段 (mitglieder) 设置为复选框时,它会在前端通过过滤器 create_field() 呈现为复选框 div但问题是复选框作为序列化数据保存在元数据中,所以它不起作用所以我将高级自定义字段更改为单选按钮它一切正常。
由此产生的新问题是过滤器 div 现在有单选按钮。所以我观看了视频教程并使用 $field 上的 foreach 循环输出复选框,而不是使用 create_field,这意味着 javascript 也需要更改。
现在唯一的问题是,如果您需要将高级自定义字段设置为复选框,以便您的一个项目帖子具有多个 mitglieder 值,那么您将需要使用序列化的元数据来制作过滤器工作正常。
这类似于使用房屋和卧室的 ACF 示例视频,在这种情况下,房屋不能同时是 2 居室房屋和 3 居室房屋。