Meta-value query

时间:2019-05-13 作者:Shaun21uk

有点长篇大论,但试图解释清楚:)

我正在钻研我的新主题的代码,不熟悉这种类型的数据存储/拉取-有人能帮我理解这里发生了什么吗,请:

我试图创建一个页面,只输出附有“优惠券”的帖子优惠券\'存储为帖子的meta\\u密钥。

它是meta_value 存储为如下数组(使用打印输出):

a: 7:{s:9:“突出显示”;s:14:“测试突出显示”;s:5:“标题”;s:12:“食品五折”;s:11:“描述”;s:16:“测试描述”;s:4:“代码”;s:7:“1524521”;s:11:“弹出图像”;s:4:“4548”;s:17:“弹出描述”;s:11:“重定向到”;s:0:;}

我希望自定义页面输出:

我可以通过运行wp\\u查询输出前三个:

$q = new WP_Query(array(
    \'post_type\' => \'listing\',
    \'posts_per_page\' => 5,
    \'meta_key\' => \'wc_coupon\',
    \'meta_value\' => \' \',
    \'meta_compare\' => \'!=\'
));
然而,我找不到一种方法meta_value 数组以显示每个帖子的单个元素。

主题以一种我不理解的方式处理这个问题,也许有人可以向我解释一下。

Coupon.php 是一个部分文件,在显示任何单个帖子时使用,如下所示:

global $post, $Args;
use ListingTools\\Framework\\Helpers\\GetSettings;

$aCoupon = GetSettings::getPostMeta($post->ID, \'coupon\');
if ( empty($aCoupon) || ( empty($aCoupon[\'code\']) && empty($aCoupon[\'redirect_to\']) ) ){
    return \'\';
}
?>

<div class="content-box_module__333d9">
    <div class="content-box_body__3tSRB">
        <?php echo do_shortcode(\'[get_coupon highlight="\'.esc_attr($aCoupon[\'highlight\']).\'" title="\'.esc_attr($aCoupon[\'title\']).\'" description="\'.esc_attr($aCoupon[\'description\']).\'" code="\'.esc_attr($aCoupon[\'code\']).\'" redirect_to="\'.esc_attr($aCoupon[\'redirect_to\']).\'"]\'); ?>
    </div>
</div>
所以我不明白变量部分顶部的“使用”代码是如何工作的。

我也不明白$aCoupon = GetSettings::getPostMeta($post->ID, \'coupon\'); 正在运行,但他们可以使用此选项来显示优惠券数组的各个部分,如代码后面所示:

echo do_shortcode(\'[get_coupon highlight="\'.esc_attr($aCoupon[\'highlight\'])
希望这是可以遵循的:)

提前谢谢。

2 个回复
最合适的回答,由SO网友:Warwick 整理而成

正在使用输出的字符串print_r() 是称为序列化字符串的内容。当WordPress在1个自定义字段中存储一个值数组时,它会使用一个名为serialize()

你想做的是unserialize 字符串,然后可以访问数组中的每个“关联索引”。

通常get_post_meta() 为您取消序列化字符串,但它看起来像自定义函数GetSettings::getPostMeta() 没有。在这种情况下,我们可以运行maybe_unserialize() 如果能够,它将转换为可用的数组。

然后我们可以简单地在数组中循环,输出所需的内容。

$aCoupon = GetSettings::getPostMeta($post->ID, \'coupon\');
$aCoupon = maybe_unserialze( $aCoupon );
if ( empty( $aCoupon ) ){
    foreach ( $aCoupon as $key => $value ) {
        echo \'<div><span class="label">\' . $key . \'</span> \' . $value . \'</div>\';
    }
}
根据您的示例,它将输出如下内容。

<div><span class="label">highlight</span> Test Highlight</div>
<div><span class="label">title</span> 50% off food</div>
<div><span class="label">description</span> Test description</div>
<div><span class="label">code</span> 1524521</div>
<div><span class="label">popup_image</span> 4548</div>
<div><span class="label">popup_description</span> Popup description</div>
<div><span class="label">redirect_to</span> </div>
或者,如果要直接访问1个值。

$aCoupon = GetSettings::getPostMeta($post->ID, \'coupon\');
$aCoupon = maybe_unserialze( $aCoupon );
if ( empty( $aCoupon ) ){
    //If the title is set, and is not empty, output it.
    if ( isset( $aCoupon[\'title\'] ) && \'\' !== $aCoupon[\'title\'] ) {
        echo \'<div><span class="label">Title</span> \' . $aCoupon[\'title\'] . \'</div>\';
    }
}
@Shaun21uk编辑-我做了一些小改动(下面是完整代码)。不管什么原因$aCoupon = GetSettings::getPostMeta($coupon_id, \'coupon\'); 我仍然想知道如何利用主题处理数据的方式。

您的短代码函数应该如下所示:

add_shortcode( \'qg_shortcode\', \'qg_shortcode\' );
function qg_shortcode() {

    $q = new WP_Query(array(
        \'post_type\' => \'listing\',
        \'posts_per_page\' => 5,
        \'meta_key\' => \'wc_coupon\',
        \'meta_value\' => \' \',
        \'meta_compare\' => \'!=\'
    ));

    if ( $q->have_posts() ) :
        while ( $q->have_posts() ) : $q->the_post();

            echo \'<h2 class="text-center"><a href="\' . get_permalink() . \'">\';
                the_title();
            echo \'</a></h2>\';

            the_content();

            // Get the ID of the attached coupon.
            $coupon_id = get_post_meta( get_the_ID(), \'wc_coupon\', true );

            // Get the coupon details from the coupon using the coupons ID.
        $aCoupon = maybe_unserialize( $coupon_id );

            // This checks if the coupon details are NOT empty, if that is true, then output the info.
            if ( ! empty( $aCoupon ) ) {

                // If the title is set, and is not empty, output it.
                if ( isset( $aCoupon[\'title\'] ) && \'\' !== $aCoupon[\'title\'] ) {
                    echo \'<div><span class="label">Title</span> \' . $aCoupon[\'title\'] . \'</div>\';
                }
            }

            echo\'<div class="offer-button">\';
            echo\'<a href="\' . get_permalink() . \'" class="offer-button-text">Claim this offer!</a>\';
            echo\'</div>\';
        endwhile;
        wp_reset_postdata();
    endif;
}

SO网友:Shaun21uk

沃里克,非常感谢你抽出时间来处理这件事。

我的完整代码现在如下所示:

add_shortcode( \'qg_shortcode\', \'qg_shortcode\' );
function qg_shortcode() {

    $q = new WP_Query(array(
        \'post_type\' => \'listing\',
        \'posts_per_page\' => 5,
        \'meta_key\' => \'wc_coupon\',
        \'meta_value\' => \' \',
        \'meta_compare\' => \'!=\'
    ));
    if ( $q->have_posts() ) :
        while ( $q->have_posts() ) : $q->the_post();

            echo \'<h2 class="text-center"><a href="\' . get_permalink() . \'">\';
                the_title();
            echo \'</a></h2>\';

            the_content();

            $aCoupon = GetSettings::getPostMeta( get_the_ID(), \'wc_coupon\');
            $aCoupon = maybe_unserialze( $aCoupon );

            if ( ! empty( $aCoupon ) ){
                //If the title is set, and is not empty, output it.
                if ( isset( $aCoupon[\'title\'] ) && \'\' !== $aCoupon[\'title\'] ) {
                    echo \'<div><span class="label">Title</span> \' . $aCoupon[\'title\'] . \'</div>\';
                }
            }

            echo\'<div class="offer-button">\';
            echo\'<a href="\' . get_permalink() . \'" class="offer-button-text">Claim this offer!</a>\';
            echo\'</div>\';
        endwhile;
        wp_reset_postdata();
    endif;
}
这现在只输出一个帖子,似乎没有循环。在我添加代码之前,它成功地显示了包含优惠券的两篇(全部)帖子的标题和链接。不过,它展示的一件物品确实有优惠券

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post