WordPress:使用短码加载特定页面的功能

时间:2019-01-27 00:34:07

标签: php wordpress shortcode

我在WordPress中具有以下页面结构:

Materials //parent
-> Plastic //children
-> Metal //children
-> ...

我想在文件grid-fasads.php中包含内容,并在我需要的地方加上简码。

我在 product.php 中使用了简码:

$fasads = get_field('fasad_type');                                                          
foreach ($fasads as $f) {                            
     echo do_shortcode('[grid-fasad]');                            
} 

我在 functions.php 中编写了此函数:

function get_fasads($atts, $content = null ) {

   $my_wp_query = new WP_Query();
   $all_wp_pages = $my_wp_query->query( array( 'post_type' => 'page' ) );

   // get a specific page ID
   $materials =  get_page( 4702 );

   // filter for choosing a children pages of 'materials'
   $materials_children = get_page_children( $materials->ID, $all_wp_pages );

   foreach ( $materials_children as $children ) {
         $page = $children->ID;
         echo $page;
  }

  // It's ok. The pages IDs are shown.
  // After that I have this:

    $recent = new WP_Query( "page_id = " . $page );
    while( $recent->have_posts() ) : $recent->the_post();
        require( '/fasads/grid-fasads.php' );
        the_content();
    endwhile;        
} 

add_shortcode( 'grid-fasad','get_fasads' );

我知道问题是( "page_id = " . $page)。我需要为“材料”页面的每个子页面包括一个.php文件的内容。试图将代码的最后一部分插入循环,但是每次都失败。

这是来自

的片段

我也尝试过以下循环:

foreach ($materials_children as $children) {        
    $page = $children->ID;                 
    $recent = new WP_Query("page_id=".$page);
    while ($recent->have_posts()) : $recent->the_post();
        require('/fasads/grid-fasads.php');
        the_content();        
    endwhile;          
    print_r(array_count_values((array)$page));
}      

但是结果是显示值的重复。出了点问题。

请帮助。

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。

这是一个功能:

function get_pallette() {
$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page'));

// get a specific page ID
$materials =  get_page_by_title('Materials');                        
$materials_children = get_page_children( $materials->ID, $all_wp_pages );

if (isset ($materials_children)) :                             
    foreach ($materials_children as $children) {        
        $page = $children->ID;             
    }         
    $fasads = get_field('fasad_type');                                                                                      
    if (isset ($fasads)) :
        foreach ($fasads as $f) {
            $p = get_page_by_title( $f );                            
            if (!empty ($p)) :                                 
                echo do_shortcode("[grid-fasad page=\"$p->ID\"]");                     
            else : 
                //do something;
            endif;
        }
    else : 
        //do something;;
    endif;             
 endif; 
 //do something;
}

这是另一个用于生成简码的函数:

function get_fasads($atts, $content = null ){               

$atts = shortcode_atts(
    array(
        'page' => 0  
    ), $atts, 'grid-fasad');    
$recent = new WP_Query('page_id='. $atts['page']);
$path = $_SERVER['DOCUMENT_ROOT'].'/wp-content/themes/theme/fasads/grid-fasads.php';        
while ($recent->have_posts()) : $recent->the_post();
    require $path;                 
endwhile;         
}      

add_shortcode('grid-fasad','get_fasads');

商品的页面片段:

<?php if ( have_posts() ) while ( have_posts() ) : the_post(); global $_product; $_product = new jigoshop_product( $post->ID ); ?>
<div id="post-<?php $id_page ?>" <?php post_class(); ?>>            
<div class="summary">                                                                                      
    <?php  do_action('jigoshop_after_single_product_summary', $post, $_product); ?>  
    ...
    <?php get_pallette(); ?>                    
</div>  
 <?php endwhile; ?>

也许这不是一个明智的决定,但它确实有效。 仍然只有1个问题:执行函数get_pallette()后,页面松散了它自己的ID,因为我使用带有新的页面子ID的“ new WP_Query”。而且,如果此功能在动作“ jigoshop_after_single_product_summary”之前执行(如我所愿),则它将无法加载实际商品页面的内容。