从简码 atts 数组值返回 WP_Query 个对象

Retun WP_Query objects from shortcode atts array values

寻找 return 在 name 中找到的每个事件(产品),其中 name 以逗号分隔,例如[woo_products_by_name name="shoe,shirt"] 如果我不 explode name 那么什么都不会 return 编辑因为只看到 shoe,shirt。如果使用 explode 则查询不是选择性的,并且似乎所有产品都是 returned。如果仅使用 'name' => $name 并且指定了上述的一节二乘积,则查询将按预期工作。想要 return 每个项目的匹配项,因此在此示例中,产品将 returned.

function woo_products_by_name_shortcode( $atts, $content = null ) {

        // Get attribuets
        extract(shortcode_atts(array(
        'name' => ''
        ), $atts));
        //$name = explode(",", $atts['name']);

        ob_start();
        // Define Query Arguments
        $loop = new  WP_Query( array(
                'post_type'      => 'product',
                'posts_per_page' => 10,
                'name'           => explode(",",$name)
        ));

        // Get products number
        $product_count = $loop->post_count;

        echo '<pre>'; print_r($loop->posts); echo '</pre>';
        return ob_get_clean();
}
add_shortcode("woo_products_by_name", "woo_products_by_name_shortcode");

理想情况下,您会在短代码中使用 id 或其他可查询属性,如果您这样做,查询会容易得多 - 但会破坏 get_by_name 方法。

您可能正在 运行 一个 foreach 循环中查看两个单独的查询,或者更好的是删除 WP_Query 并使用 get_page_by_path()

function woo_products_by_name_shortcode( $atts, $content = null ) {

    // Get attribuets
    extract(shortcode_atts(array(
    'name' => ''
    ), $atts));

    $name_array = explode(",", $atts['name']);

    ob_start();

    $products = array();
    foreach( $name_array as $product ){
        $products[$product] = get_page_by_path( $product, OBJECT, 'product' );
    }

    // Get products number
    $product_count = count( $name_array );

    echo '<pre>'; print_r($products); echo '</pre>';
    return ob_get_clean();
}
add_shortcode("woo_products_by_name", "woo_products_by_name_shortcode");

由于您提到需要使用 WP_Query,您将求助于通过使用 $wpdb class 和 sql 查询来获取 ID,然后使用这些 ID 运行 WP_Query - 或者您可以从 get_page_by_path 获取 ID 并使用 post__in 参数查询这些 ID(注意双下划线)

function woo_products_by_name_shortcode( $atts, $content = null ) {

    // Get attribuets
    extract(shortcode_atts(array(
        'name' => ''
    ), $atts));

    $name_array  = explode(",", $atts['name']);
    $product_ids = array();

    foreach( $name_array as $product ){
        $product = get_page_by_path( $product, OBJECT, 'product' );
        $product_ids[] = $product->ID;
    }

    ob_start();
    // Define Query Arguments
    $loop = new WP_Query( array(
        'post_type'      => 'product',
        'posts_per_page' => 10,
        'post__in'       => $product_ids
    ));

    // Get products number
    $product_count = $loop->post_count;

    echo '<pre>'; print_r($loop->posts); echo '</pre>';
    return ob_get_clean();
}
add_shortcode("woo_products_by_name", "woo_products_by_name_shortcode");

这可以使用非常简单的 SQL 请求来完成,该请求将为您的产品 slug 提供产品 ID。然后使用 WP_Query post__in 参数,你会得到你期望的:

function woo_products_by_name_shortcode( $atts, $content = null ) {

    // Get attribuets
    extract(shortcode_atts(array(
        'name' => ''
    ), $atts));

    if( empty($name) ) return;

    // Format product slugs string
    $name = str_replace(",", "','", $name);

    global $wpdb;
    // Get the corresponding products ids
    $ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->prefix}posts
        WHERE post_type = 'product' AND post_name IN('$name')" );

    ob_start();

    // Define Query Arguments
    $loop = new  WP_Query( array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post__in'       => $ids
    ));

    // Get products number
    $product_count = $loop->post_count;

    echo '<pre>'; print_r($loop->posts); echo '</pre>';

    return ob_get_clean();
}
add_shortcode("woo_products_by_name", "woo_products_by_name_shortcode");

代码进入您的活动子主题(或活动主题)的 function.php 文件。 已测试并有效。


html/php 中的测试输出:

<?php echo do_shortcode( "[woo_products_by_name name='shoe,shirt']" ); ?>

在 Wordpress 文本编辑器中测试输出:

[woo_products_by_name name='shoe,shirt']