ACF|WooCommerce|主题开发|如何在定制的WooCommerce主页上包含使用ACF的/模板-部件/?

时间:2020-01-24 作者:Jason Is My Name

我正在开发一个新的主题,整个上午都在绞尽脑汁想为什么这个主题不起作用。请有人指导我如何将文件包含到WooCommerce主页。

据我所知,WooCommerce使用归档产品。php模板生成主页布局。我已将其复制到主题文件夹中,正如归档产品顶部文档中所述。php文件(以避免更新破坏我的存储)。

所以这个文件现在存储在这里:/theme name/woomerce/archive product。php。

如果我做一个简单的改变,比如键入“Hello World!”它会反映在页面重新加载上。

但是,如果我尝试包含一个使用高级自定义字段(ACF)的文件,它不会显示这些更改。

我已经对ACF进行了两次和三次检查。它们确实存在于网站上,并且填充了内容。

Please help me successfully make the include to the file, and pull through the appropriate pages data for the ACF\'s.

ARCHIVE-PRODUCT.PHP:

在测试一个简单的更改(例如添加短语“Hello World!”)时,我已将此代码放入模板中重新加载时会在页面上显示(当它是回显链接时-它看起来正确):

<?php
$heroslider = get_template_directory_uri() . "/template-parts/hero-slider.php";
echo $heroslider;
include_once($heroslider); ?>

HERO-SLIDER.PHP:

这段代码至少会显示“你好,世界!”,即使字段未填充。但它没有任何效果:

Hello World!

<?php
$has_hero_slider = get_field(\'has_hero_slider\');
if( $has_hero_slider === TRUE ): ?>

    <style>

    </style>

    <div class="hero-section">
<?php
$heroslider = get_template_directory_uri() . "/template-parts/hero-slider.php";
echo $heroslider;
include_once($heroslider); ?>
HERO-SLIDER.PHP:

Hello World!

<?php
$has_hero_slider = get_field(\'has_hero_slider\');
if( $has_hero_slider === TRUE ): ?>

    <style>

    </style>

    <div class="hero-section">

        <?php 
        $hero_slides = get_field(\'hero_slides\');
        if( $hero_slides != \'\' ): ?>

            <div id="hero-slider" class="hero-slider">

                <?php
                while( have_rows(\'hero_slides\') ): the_row();
                $hero_slide_title = get_sub_field(\'hero_slide_title\');
                $hero_slide_content = get_sub_field(\'hero_slide_content\'); 
                $hero_slide_button = get_sub_field(\'hero_slide_button\'); 
                $hero_slide_image = get_sub_field(\'hero_slide_image\'); ?>

                    <div class="hero-slide"<?php if($hero_slider_image != \'\') : ?> style="background-image:url(<?php echo $hero_slide_image; ?>);"<?php endif; ?>>

                        <?php
                        while( have_rows(\'hero_slide_title\') ): the_row();
                        $hero_slide_title_text = get_sub_field(\'hero_slide_title_text\');
                        $hero_slide_title_color = get_sub_field(\'hero_slide_title_color\'); ?>

                            <?php if($hero_slide_title_text != \'\') : ?>

                                <div class="hero-slide-title"<?php if($hero_slide_title_color != \'\') : ?> style="color:<?php echo $hero_slide_title_color; ?>;"<?php endif; ?>>
                                    <?php echo $hero_slide_title_text; ?>
                                </div>

                            <?php endif; ?>

                        <?php endwhile; ?>

                        <?php
                        while( have_rows(\'hero_slide_content\') ): the_row();
                        $hero_slide_content_text = get_sub_field(\'hero_slide_content_text\');
                        $hero_slide_content_color = get_sub_field(\'hero_slide_content_color\'); ?>

                            <?php if($hero_slide_content_text != \'\') : ?>

                                <div class="hero-slide-text"<?php if($hero_slide_content_color != \'\') : ?> style="color:<?php echo $hero_slide_content_color; ?>;"<?php endif; ?>>
                                    <?php echo $hero_slide_content_text; ?>
                                </div>

                            <?php endif; ?>

                        <?php endwhile; ?>

                        <?php
                        while( have_rows(\'hero_slide_button\') ): the_row();
                        $hero_slide_button_text = get_sub_field(\'hero_slide_button_text\');
                        $hero_slide_button_link = get_sub_field(\'hero_slide_button_link\');
                        $hero_slide_button_background_color = get_sub_field(\'hero_slide_button_background_color\');
                        $hero_slide_button_border_color = get_sub_field(\'hero_slide_button_border_color\');
                        $hero_slide_button_font_color = get_sub_field(\'hero_slide_button_font_color\'); ?>

                            <?php if($hero_slide_button_text != \'\') : ?>

                                <div class="hero-slide-button" style="<?php if($hero_slide_button_background_color != \'\') : ?>background-color:<?php echo $hero_slide_button_background_color; ?>;<?php endif; ?><?php if($hero_slide_button_border_color != \'\') : ?>border-color:<?php echo $hero_slide_button_border_color; ?>;<?php endif; ?><?php if($hero_slide_button_font_color != \'\') : ?>color:<?php echo $hero_slide_button_font_color; ?>;<?php endif; ?>">
                                    <?php if($hero_slide_button_link != \'\') : ?>
                                        <a href="<?php echo $hero_slide_button_link; ?>" class="box-link"></a>
                                    <?php endif; ?>
                                    <?php echo $hero_slide_content_text; ?>
                                </div>

                            <?php endif; ?>

                        <?php endwhile; ?>

                    </div>

                <?php endwhile; ?>

            </div>  

        <?php endif; ?>

    </div>

<?php endif; ?>
英雄滑块自定义字段的图像:

enter image description here

使用ACF的主页图像:

enter image description here

我的想法是(因为我对ACF的使用很有信心),主页不是WooCommerce的主页。然而,这也可能是一个愚蠢的想法,因为当我在主页上单击WP管理栏中的编辑页面时,它会给我一个要编辑的主页。

EDIT (SOLUTION): 必须使用要使用的字段指定页面ID:

<?php
if(is_shop()) {
    $id = woocommerce_get_page_id(\'shop\');
} else {
    $id = $post->ID;
}
$has_hero_slider = get_field(\'has_hero_slider\', $id);
if( $has_hero_slider === TRUE ): ?>

    <style>

    </style>

    <div class="hero-section">

        <?php 
        $hero_slides = get_field(\'hero_slides\', $id);
        if( $hero_slides != \'\' ): ?>

            <div id="hero-slider" class="hero-slider">

                <?php
                while( have_rows(\'hero_slides\', $id) ): the_row();
谢谢,杰森。

1 个回复
SO网友:Jacob Peattie

你不能include 通过URL创建模板文件get_template_directory_uri() 返回。您需要使用服务器文件路径get_theme_file_path():

$heroslider = get_theme_file_path( \'template-parts/hero-slider.php\' );
echo $heroslider;
include_once( $heroslider );
但是,如果要包含模板(而不是包含函数/类定义的文件),则应使用get_template_part() 要获得正确的路径并一次性将其包括在内(只需省去文件扩展名):

get_template_part( \'template-parts/hero-slider\' );