2017-03-30 34 views
8

Używam zaawansowanych pól niestandardowych (ACF) do pobierania informacji o przemienniku ze strony zdarzeń i wyświetlania skróconej listy zdarzeń na stronie głównej.Zaawansowane pola niestandardowe wyświetlają ostatnie trzy wiersze ponizszego przemiennika

Skonfigurowałem repeater, aby umożliwić użytkownikowi wpisanie, w którym miesiącu odbędzie się wydarzenie (Pozwalając im na umieszczenie wielu miesięcy zdarzeń), a następnie sub-repeater, aby umożliwić im dodawanie wielu zdarzeń dla dany miesiąc. Przykład poniżej:

marca

  • wydarzenie 09 marca
  • 12 marca wydarzenie
  • marca wydarzenie 28-ty

kwietnia

  • 01 kwietnia wydarzenie
  • 28. wydarzenie

To jest bieżące wyjście na stronie zdarzeń i działa zgodnie z przeznaczeniem.

Na stronie głównej serwisu muszę pobrać 3 najnowsze (zdarzenie znajdujące się na dole listy jest wydarzenie najnowsze) i wyświetlić je na stronie głównej.

Nie mam problemu z ciągnięciem i wyświetlaniem zdarzeń na stronie głównej. To, z czym mam problem, polega na wyświetlaniu zdarzeń, gdy ostatnie trzy zdarzenia (repeater dziecka) przekraczają miesiące (repeater macierzysty).

Po prostu ograniczenie wyjścia zdarzeń za pomocą pętli php w instrukcjach if, while ogranicza liczbę zdarzeń wyjściowych w danym miesiącu. Mój kod, którego aktualnie używam na stronie głównej, znajduje się poniżej.

<?php if(have_rows('event_month', 1263)): ?> 
<ul> 
    <?php while (have_rows('event_month', 1263)) : the_row(); ?> 
     <?php if(have_rows('event', 1263)):; ?> 
      <?php while (have_rows('event', 1263)) : the_row(); ?> 
       <li> 
        <h3> 
         <a href="<?php echo esc_url(home_url('/')); ?>events/"><?php $summary = get_sub_field('event_title'); 
          echo substr($summary, 0, 34),'...'; ?></a> 
          <span><?php the_sub_field('event_day_of_week');?>, <?php the_sub_field('event_sub_month');?> <?php the_sub_field('event_day');?></span> 
        </h3> 
       </li> 
      <?php endwhile; ?> 
     <?php else: ?> 
      <p>Show dates to be announced soon.</p><?php the_sub_field('event_title'); ?> 
     <?php endif; ?> 
    <?php endwhile; ?> 
</ul> 

Co mój sygnał wyjściowy na stronie głównej będzie wyglądać, jeśli uchwycić trzy ostatnie zdarzenia:

  • wydarzenie 28 marca
  • 01 kwietnia wydarzenie
  • kwietnia wydarzenie 28-ga
+0

Każdy powód, aby nie używać pojedynczego wzmacniacza z polem wprowadzania daty? Następnie możesz wyodrębnić z niego miesiąc, aby ładnie zagrać z kodem w innym miejscu na stronie, co sprawi, że posortowanie najnowszych wpisów na stronie głównej będzie bardzo proste. – Leland

+0

@ Landeland - doceniam, że pytasz, ponieważ jest to coś, czego nie brałem pod uwagę. Oto link do strony wyświetlającej wydarzenia z każdego miesiąca. http://ardentsolutionsllc.com/events/ Gdybym używał tylko jednego przemiennika, nie wiedziałbym, jak powiązać zdarzenia z każdym miesiącem. Strona główna pokazuje listę wydarzeń (u dołu po prawej), które próbuję skrócić, aby wyświetlić tylko 3 ostatnie wydarzenia, które zwykle pojawiają się u dołu każdego miesiąca na stronie wydarzeń. –

+0

Dobra, ponownie czytam twój post - chcesz, na stronie głównej, 3 ostatnio dodane * wydarzenia? Czy chcesz na stronie głównej 3 zdarzenia, które zostały ostatnio utworzone przez administratora WordPressa? Czy wolałbyś, aby 3 wydarzenia, które mają miejsce najwcześniej do dzisiaj? – Leland

Odpowiedz

0

To nie może być odpowiedź, że każdy szukał na ten jeden, ale tutaj To, co zrobiłem jako obejście, które działało wystarczająco dobrze dla mnie.

Skończyło się rozwiązywanie problemu poza php, przy użyciu css, aby wybrać trzy ostatnie elementy listy. Oto, co użyłem, zadziałało świetnie.

.connect-list-wrapper ul li 
{ 
    display: none; 
} 
.connect-list-wrapper ul li:nth-last-child(-n+3) 
{ 
    display: block; 
} 
1

Prawdopodobnie powinieneś używać for zamiast while. I rozważmy następujący algorytm:

1) uzyskać last row from event_month

2) Policzyć liczbę zdarzeń w danym miesiącu

3) Jeżeli liczba zdarzeń jest większa lub równa 3.

    3.1) Get 3 ostatnie wydarzenia i wyświetlać je

4) Else policzyć liczbę zdarzeń remaing (3-<<events in last month>>)

    4,1) A teraz przedostatni wiersz i powtórz kroki 2,3,4

Więc stosując powyższą logiką Twój kod powinien wyglądać mniej więcej tak:

<?php 

function getEvents($rows, $noOfEvents){ 
    $resultArray = array(); 
    if($rows && count($rows > 0)) { 
     $events = $rows[count($rows)-1]['event']; 
     $events = is_array($events) ? $events : array(); 
     $eventCount = count($events); 
     if($eventCount < $noOfEvents){ 
      $noOfOtherEvents = $noOfEvents-$eventCount; 
      array_pop($rows); 
      $iterate = getEvents($rows,$noOfOtherEvents); 
      $resultArray = array_merge($events,$iterate);  
     } 
     else{ 
      $resultArray = array_slice($rows, 0-$eventCount, $eventCount); 
     } 
     return $resultArray; 
} 

$rows = get_field('event_month', 1263); 
if($rows) { 
    $requiredEvents = getEvents($rows,3);  //3 or how many ever last you want 
    foreach($requiredEvents as $event){ 
     var_dump($event); //this should have all you need like $event['event_title'],$event['event_day'],ect... 
    } 
} 
+0

Dzięki za odpowiedź. Próbowałem wprowadzić twój kod do witryny, ale złamał on stronę, stwierdzając, że $ requiredEvents => $ event powoduje błąd składniowy "nieoczekiwany" => "(T_DOUBLE_ARROW)". Nie znam wystarczająco dobrze PHP, aby rozwiązać ten problem. Mógłbym się w to zagłębić, ale pomyślałem, że będziesz w stanie udzielić dodatkowej porady. –

+0

@GordonSmith, który był literówką '=>' powinien być 'jak" odnoszą się do edycji! I musisz poprawić swoje umiejętności php! –

+0

Dzięki za edycję. Zgadzam się i nadal poprawiam się codziennie. Dam ci ten strzał i zgłoś się. –