通过URL发送多个自定义字段值

时间:2014-01-10 作者:realph

基本上,我正在努力this tutorial 将操作添加到pre_get_posts 并创建一个自定义meta\\u查询,以便我可以在URL中更改查询,并显示婴儿、儿童和家庭书籍,如下所示:

http://website.com/books/?type=babies,children,home

我正在使用Advanced Custom Fields plugin 对于我的自定义字段,我的自定义字段称为“type”,并在WordPress中设置为复选框字段,因此它接受多个值。

就我个人而言,我不知道如何让它显示被查询的帖子。

function my_pre_get_posts( $query ) {
if( is_admin() ) { return; }

$meta_query = $query->get(\'meta_query\');
    if( !empty($_GET[\'type\']) ) {               
        $type = explode(\'|\', $_GET[\'type\']);    
        $meta_query[] = array(                          
            \'key\'       => \'type\',
            \'value\'     => $type,
            \'compare\'   => \'IN\',
        );
    }

$query->set(\'meta_query\', $meta_query); // update the meta query args
return; // always return
}
使用\'compare\' => \'LIKE\' 只返回随机帖子,使用IN 返回空白结果页。

不确定是否与我的$_GET[\'type\'] 参数,该参数应为字符串。

感谢您对解决此问题的任何帮助。我正在喝第五杯咖啡,今晚看起来不太好。

archive.book.php

$args = array(
\'post_type\'     => \'book\',
\'posts_per_page\'    => 10,
);

$wp_query = new WP_Query( $args );
while( $wp_query->have_posts() ) {

    $wp_query->the_post();
    get_template_part( \'content\', get_post_format() );
}
此正常循环:

<?php 
print_r( $wp_query->request );
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        get_template_part( \'content\', get_post_format() );
    } // end while
} // end if
?>
输出:

SELECT SQL_CALC_FOUND_ROWS blISt3rs871o_posts.ID FROM blISt3rs871o_posts WHERE 1=1 AND blISt3rs871o_posts.post_type = \'book\' AND (blISt3rs871o_posts.post_status = \'publish\' OR blISt3rs871o_posts.post_status = \'private\') ORDER BY blISt3rs871o_posts.post_date DESC LIMIT 0, 10

2 个回复
SO网友:Brian Richards

首先,请记住pre_get_posts 是在WP运行的每个查询上运行的钩子,因此在使用它时要非常非常小心。这就是说,它绝对是您想要做的事情的最佳工具,当然比在页面模板中编写单独的自定义查询要好。

我在该函数的开头添加了一些附加条件,以确保在以下情况下尽早放弃该函数:不针对主循环、在管理页面上运行或不存在“type”查询字符串。您应该在此处添加更多条件以进一步限制它,例如:。if ( ! is_page( \'something\' ) ) { return; }if ( ! is_front_page() ) { return; }.

也就是说,下面是一些示例代码:

/**
 * Add custom meta filter to main query on any page.
 *
 * @since  1.0.0
 *
 * @param  object $query WP Query object.
 */
function wpse129223_custom_meta_query( $query ) {

    // If not on the main query, or on an admin page, bail here
    if ( ! $query->is_main_query() || is_admin() ) {
        return;
    }

    // If \'type\' isn\'t being passed as a query string, bail here
    if ( empty( $_GET[\'type\'] ) ) {
        return;
    }

    // Get the existing meta query, cast as array
    $meta_query = (array) $query->get(\'meta_query\');

    // Convert \'type\' into an array of types
    $types = explode( \',\', $_GET[\'type\'] );

    // Ensure that types aren\'t empty
    if ( is_array( $types ) && ! empty( $types ) ) {

        // Build a meta query for this type
        $meta_query[] = array(
            \'key\'     => \'type\',
            \'value\'   => $types,
            \'compare\' => \'IN\',
        );

        // Update the meta query
        $query->set( \'meta_query\', $meta_query );
    } 

}
add_action( \'pre_get_posts\', \'wpse129223_custom_meta_query\' );
这要求查询字符串以逗号分隔,正如您在示例website中所示。com/随便什么/?类型=一、二、三。在您的代码示例中,您正在寻找一个管道字符,这就是@Foxsk8在其注释中的意思。

SO网友:Foxsk8

这是代码,它是有效的。

<?php
     $type = explode(\',\', $_GET[\'type\']);
     $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
     $myquery = new WP_Query(array(
     \'post_type\' => \'building\',
     \'meta_query\'=>array(
            array(
                \'key\' => \'type\',
                \'value\' => $type,
            ),

        )

    ));
    if ($myquery->have_posts()) :
    while ($myquery->have_posts()) : $myquery->the_post();
?>
<h1><?php the_title(); ?></h1>
<?php the_content(); ?>
<?php endwhile; endif; ?>

结束

相关推荐

通过URL发送多个自定义字段值 - 小码农CODE - 行之有效找到问题解决它

通过URL发送多个自定义字段值

时间:2014-01-10 作者:realph

基本上,我正在努力this tutorial 将操作添加到pre_get_posts 并创建一个自定义meta\\u查询,以便我可以在URL中更改查询,并显示婴儿、儿童和家庭书籍,如下所示:

http://website.com/books/?type=babies,children,home

我正在使用Advanced Custom Fields plugin 对于我的自定义字段,我的自定义字段称为“type”,并在WordPress中设置为复选框字段,因此它接受多个值。

就我个人而言,我不知道如何让它显示被查询的帖子。

function my_pre_get_posts( $query ) {
if( is_admin() ) { return; }

$meta_query = $query->get(\'meta_query\');
    if( !empty($_GET[\'type\']) ) {               
        $type = explode(\'|\', $_GET[\'type\']);    
        $meta_query[] = array(                          
            \'key\'       => \'type\',
            \'value\'     => $type,
            \'compare\'   => \'IN\',
        );
    }

$query->set(\'meta_query\', $meta_query); // update the meta query args
return; // always return
}
使用\'compare\' => \'LIKE\' 只返回随机帖子,使用IN 返回空白结果页。

不确定是否与我的$_GET[\'type\'] 参数,该参数应为字符串。

感谢您对解决此问题的任何帮助。我正在喝第五杯咖啡,今晚看起来不太好。

archive.book.php

$args = array(
\'post_type\'     => \'book\',
\'posts_per_page\'    => 10,
);

$wp_query = new WP_Query( $args );
while( $wp_query->have_posts() ) {

    $wp_query->the_post();
    get_template_part( \'content\', get_post_format() );
}
此正常循环:

<?php 
print_r( $wp_query->request );
if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();
        get_template_part( \'content\', get_post_format() );
    } // end while
} // end if
?>
输出:

SELECT SQL_CALC_FOUND_ROWS blISt3rs871o_posts.ID FROM blISt3rs871o_posts WHERE 1=1 AND blISt3rs871o_posts.post_type = \'book\' AND (blISt3rs871o_posts.post_status = \'publish\' OR blISt3rs871o_posts.post_status = \'private\') ORDER BY blISt3rs871o_posts.post_date DESC LIMIT 0, 10

2 个回复
SO网友:Brian Richards

首先,请记住pre_get_posts 是在WP运行的每个查询上运行的钩子,因此在使用它时要非常非常小心。这就是说,它绝对是您想要做的事情的最佳工具,当然比在页面模板中编写单独的自定义查询要好。

我在该函数的开头添加了一些附加条件,以确保在以下情况下尽早放弃该函数:不针对主循环、在管理页面上运行或不存在“type”查询字符串。您应该在此处添加更多条件以进一步限制它,例如:。if ( ! is_page( \'something\' ) ) { return; }if ( ! is_front_page() ) { return; }.

也就是说,下面是一些示例代码:

/**
 * Add custom meta filter to main query on any page.
 *
 * @since  1.0.0
 *
 * @param  object $query WP Query object.
 */
function wpse129223_custom_meta_query( $query ) {

    // If not on the main query, or on an admin page, bail here
    if ( ! $query->is_main_query() || is_admin() ) {
        return;
    }

    // If \'type\' isn\'t being passed as a query string, bail here
    if ( empty( $_GET[\'type\'] ) ) {
        return;
    }

    // Get the existing meta query, cast as array
    $meta_query = (array) $query->get(\'meta_query\');

    // Convert \'type\' into an array of types
    $types = explode( \',\', $_GET[\'type\'] );

    // Ensure that types aren\'t empty
    if ( is_array( $types ) && ! empty( $types ) ) {

        // Build a meta query for this type
        $meta_query[] = array(
            \'key\'     => \'type\',
            \'value\'   => $types,
            \'compare\' => \'IN\',
        );

        // Update the meta query
        $query->set( \'meta_query\', $meta_query );
    } 

}
add_action( \'pre_get_posts\', \'wpse129223_custom_meta_query\' );
这要求查询字符串以逗号分隔,正如您在示例website中所示。com/随便什么/?类型=一、二、三。在您的代码示例中,您正在寻找一个管道字符,这就是@Foxsk8在其注释中的意思。

SO网友:Foxsk8

这是代码,它是有效的。

<?php
     $type = explode(\',\', $_GET[\'type\']);
     $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1;
     $myquery = new WP_Query(array(
     \'post_type\' => \'building\',
     \'meta_query\'=>array(
            array(
                \'key\' => \'type\',
                \'value\' => $type,
            ),

        )

    ));
    if ($myquery->have_posts()) :
    while ($myquery->have_posts()) : $myquery->the_post();
?>
<h1><?php the_title(); ?></h1>
<?php the_content(); ?>
<?php endwhile; endif; ?>

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: