add_filter( 'woocommerce_has_block_template', '__return_true', 10, 0 ); } else { $queried_object = get_queried_object(); if ( is_null( $queried_object ) ) { return; } if ( isset( $queried_object->taxonomy ) && taxonomy_is_product_attribute( $queried_object->taxonomy ) && $this->block_template_is_available( ProductAttributeTemplate::SLUG ) ) { $templates = get_block_templates( array( 'slug__in' => array( ProductAttributeTemplate::SLUG ) ) ); if ( isset( $templates[0] ) && BlockTemplateUtils::template_has_legacy_template_block( $templates[0] ) ) { add_filter( 'woocommerce_disable_compatibility_layer', '__return_true' ); } if ( ! BlockTemplateUtils::theme_has_template( ProductAttributeTemplate::SLUG ) ) { add_filter( 'woocommerce_has_block_template', '__return_true', 10, 0 ); } } } } /** * Remove the template panel from the Sidebar of the Shop page because * the Site Editor handles it. * * @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues/6278 * * @param bool $is_support Whether the active theme supports block templates. * * @return bool */ public function remove_block_template_support_for_shop_page( $is_support ) { global $pagenow, $post; if ( is_admin() && 'post.php' === $pagenow && function_exists( 'wc_get_page_id' ) && is_a( $post, 'WP_Post' ) && wc_get_page_id( 'shop' ) === $post->ID ) { return false; } return $is_support; } /** * Update the product archive title to "Shop". * * @param string $post_type_name Post type 'name' label. * @param string $post_type Post type. * * @return string */ public function update_product_archive_title( $post_type_name, $post_type ) { if ( function_exists( 'is_shop' ) && is_shop() && 'product' === $post_type ) { return __( 'Shop', 'woocommerce' ); } return $post_type_name; } /** * Migrates page content to templates if needed. */ public function maybe_migrate_content() { if ( ! $this->has_migrated_page( 'cart' ) ) { $this->migrate_page( 'cart', CartTemplate::get_placeholder_page() ); } if ( ! $this->has_migrated_page( 'checkout' ) ) { $this->migrate_page( 'checkout', CheckoutTemplate::get_placeholder_page() ); } } /** * Check if a page has been migrated to a template. * * @param string $page_id Page ID. * @return boolean */ protected function has_migrated_page( $page_id ) { return (bool) get_option( 'has_migrated_' . $page_id, false ); } /** * Prepare default page template. * * @param \WP_Post $page Page object. * @return string */ protected function get_default_migrate_page_template( $page ) { $default_template_content = $this->get_block_template_part( 'header' ); $default_template_content .= '

' . wp_kses_post( $page->post_title ) . '

' . wp_kses_post( $page->post_content ) . '
'; $default_template_content .= $this->get_block_template_part( 'footer' ); return $default_template_content; } /** * Migrates a page to a template if needed. * * @param string $page_id Page ID. * @param \WP_Post $page Page object. */ protected function migrate_page( $page_id, $page ) { if ( ! $page || empty( $page->post_content ) ) { update_option( 'has_migrated_' . $page_id, '1' ); return; } // Use the page template if it exists, which we'll use over our default template if found. $existing_page_template = BlockTemplateUtils::get_block_template( get_stylesheet() . '//page', 'wp_template' ); if ( $existing_page_template && ! empty( $existing_page_template->content ) && strstr( $existing_page_template->content, 'wp:post-content' ) ) { // Massage the original content into something we can use. Replace post content with a group block. $pattern = '/()/'; $replacement = '
' . wp_kses_post( $page->post_content ) . '
'; $template_content = preg_replace( $pattern, $replacement, $existing_page_template->content ); } else { $template_content = $this->get_default_migrate_page_template( $page ); } $new_page_template = BlockTemplateUtils::get_block_template( 'woocommerce/woocommerce//' . $page_id, 'wp_template' ); // Check template validity--template must exist, and custom template must not be present already. if ( ! $new_page_template || $new_page_template->wp_id ) { update_option( 'has_migrated_' . $page_id, '1' ); return; } $new_page_template_id = wp_insert_post( [ 'post_name' => $new_page_template->slug, 'post_type' => 'wp_template', 'post_status' => 'publish', 'tax_input' => array( 'wp_theme' => $new_page_template->theme, ), 'meta_input' => array( 'origin' => $new_page_template->source, ), 'post_content' => $template_content, ], true ); if ( ! is_wp_error( $new_page_template_id ) ) { update_option( 'has_migrated_' . $page_id, '1' ); } } /** * Returns the requested template part. * * @param string $part The part to return. * * @return string */ protected function get_block_template_part( $part ) { $template_part = BlockTemplateUtils::get_block_template( get_stylesheet() . '//' . $part, 'wp_template_part' ); if ( ! $template_part || empty( $template_part->content ) ) { return ''; } return $template_part->content; } /** * Replaces page settings in WooCommerce with text based permalinks which point to a template. * * @param array $settings Settings pages. * @return array */ public function template_permalink_settings( $settings ) { foreach ( $settings as $key => $setting ) { if ( 'woocommerce_checkout_page_id' === $setting['id'] ) { $checkout_page = CheckoutTemplate::get_placeholder_page(); $settings[ $key ] = [ 'title' => __( 'Checkout page', 'woocommerce' ), 'desc' => sprintf( // translators: %1$s: opening anchor tag, %2$s: closing anchor tag. __( 'The checkout template can be %1$s edited here%2$s.', 'woocommerce' ), '', '' ), 'desc_tip' => __( 'This is the URL to the checkout page.', 'woocommerce' ), 'id' => 'woocommerce_checkout_page_endpoint', 'type' => 'permalink', 'default' => $checkout_page ? $checkout_page->post_name : CheckoutTemplate::get_slug(), 'autoload' => false, ]; } if ( 'woocommerce_cart_page_id' === $setting['id'] ) { $cart_page = CartTemplate::get_placeholder_page(); $settings[ $key ] = [ 'title' => __( 'Cart page', 'woocommerce' ), 'desc' => sprintf( // translators: %1$s: opening anchor tag, %2$s: closing anchor tag. __( 'The cart template can be %1$s edited here%2$s.', 'woocommerce' ), '', '' ), 'desc_tip' => __( 'This is the URL to the cart page.', 'woocommerce' ), 'id' => 'woocommerce_cart_page_endpoint', 'type' => 'permalink', 'default' => $cart_page ? $cart_page->post_name : CartTemplate::get_slug(), 'autoload' => false, ]; } } return $settings; } /** * Syncs entered permalink with the pages and returns the correct value. * * @param string $value Value of the option. * @param string $option Name of the option. * @return string */ public function update_template_permalink( $value, $option ) { if ( 'woocommerce_checkout_page_endpoint' === $option ) { return $this->sync_endpoint_with_page( CheckoutTemplate::get_placeholder_page(), 'checkout', $value ); } if ( 'woocommerce_cart_page_endpoint' === $option ) { return $this->sync_endpoint_with_page( CartTemplate::get_placeholder_page(), 'cart', $value ); } return $value; } /** * Syncs the provided permalink with the actual WP page. * * @param WP_Post|null $page The page object, or null if it does not exist. * @param string $page_slug The identifier for the page e.g. cart, checkout. * @param string $permalink The new permalink to use. * @return string THe actual permalink assigned to the page. May differ from $permalink if it was already taken. */ protected function sync_endpoint_with_page( $page, $page_slug, $permalink ) { if ( ! $page ) { $updated_page_id = wc_create_page( esc_sql( $permalink ), 'woocommerce_' . $page_slug . '_page_id', $page_slug, '', '', 'publish' ); } else { $updated_page_id = wp_update_post( [ 'ID' => $page->ID, 'post_name' => esc_sql( $permalink ), ] ); } // Get post again in case slug was updated with a suffix. if ( $updated_page_id && ! is_wp_error( $updated_page_id ) ) { return get_post( $updated_page_id )->post_name; } return $permalink; } }