Добрый день,
Мое ограниченное знание php привело к созданию чудовищного кода. Я надеюсь, что кто-то может показать мне более простой и понятный способ сделать это. К сожалению я действительно действительно плохо с php.
Чего я пытаюсь достичь
Я пытаюсь закодировать некоторые значки badgeOS для моего сайта WordPress, которые ссылаются на соответствующие записи урока. Другими словами, миниатюра из badge_post_id должна ссылаться на конкретный lesson_post_id. Миниатюра значка также должна выглядеть по-разному для «заработанных» и «незаработанных».
У меня есть следующий код, который в настоящее время использует каждый значок эскиза:
<!-- Badge must either be marked earned or unearned -->
<?php if (in_array($badge_post_id, $earned_achievements)) {
$css_class = 'earned-badge'; }
else {
$css_class = 'unearned-badge'; }
?>
<!-- Each badge requires this code -->
<span id="lesson-#" class="badge-class">
<a href="http://example.com/?p=$lesson_post_id" class="badge-link">
<span class="badge-icon">
<?php echo badgeos_get_achievement_post_thumbnail($badge_post_id, $image_size, $css_class) ;?>
</span>
<span class="badge-name"> LESSON TITLE </span>
</a>
</span>
Я также использую это в начале страницы:
<!-- Everything gets this -->
<?php
$image_size = array(100,100);
$earned_achievements = badgeos_get_user_earned_achievement_ids(get_current_user_id());
?>
Как видите, для 30+ значков это — тонна кода и огромная головная боль, за которой нужно следить.
В идеале это вытащило бы всю необходимую информацию из некоторой таблицы (возможно, из какого-то массива), которая связывает всю эту информацию:
Номер урока: $badge_post_id, $lesson_post_id, $lesson_title, $css_class
(заработанный или незаработанный)
Поэтому я могу набрать кого-то намного проще, чтобы получить каждый значок вместо добавления 100 строк кода.
Что-то вроде этого?
<?php
$earned_achivements = badgeos_get_user_earned_achivement_ids();
$badges = get_badges();
foreach ($badges as $badge){
if (in_array($badge["id"], $earned_achievements)) {
echo '<span id="lesson-'.$badge["lesson_id"].'" class="earned-badge">';
$badge_output = badgeos_get_achievement_post_thumbnail( $badge["id"], $image_size, 'earned-badge' );
} else {
echo '<span id="lesson-'.$badge["lesson_id"].'" class="unearned-badge">';
$badge_output = badgeos_get_achievement_post_thumbnail( $badge["id"], $image_size, 'unearned-badge' );
}
echo '<a href="http://example.com/?p='.$badge["lesson_id"].'" class="badge-link">';
echo '<span class="badge-icon">';
echo $badge_output;
echo '</span><span class="badge-name">'.$badge["lesson_title"].'</span>';
echo '</a></span>';
}
$ badges может быть необработанным захватом таблицы базы данных с идентификаторами столбцов, lesson_id, lesson_title и всем, что вам нужно.
@ hendr1x
Ваша помощь привела меня к этому решению! Вместо того, чтобы вводить данные в массив или таблицу, которые будут использоваться только один раз, я использовал ваш код и поместил его как функцию.
function badgeosm($lesson_id, $badge_id){
$image_size = array(100,100);
$earned_achievements = badgeos_get_user_earned_achievement_ids( get_current_user_id() );
$css_class = 'unearned-badge'; // Set unearned-badge as the default.
if (in_array($badge_id, $earned_achievements)) {
$css_class = 'earned-badge';
}
echo '<span id="lesson-ID-'.$lesson_id.'" class="badge-class">';
echo '<a href="http://example.com/?p='.$lesson_id.'" class="badge-link">';
echo '<span class="badge-icon">';
echo badgeos_get_achievement_post_thumbnail( $badge_id, $image_size, $css_class );
echo '</span>';
echo '<span class="badge-name">';
echo get_the_title( $lesson_id );
echo '</span>';
echo '</a>';
}
badgeosm(1961,1770);
Теперь я просто ввожу идентификатор урока и значок, а функция делает все остальное. Кажется, это работает хорошо, и это, безусловно, уменьшает код. Спасибо. 🙂