首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >woocommerce过期产品定制post_status

woocommerce过期产品定制post_status
EN

Stack Overflow用户
提问于 2015-07-16 09:21:25
回答 1查看 2.2K关注 0票数 3

我扩展了产品post类型的woocommerce,使其具有一个名为“过期”的自定义post_status

所需的行为是将产品发布到商店,并将其设置为在一定时间跨度后过期。

只有已发布的产品在商店中是可见的,但是在post_status设置为过期后,产品的permalink应该仍然有效,但显示的是不同的模板。

Woocommerce本身只显示产品(在商店和单一产品视图中),默认情况下是“发布”post_status,所以我最初的想法是简单地连接到pre_get_posts并将‘过期’添加到post_status查询vars中。

一个小的补充是使用相同的弹格的文章,产品和网页。

http://example.com/page-name

http://example.com/post-name

http://example.com/product-name

为了完成所有这些,我提出了以下代码:

代码语言:javascript
复制
add_action(
    'pre_get_posts',
    'custom_pre_get_posts'
);

function custom_pre_get_posts($query) {
    global $wpdb;

    if( !is_admin() && $query->is_main_query() && $post_name = $query->get('name')) {

        $result = $wpdb->get_row(
            $wpdb->prepare(
                'SELECT post_type, ID, post_status FROM '.$wpdb->posts.' WHERE post_name = %s LIMIT 1',
                $post_name
            )
        );



        if(!empty($result) && $result->post_type == 'product'){
            $query->set('name', $post_name);
            $query->set('product', $post_name);
            $query->set('post_type', $result->post_type);
            $query->set('post_status', $result->post_status);               
        }


    }

}

只需手动检查具有给定名称的帖子是否存在以及它具有什么post_status。在此之后,相应地设置查询vars。

并包括过期产品的自定义模板:

代码语言:javascript
复制
add_filter( 
    'template_include', 
    'custom_expired_templates', 
    99 
);

function custom_expired_templates($template){

    global $wp_query;
    $status = $wp_query->get('post_status');
    $type = $wp_query->get('post_type');

    if($status === 'expired' && $type ==='product'){
        $template = locate_template( array( 'woocommerce/expired-single-product.php' ) );
    }

    return $template;
}

woocommerce/expired-single-product.php只是我的主题目录中woocmmerce/single-product.php的一个普通副本。

上面的代码有效..。但是这样做似乎有点麻烦,因为自定义模板会显示,但wordpress会发送404头,标题被设置为‘页面未找到’,所以我基本上是在覆盖404模板。

一个副作用是woocommerce样式和脚本不会加载。我真的试着深入了解woocommerce的文档,但是我无法隔离这个错误。

对完成期望行为的正确方法有什么建议吗?

更新

通过添加

代码语言:javascript
复制
add_action('the_posts','test_sql_request');

function test_sql_request($posts){
    echo $GLOBALS['wp_query']->request;
    var_dump($posts);
    return $posts;
}

过期产品具有SQL请求:

代码语言:javascript
复制
SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_name = 'expired-product' AND wp_posts.post_type = 'product' AND ((wp_posts.post_status = 'expired')) ORDER BY wp_posts.post_date DESC

但是它返回一个空数组。在phpmyadmin中运行确切的查询返回正确的post。对发布产品的查询看起来是相同的,除了post_status和名称(自我解释).但是返回数组中正确的post。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 13:33:51

好的,所以失败不是在上面发布的代码中,而是在post_status本身的注册过程中:

代码语言:javascript
复制
function my_custom_post_status(){

    register_post_status( 'expired', array(
        'label'                     => _x( 'expired', 'product' ),
        'public'                    => false,
        'exclude_from_search'       => true,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop( 'Expired <span class="count">(%s)</span>', 'Expired <span class="count">(%s)</span>' ),
    ) );
}

add_action( 'init', 'my_custom_post_status' );

有问题的是

代码语言:javascript
复制
 'public' => false

必须更改为

代码语言:javascript
复制
'public' => true

我不知道即使在查询ID时,公共属性也会影响查询。过期产品的ID为103,而$post = new WP_Query('p=103');不返回一个$post = get_post(103);返回正确帖子的帖子。

也许这能防止类似情况下的人将来头疼。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31450231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档