带自定义快捷码的WP查询

时间:2016-01-28 作者:nsilva

我的职能如下。php:-

/**
 * Shortcode: Latest Properties
 */

function latest_properties_func( $atts ) {

    $args = array(
        \'posts_per_page\'=> 5,
        \'post_type\'     => \'properties\',
        \'orderby\' => \'post_date\',
        \'order\' => \'DESC\',
    );
    $latest_query = new WP_Query( $args );

$latest_properties = \'\';

      if( $latest_query->have_posts() ):

            while( $latest_query->have_posts() ) : $latest_query->the_post();

                $latest_price = get_field(\'house_price\');

                $latest_properties .= \'<a href="\'.get_the_permalink().\'">\';
                $latest_properties .= \'<div class="featured-wrapper">\';
                $latest_properties .= \'<div class="col-md-5">\';
                $latest_properties .= get_the_post_thumbnail() . \'<br />\';
                $latest_properties .= \'</div>\';
                $latest_properties .= get_the_title() . \'<br />\';
                $latest_properties .= get_field(\'house_type\') . \'<br />\';
                $latest_properties .= \'£\' . number_format($latest_price) . \'<br />\';
                $latest_properties .= \'</div>\';
                $latest_properties .= \'</a>\';
                $latest_properties .= \'<div class="clearfix"></div>\';

            endwhile;

        endif; wp_reset_query();

 return $latest_properties;
}
add_shortcode( \'latest_properties\', \'latest_properties_func\' );
这显示了最新的属性http://website.dev/properties/ 然而,当我访问时http://website.dev/properties/?house_town=Leicester 它只显示house\\u town=Leicester的最新房产。

我意识到是我的搜索功能导致了这种情况,如下所示:-

// array of filters (field key => field name)
$GLOBALS[\'my_query_filters\'] = array( 
    \'field_1\'   => \'house_status\',
    \'field_2\'   => \'house_type\',
    \'field_3\'   => \'house_town\',
    \'field_4\'   => \'house_price\'
);

// action
add_action(\'pre_get_posts\', \'my_pre_get_posts\', 10, 1);

function my_pre_get_posts( $query ) {

    // bail early if is in admin
    if( is_admin() ) {

        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
        $value = explode(\',\', $_GET[ $name ]);

        // append meta query
        $meta_query[] = array(
            \'key\'       => $name,
            \'value\'     => $value,
            \'compare\'   => \'IN\',
        );

    } 

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

}
我的问题是,我如何将这两者结合起来,使它们彼此协同工作?

1 个回复
SO网友:Pieter Goosen

您的代码几乎没有问题

使用时WP_Query 与…结合the_post() 或使用get_posts() 与…结合setup_postdata( $post ), 您需要重置$post 具有全局wp_reset_postdata(), 不wp_reset_query(). wp_reset_query() 与连用query_posts() 你永远不应该使用它

您需要在endwhileendif 声明。如果您没有任何帖子,则无需重置$post 因为你从未改变过。

尽可能避免使用globals。全球化是邪恶的。WordPress已经把它弄得一团糟了。不要再弄脏全局空间。除了使用globals,网站上还有一些非常好的帖子。确保使用现场搜索功能

  • pre_get_posts 更改所有查询(前端和后端)。您将特别需要针对特定页面上的特定查询,以避免意外行为。如果只需要在搜索页面上以主查询为目标,则需要添加以下条件

    if (    !$query->is_main_query() // Bail if this is not the main query
         && !$query->is_search() // Bail if this is not the search page
    ) {
        return;
    }
    
    决不要使用来自表单输入或超全局的未初始化数据。这些都是黑客用来向网站注入恶意代码的热门场所。ALWAYS ALWAYS 根据预期的数据类型,清理、验证和/或转义任何用户提供的数据。甚至不要相信自己的意见。在URL或表单字段中插入一段简单的代码可以让黑客完全访问您的站点,这将危及您的整个站点。如果你在运行一个包含个人信息的网站,你可能会因为泄露个人信息而坐牢。所以求你了,ALWAYS SANITIZE, VALIDATE AND ESCAPE APPROPRIATELY