我试图禁用 Woocommerce 中的“商店”页面。基本上,我创建了一个商店主题来为摄影师出售打印和图像下载。
因为我需要创建私人画廊,所以我创建了一个自定义帖子类型,我使用 woocommerce 类别短代码来显示产品,然后我使用密码保护帖子类型。
这是密码保护 woocommerce 类别的一种解决方法(如果有人知道更好的类别,请解释)。
问题是有人去/shop 他们会购买所有产品,包括“受保护的产品”。所以我需要禁用商店页面,我需要在我的主题功能上以编程方式进行。有什么想法吗?
我试图禁用 Woocommerce 中的“商店”页面。基本上,我创建了一个商店主题来为摄影师出售打印和图像下载。
因为我需要创建私人画廊,所以我创建了一个自定义帖子类型,我使用 woocommerce 类别短代码来显示产品,然后我使用密码保护帖子类型。
这是密码保护 woocommerce 类别的一种解决方法(如果有人知道更好的类别,请解释)。
问题是有人去/shop 他们会购买所有产品,包括“受保护的产品”。所以我需要禁用商店页面,我需要在我的主题功能上以编程方式进行。有什么想法吗?
要禁用商店页面,请archive-product.php
从 复制文件/wp-content/plugins/woocommerce/templates/archive-product.php
并放入/wp-content/themes/{Your Theme}/woocommerce/archive-product.php
打开文件并使用以下代码覆盖文件中的所有内容:
<?php
global $wp_query;
$wp_query->set_404();
status_header(404);
get_template_part('404');
保存文件,现在您的 Shop 页面消失了,取而代之的是 404 页面!
将此添加到函数中:
function woocommerce_disable_shop_page() {
global $post;
if (is_shop()):
global $wp_query;
$wp_query->set_404();
status_header(404);
endif;
}
add_action( 'wp', 'woocommerce_disable_shop_page' );
WooCommerce 有一个用于创建产品帖子类型的数组的过滤器:woocommerce_register_post_type_product
。
您可以完全删除帖子类型的存档,而不是更改存档模板以强制其重定向,但has_archive
在创建时更改帖子类型的属性。
add_filter('woocommerce_register_post_type_product', function($post_type) {
$post_type['has_archive'] = false;
return $post_type;
});
然后,您应该通过转到WooCommerce » 设置 » 产品 » 显示,然后单击“商店页面”选项上的“x”来删除 CMS 中的商店页面。
您可能需要刷新永久链接缓存,只需单击“设置”»“永久链接”中的“更新”按钮即可。
*编辑 - 显然我在下面建议的页面设置不再有效。如果 WooCommerce 没有插件设置来更改它,我个人会使用像Redirection这样的 wordpress 重定向插件。这样,您可以自动将它们从不需要的商店页面重定向到显示您的产品的任何页面。它避免了 404 问题并保持一切正常。它还避免了编辑模板文件,这给非开发人员增加了复杂性。
老答案:
您是否尝试过 Woo 设置?
管理区域,左侧主菜单,Woocommerce > 设置单击页面选项卡。
在页面设置下是“商店基本页面”,在下拉列表中,右侧有一个小“x”。单击该按钮以摆脱该页面。
如果其他地方有需要修复的链接,请告诉我,我会找到钩子/过滤器来解决它。
template_redirect 是页面渲染之前的最后一个钩子,所以在我的用例中,我询问正在查看的页面是否是“商店”页面,如果是我重定向到(在我的情况下)定价页面。
function my__template_redirect(){
if(is_shop()){
wp_redirect(site_url() . '/pricing/', '302');
}
}
add_action('template_redirect', 'my__template_redirect');
最后一个建议不适用于 WP 4.6.1 和 WooCommerce 2.6.4。在“发布”选项卡中隐藏产品对我有用。
http://paperhedge.com/hide-products-from-displaying-in-shop-page-woocommerce/
你需要钩几个(或者更多)的东西:
/* hide category from shop pages */
add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
function custom_pre_get_posts_query( $q ) {
if ( ! $q->is_main_query() ) return;
if ( ! $q->is_post_type_archive() ) return;
if ( ! is_admin() ) {
$q->set( 'tax_query', array(array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( YOUR-CATEGORY-SLUG, YOUR-CATEGORY-SLUG-2 ), // Don't display products in the knives category on the shop page
'operator' => 'NOT IN'
)));
}
remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );
}
更改,显然是 YOUR-CATEGORY-SLUG, YOUR-CATEGORY-SLUG-2 让您的猫或猫从商店页面中隐藏。
然后,您也需要将它们从菜单中隐藏,对吗?:
/* hide category from menues */
add_filter( 'get_terms', 'get_subcategory_terms', 10, 3 );
function get_subcategory_terms( $terms, $taxonomies, $args ) {
$new_terms = array();
// if category and on the shop page (change it with is_woocommerce() if want to hide from all woo pages)
if ( in_array( 'product_cat', $taxonomies ) && ! is_admin() && is_shop() ) {
foreach ( $terms as $key => $term ) {
if ( ! in_array( $term->slug, array( YOUR-CATEGORY-SLUG, YOUR-CATEGORY-SLUG-2 ) ) ) {
$new_terms[] = $term;
}
}
$terms = $new_terms;
}
return $terms;
}
但我不认为这能 100% 解决问题,从那以后,搜索结果呢?
要禁用默认商店页面并为自定义页面保留 /shop/ slug ,请使用以下命令:
function remove_woocommerce_default_shop( $args, $post_type ) {
if (class_exists('WooCommerce')) {
if ( $post_type == "product" ) {
$args['has_archive'] = true;
}
return $args;
}
}
add_filter('register_post_type_args', 'remove_woocommerce_default_shop', 20, 2);
试试这个
这种方法对我来说很好