php 如何在WP循环中调用外部函数并获取“下一个”项,但针对特定的插件

z5btuh9x  于 2023-02-18  发布在  PHP
关注(0)|答案(1)|浏览(111)

在我的WordPress子主题工作区,我正试图学习如何优化我的代码下面,以更有效地在其PHP过程中。我有10个图像,我的工作总量。**我希望任何数量的这些图像被调用到不同的网页上的鼻涕虫。**我知道在PHP中如何从一个函数返回一次,但我怎么说在PHP中...

  • “我希望照片1、2、6转到slugA”
  • “我希望照片2、3、5、9转到slugB”
  • “我希望照片1、7转到slugC”
  • 等等。

这是我目前掌握的情况

//DEFINING ALL MY PHOTOS AND RETURNING THEM

function my_post_photos (
  $mQuery = 1,
  $image01 = "filler_01.jpg",
  $image02 = "filler_02.jpg",
  $image03 = "filler_03.jpg",
  $image04 = "filler_04.jpg",
  $image05 = "filler_05.jpg",
  $image06 = "filler_06.jpg",
  $image07 = "filler_07.jpg",
  $image08 = "filler_08.jpg",
  $image09 = "filler_09.jpg",
  $image10 = "filler_10.jpg"
  ): string
{
  $vars = get_defined_vars();
  foreach ($vars as $key => $value) {
    $placeholders[] = get_stylesheet_directory_uri() . '/dist/images/' . $value;
  }

  return $placeholders[$mQuery];
}

//FURTHER DOWN THIS SAME PAGE...WITHIN MY WP LOOP, CALLING THEM

<?php 
$query = new WP_Query($args);
if ($query->have_posts()) :
   //WITH THE BELOW $i, I AM FULLY AWARE THAT THE NUMBER OF PHOTOS LOADS IS DEPENDENT ON HOW MANY TIMES MY LOOP CYCLES.  I'M COOL WITH THAT BECAUSE I'M EVENTUALLY GOING TO HAVE MORE PHOTOS THAN POSTS.
   $i=1;
     while ($query->have_posts()) : $query->the_post(); 
       $current_page = sanitize_post($GLOBALS['wp_the_query']->get_queried_object());
       $slug = $current_page->post_name;
  ?>
  
  <?php
    if ($slug == "slugA") {
    ?>
      <div>
        <h6>
          <!-- //THIS FUNCTION LOADS EACH PHOTO PERFECTLY FINE, BUT HOW CAN I ONLY RETURN PHOTOS 1, 2, 6 HERE? -->
          <img src="<?php echo my_career_placeholder($i); ?>" border="0" alt="">
        </h6>
       </div>
       <?php
       } elseif ($slug = "slugB") {
         //HOW CAN I RETURN ONLY PHOTOS 2, 3, 5, 9 HERE?
       } elseif ($slug = "slugC") {
         //HOW CAN I RETURN ONLY PHOTOS 1, 7 HERE?
       }
       ?>
      <?php 
        $i++;
        endif;
        endwhile; 
        endif;
        wp_reset_postdata();
  ?>
q3qa4bjr

q3qa4bjr1#

从代码整体来看,我认为main函数可以重写如下:

function my_post_photos(...$indexes): array
{
    $pathPrefix = get_stylesheet_directory_uri().'/dist/images/';

    $placeholders = [
        $pathPrefix.'filler_01.jpg',
        $pathPrefix.'filler_02.jpg',
        $pathPrefix.'filler_03.jpg',
        $pathPrefix.'filler_04.jpg',
        $pathPrefix.'filler_05.jpg',
        $pathPrefix.'filler_06.jpg',
        $pathPrefix.'filler_07.jpg',
        $pathPrefix.'filler_08.jpg',
        $pathPrefix.'filler_09.jpg',
        $pathPrefix.'filler_10.jpg',
    ];

    $ret = [];
    foreach ($indexes as $index) {
        if (isset($placeholders[$index])) {
            $ret[] = $placeholders[$index];
        }
    }

    return $ret;
}

这将允许您调用它,并通过执行my_post_photos(3,5)传入所需数量的索引,my_post_photos(3,5)将返回一个可以循环的数组。
此处演示:https://3v4l.org/8aq6d
如果您真的以这种一致的方式命名映像,还可以进行其他优化,但我现在只是简单介绍一下。

编辑

根据您的评论,我认为您希望在循环中调用函数并获得“下一个”项,但针对特定的鼻涕虫。
如果这是正确的,一种方法是创建第二个数组,将slugsMap到图像索引,然后您可以将static与该数组一起使用,这意味着随后对该函数的调用将不会重新创建该数组,而是使用第一个数组。你可以使用array_shift,它从数组中获取第一个元素,然后从数组中移除索引。(如果我理解正确的话,array_shift函数被认为对于大型数组来说是没有性能的,但是我认为您在这里根本不会注意到这一点。)
下面的代码将返回一个字符串(或null),并且可以用一个known-slug重复调用以获得“next”条目。如果你的帖子比图片多,你可以把“next”附加到数组的末尾,这样你也可以得到一个循环池。

function my_post_photos(string $slug): ?string
{
    $pathPrefix = get_stylesheet_directory_uri().'/dist/images/';

    $placeholders = [
        $pathPrefix.'filler_01.jpg',
        $pathPrefix.'filler_02.jpg',
        $pathPrefix.'filler_03.jpg',
        $pathPrefix.'filler_04.jpg',
        $pathPrefix.'filler_05.jpg',
        $pathPrefix.'filler_06.jpg',
        $pathPrefix.'filler_07.jpg',
        $pathPrefix.'filler_08.jpg',
        $pathPrefix.'filler_09.jpg',
        $pathPrefix.'filler_10.jpg',
    ];
    
    // Mapping of slugs to placeholders
    // NOTE: This array is created static so that it only ever
    // gets created once in the lifetime of the PHP request
    static $slugToPlaceholders = [
        'slugA' => [1, 2, 6],
        'slugB' => [2, 3, 5, 9],
        'slugC' => [1, 7],
    ];
    
    // Unknown slug, return null
    if(!isset($slugToPlaceholders[$slug])){
        return null;
    }
    
    // Grab the next unused index, and remove it from the array
    $nextIndex = array_shift($slugToPlaceholders[$slug]);
    
    // Return either the image or nothing if we're out of indexes
    return $placeholders[$nextIndex] ?? null;
}

演示:https://3v4l.org/JDKOH

相关问题