Intereting Posts
Меню fallback «menu_class» создает «div» вместо «ul», сохранение пользовательской таксономии в качестве заголовка показать 10 последних пользовательских типов сообщений, исключая одно (ие) из конкретной пользовательской таксономии Повторение функции внутри функции WordPress 3.2 нарушил мой код TinyMCE Мой пост не отображается Изображение, вставленное в сообщение, не отображающееся в «Галерее», Создайте таблицу с плагином плагина wordpress Отправлять автоматическую почту администратору, когда пользователь / член изменяет / добавляет профиль Есть ли способ изменить структуру папок uploads? Как изменить ярлык «Все категории» в панели моего пользовательского типа сообщений? Редактирование изображения кнопки радиостанции WordPress Получение метаданных дополнительных сообщений? Показать все теги сообщений на пост edit screen / sidebox Убедитесь, что на другой странице есть прикрепленные изображения

Как повторять цикл foreach в Magic Fields Group?

Хорошо, поэтому я использую Magic Fields 2 в старом проекте WordPress (а не в ACF, к сожалению), и у меня возникает некоторая путаница, когда я пишу PHP.

В основном я на шаблоне страницы, который вызывает группу Magic Fields из его идентификатора сообщения, потому что сами поля находятся в настраиваемом типе сообщений. Они просто отображаются на шаблоне страницы.

Затем я перебираю поля этой группы, чтобы получить значение ID, которое просто выбирает другую запись с полем « Тип связанного шрифта Magic Field».

Теперь вот моя проблема после использования var_dump для отладки – вместо того, чтобы дать мне значение ID для EACH post, выбранного с соответствующим типом (в настоящее время два) – он повторяет первый идентификатор дважды.

Это для меня вопрос PHP по сравнению с Magic Fields. Итак, как мне получить значение EACH ID в существующем foreach, не прибегая к другому foreach? Мне нужно захватить каждый идентификатор, а затем использовать эти идентификаторы в продолжении PHP после. Вот что я имею:

$chall_entries = get_group('challenge_entry', $post_id = 4643); foreach($chall_entries as $art_entry): //artisan challenges only if( $art_entry['challenge_entry_challenge_type'][1] == 'Artisan' ): global $task_post_id; $task_post_id = intval($art_entry['challenge_entry_assign_task'][1]); echo $task_post_id; //THIS IS REPEATING THE SAME ID TWICE - WHY? //HOW DO I GET EACH ID AND ITERATE THEM FROM THE MAGIC FIELDS //WITHOUT USING YET ANOTHER FOR EACH? endif; endforeach; 

Чтобы дать представление о том, как Magic Fields настроены на панели инструментов, они выглядят так:

 Custom Post Type w/ MFs Repeating Group of Fields (there are two groups right now) Fields within each group 

Итак, если есть две группы, вот как это происходит сейчас:

 Custom Post Type w/ MFs Group A Group A Fields Group B Group B Fields 

Таким образом, проблема в том, что поле группы А повторяется в сравнении с циклом, чтобы также получить группу B во второй раз …


ОБНОВЛЕНИЕ КОДА № 1 – 7/6/2015

Чтобы уточнить, цель состоит в том, чтобы пропустить две отдельные группы MF. У одной группы есть идентификатор, который мне нужен для второй группы. Этот идентификатор является параметром, необходимым для создания цикла второй группы, за исключением того, что мне нужно, чтобы ID был динамическим, а не жестко закодированным, следовательно, PHP первой группы. Вот код для «второй группы», если он помогает:

 $artisan_chall_task = get_group('task_entry', $post_id=$task_post_id); //SEE THE ID HERE? foreach($artisan_chall_task as $art_chall_task): $task_ach_id = intval($art_chall_task['task_entry_achievement_id'][1]); //achievement ID $task_ach_link = get_the_permalink($task_ach_id); //achievement link echo "<tr>"; echo "<td class='mobile-first'>" . $art_chall_task['task_entry_task_name'][1] . "</td>"; echo "<td class='mobile-second'>" . $art_chall_task['task_entry_task_desc'][1] . "</td>"; echo "<td class='mobile-third'><div class='" . $art_chall_task['task_entry_task_difficulty'][1] . "-stars margin-auto'></div></td>"; echo "<td class='mobile-fourth'><a href='" . $task_ach_link . "'>" . get_the_post_thumbnail( $task_ach_id, 'thumbnail' ) . "</a></td>"; echo "</tr>"; endforeach; 

Проблемы, которые я имею до сих пор с помощью советов WebToure:

Я получаю 1 из переменной $ length с var_dump, но в этом массиве есть два элемента, если я var_dump ($ art_entry ['challenge_entry_assign_task']); Это дает мне:

  array(1) { [1]=&gt; string(4) "4644" } array(1) { [1]=&gt; string(4) "4652" } 

И поэтому цикл for с длиной $ дает мне эту ошибку:

 Undefined offset: 0 

Мне также нужно передать переменную ID из первой группы, за пределами первой группы, которая будет использоваться в качестве параметра для запуска второй группы – если не использовать глобальную, то как же я это делаю?


ОБНОВЛЕНИЕ КОДА № 2 – 7/6/2015

Я использую решение функции из WebToure. Это в шаблоне:

 foreach($chall_entries as $art_entry): //artisan challenges only if( $art_entry['challenge_entry_challenge_type'][1] == 'Artisan' ): $task_post_id = intval($art_entry['challenge_entry_assign_task'][1]); //I GET MORE THAN ONE ID HERE IF I VAR_DUMP $task_post_id endif; endforeach; //OUT HERE THOUGH VAR_DUMP $task_post_id ONLY GIVES ME FIRST ID? //I WANT THE SECOND GROUP'S LOOPING HERE //AND EACH ID GRABBED FROM THE FIRST GROUP WITHOUT BEING IN THAT FOREACH print_task_entry( $task_post_id ); 

И это в functions.php:

 function print_task_entry( $post_id ) { $artisan_chall_task = get_group( 'task_entry', $post_id ); // Passing the $post_id foreach($artisan_chall_task as $art_chall_task): $task_ach_id = intval($art_chall_task['task_entry_achievement_id'][1]); //achievement ID $task_ach_link = get_the_permalink($task_ach_id); //achievement link echo "<tr>"; echo "<td class='mobile-first'>" . $art_chall_task['task_entry_task_name'][1] . "</td>"; echo "<td class='mobile-second'>" . $art_chall_task['task_entry_task_desc'][1] . "</td>"; echo "<td class='mobile-third'><div class='" . $art_chall_task['task_entry_task_difficulty'][1] . "-stars margin-auto'></div></td>"; echo "<td class='mobile-fourth'><a href='" . $task_ach_link . "'>" . get_the_post_thumbnail( $task_ach_id, 'thumbnail' ) . "</a></td>"; echo "</tr>"; endforeach; 

}


Окончательное рабочее решение – 7/7/2015:

Похоже, проблема заключалась в том, что смесь PHP с решением WebToure была хорошей, и у меня был модальный плагин. Таким образом, казалось, что все результаты печатались в одном модальном и все сразу, а у каждого из них были свои собственные модалы. Мне просто нужно было убедиться, что каждый результат имеет свой собственный модальный класс Counter, созданный с помощью PHP. В конце концов, это был конечный результат (без модального кода или счетчика).

В файле шаблона:

 $chall_entries = get_group('challenge_entry', $post_id = 4643); foreach($chall_entries as $art_entry): //artisan challenges only if( $art_entry['challenge_entry_challenge_type'][1] == 'Artisan' ): $task_post_id = intval($art_entry['challenge_entry_assign_task'][1]); print_task_entry( $task_post_id ); endif; endforeach; 

В Functions.php:

 function print_task_entry( $post_id ) { $artisan_chall_task = get_group( 'task_entry', $post_id ); // Passing the $post_id foreach($artisan_chall_task as $art_chall_task): $task_ach_id = intval($art_chall_task['task_entry_achievement_id'][1]); //achievement ID $task_ach_link = get_the_permalink($task_ach_id); //achievement link echo "<tr>"; echo "<td class='mobile-first'>" . $art_chall_task['task_entry_task_name'][1] . "</td>"; echo "<td class='mobile-second'>" . $art_chall_task['task_entry_task_desc'][1] . "</td>"; echo "<td class='mobile-third'><div class='" . $art_chall_task['task_entry_task_difficulty'][1] . "-stars margin-auto'></div></td>"; echo "<td class='mobile-fourth'><a href='" . $task_ach_link . "'>" . get_the_post_thumbnail( $task_ach_id, 'thumbnail' ) . "</a></td>"; echo "</tr>"; endforeach; 

}

Благодаря WebToure! 🙂

Обновление # 2: используйте мой первый вариант, чтобы получить все идентификаторы в массиве, а затем пропустить их. Я продолжаю пытаться понять, как / что именно вы пытаетесь достичь (используйте одну и ту же переменную для хранения идентификатора и каким-то образом выполните асинхронную операцию под первым блоком кода, который предназначен для «одной группы» ?!), и я могу только прийти к выводу, что у вас есть некоторые глубокие недоразумения о том, как работает PHP.

Тем не менее, я могу понять, что вы хотите все идентификаторы, а затем итерации через них, и в этом случае мой первый предложенный вариант – именно то , что вам нужно.

 $post_ids = array(); foreach ( $chall_entries as $art_entry ): //artisan challenges only if ( $art_entry['challenge_entry_challenge_type'][1] == 'Artisan' ): // I have NO IDEA what you mean about: // "Because then Group Loop 1 will repeat for each Group Loop 1 and I don't want that to happen" $post_ids[] = (int)$art_entry['challenge_entry_assign_task'][1]; endif; endforeach; foreach ( $post_ids as $post_id ): $artisan_chall_task = get_group( 'task_entry', $post_id ); // Passing the $post_id foreach ( $artisan_chall_task as $art_chall_task ): $task_ach_id = intval($art_chall_task['task_entry_achievement_id'][1]); //achievement ID $task_ach_link = get_the_permalink($task_ach_id); //achievement link echo "<tr>"; echo "<td class='mobile-first'>" . $art_chall_task['task_entry_task_name'][1] . "</td>"; echo "<td class='mobile-second'>" . $art_chall_task['task_entry_task_desc'][1] . "</td>"; echo "<td class='mobile-third'><div class='" . $art_chall_task['task_entry_task_difficulty'][1] . "-stars margin-auto'></div></td>"; echo "<td class='mobile-fourth'><a href='" . $task_ach_link . "'>" . get_the_post_thumbnail( $task_ach_id, 'thumbnail' ) . "</a></td>"; echo "</tr>"; endforeach; endforeach; 

Обновление # 1:

По внешнему виду опубликованного кода кажется, что вы в основном перезаписываете глобальную переменную при прохождении цикла foreach вместо выполнения кода из блока «вторая группа» после каждого прохода. Как я вижу, у вас есть два варианта: либо объявить array перед кодом «первой группы», что-то вроде $post_ids = array() и нажимать каждый идентификатор на массив в коде первой группы:

 $post_ids[] = intval($art_entry['challenge_entry_assign_task'][1]); 

После этого вы можете продолжить следующее:

 foreach ( $post_ids as $post_id ): $artisan_chall_task = get_group( 'task_entry', $post_id ); // Passing the $post_id foreach($artisan_chall_task as $art_chall_task): $task_ach_id = intval($art_chall_task['task_entry_achievement_id'][1]); //achievement ID $task_ach_link = get_the_permalink($task_ach_id); //achievement link echo "<tr>"; echo "<td class='mobile-first'>" . $art_chall_task['task_entry_task_name'][1] . "</td>"; echo "<td class='mobile-second'>" . $art_chall_task['task_entry_task_desc'][1] . "</td>"; echo "<td class='mobile-third'><div class='" . $art_chall_task['task_entry_task_difficulty'][1] . "-stars margin-auto'></div></td>"; echo "<td class='mobile-fourth'><a href='" . $task_ach_link . "'>" . get_the_post_thumbnail( $task_ach_id, 'thumbnail' ) . "</a></td>"; echo "</tr>"; endforeach; endforeach; 

Другой вариант – обернуть код «второй группы» в функцию, которая принимает параметр, который является идентификатором сообщения:

 function print_task_entry( $post_id ) { $artisan_chall_task = get_group( 'task_entry', $post_id ); // Passing the $post_id foreach($artisan_chall_task as $art_chall_task): $task_ach_id = intval($art_chall_task['task_entry_achievement_id'][1]); //achievement ID $task_ach_link = get_the_permalink($task_ach_id); //achievement link echo "<tr>"; echo "<td class='mobile-first'>" . $art_chall_task['task_entry_task_name'][1] . "</td>"; echo "<td class='mobile-second'>" . $art_chall_task['task_entry_task_desc'][1] . "</td>"; echo "<td class='mobile-third'><div class='" . $art_chall_task['task_entry_task_difficulty'][1] . "-stars margin-auto'></div></td>"; echo "<td class='mobile-fourth'><a href='" . $task_ach_link . "'>" . get_the_post_thumbnail( $task_ach_id, 'thumbnail' ) . "</a></td>"; echo "</tr>"; endforeach; } 

И код для вашей «первой группы» будет выглядеть следующим образом:

 $chall_entries = get_group('challenge_entry', $post_id = 4643); foreach($chall_entries as $art_entry): //artisan challenges only if( $art_entry['challenge_entry_challenge_type'][1] == 'Artisan' ): // No need for any global variable! $task_post_id = intval($art_entry['challenge_entry_assign_task'][1]); print_task_entry( $task_post_id ); endif; endforeach; 

Оригинал:

Есть несколько потенциальных проблем, которые я вижу с вашим кодом:

$art_entry['challenge_entry_challenge_type'][1] == 'Artisan'

Предполагая, что вам нужен первый элемент art_entry['challenge_entry_challenge_type'] тогда эта строка должна быть:

$art_entry['challenge_entry_challenge_type'][0] == 'Artisan'

Как вы можете видеть, первый элемент в массиве имеет индекс 0.

Во-вторых, не используйте global ключевое слово: global $task_post_id; , Фактически вы можете удалить эту строку. Объявление этой переменной как global может привести к непредсказуемому поведению, если вы точно не знаете, что делаете. Global означает, что если эта же комбинация глобальной и переменной имени используется где-то еще в коде, она может быть перезаписана, и ваша ценность не может быть тем, что вы ожидали.

В-третьих, intval вызов может существенно повлиять на производительность вашего кода во время цикла, поэтому избегайте этого. Если вам действительно нужно убедиться, что значение является целым числом, вы можете придать ему значение (int) . Так что строка должна выглядеть примерно так:

$task_post_id = (int)$art_entry['challenge_entry_assign_task'][1];

Наконец, мне не совсем понятно, все ли идентификаторы, которые вы ищете, находятся в этой переменной массива: $art_entry['challenge_entry_assign_task']

Если они есть и находятся в таких индексах, как $art_entry['challenge_entry_assign_task'][0] , $art_entry['challenge_entry_assign_task'][1] , $art_entry['challenge_entry_assign_task'][2] т. Д., Вам определенно нужен механизм петлирования если вы хотите постепенно увеличивать значение по определенному индексу.

Я могу видеть из комментария, добавленного вами, что вы хотите итерации по этому массиву: [...] I don't want to manually write [1], [2], [3] etc. How do I iterate through that dynamically? – RachieVee 22 hours ago [...] I don't want to manually write [1], [2], [3] etc. How do I iterate through that dynamically? – RachieVee 22 hours ago

В этом случае можно использовать классический механизм цикла:

 $length = count( $art_entry['challenge_entry_assign_task'] ); // Get number of elements in array for ( $i = 0; $i < $length; $i++ ) { $task_post_id = (int)$art_entry['challenge_entry_assign_task'][$i]; // Accesing the element at index $i echo $task_post_id; } 

Надеюсь, это поможет в расчистке ситуации.