Мой вопрос о PHP, но он включает в себя WordPress, как я создаю плагин. Дело в том, что у меня есть 5 вопросов, у каждого вопроса есть 6 вариантов и один вариант на выбор. Теперь человек будет выбирать любой выбор из каждого или нескольких. Я создал условие if, которое сейчас сводит меня с ума, так как оно прошло слишком долго и будет продвигаться дальше, например, будет сделано почти 100 комбинаций. Я бы не хотел этого, я знаю, что есть способ многомерного массива, но я не плагин или эксперт PHP для WordPress. так что если кто-нибудь может разобрать это для меня.
$qs = $_POST['q1'];
$q2 = $_POST['q2'];
$q3 = $_POST['q3'];
$q4 = $_POST['q4'];
$q5 = $_POST['q5'];
$q6 = $_POST['q6'];
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'fashion-follower'
),
// array(
// 'taxonomy' => 'product_cat',
// 'field' => 'slug',
// 'terms' => 'cheap-and-cheerful'
// )
)
);
//The Fashionsia
if (($qs ==='party') && ($q2 === 'clothes') && ($q3 === 'shopping') && ($q5 === 'Sunbathing') && ($q6 === 'mini')){
$query = new WP_Query( $args );
if( $query->have_posts()) : while( $query->have_posts() ) : $query->the_post();
the_post_thumbnail('thumbnail');
endwhile;
endif;
}
//second question loop
$args2 = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'the-homemaker'
),
// array(
// 'taxonomy' => 'product_cat',
// 'field' => 'slug',
// 'terms' => 'cheap-and-cheerful'
// )
)
);
//The homemaker
if (($qs ==='drink') && ($q2 === 'candles') && ($q3 === 'house') && ($q4 === 'diy')){
$query = new WP_Query( $args2 );
if( $query->have_posts()) : while( $query->have_posts() ) : $query->the_post();
the_post_thumbnail('thumbnail');
endwhile;
endif;
}
//third loop
$args3 = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'entertainment'
),
// array(
// 'taxonomy' => 'product_cat',
// 'field' => 'slug',
// 'terms' => 'cheap-and-cheerful'
// )
)
);
//The Entertainer
if (($qs ==='party-babe') && ($q2 === 'winer')&& ($q4 === 'storm') && ($q6 === 'limo')){
$query = new WP_Query( $args3 );
if( $query->have_posts()) : while( $query->have_posts() ) : $query->the_post();
the_post_thumbnail('thumbnail');
endwhile;
endif;
}
//fourth loop
$args4 = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'family-fanatic'
),
// array(
// 'taxonomy' => 'product_cat',
// 'field' => 'slug',
// 'terms' => 'cheap-and-cheerful'
// )
)
);
//The family-fanatic
if (($qs ==='movie') && ($q2 === 'kids')&& ($q6 === 'volvo')){
$query = new WP_Query( $args4 );
if( $query->have_posts()) : while( $query->have_posts() ) : $query->the_post();
the_post_thumbnail('thumbnail');
endwhile;
endif;
}
//fifth loop
//fourth loop
$args4 = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'family-fanatic'
),
// array(
// 'taxonomy' => 'product_cat',
// 'field' => 'slug',
// 'terms' => 'cheap-and-cheerful'
// )
)
);
//The romantic
if (($qs ==='Dinner-show') && ($q5 === 'cruiser')){
$query = new WP_Query( $args4 );
if( $query->have_posts()) : while( $query->have_posts() ) : $query->the_post();
the_post_thumbnail('thumbnail');
endwhile;
endif;
}
plugin-development
plugins
oop
Нофел
источник
источник
Ответы:
Ваш вопрос на самом деле не о WordPress, а о PHP и рефакторинге. Но мы видим здесь очень много плохого кода, и шаблон, который я объясню ниже (MVC), может помочь многим другим разработчикам, поэтому я решил написать небольшой ответ. Имейте в виду, что в нашей сети есть специальный сайт для таких вопросов: Code Review . К сожалению, очень немногие разработчики WordPress работают там.
Как изменить код
1. Удалите бесполезный код. Украсить остальное.
Выход
У вас есть этот повторяющийся фрагмент:
Вы запускаете довольно дорого
the_post()
каждый раз, чтобы получить миниатюру сообщения. Но это не нужно, вы можете просто позвонить:Запрос
Так что все, что вам нужно, это идентификатор сообщения, и это доступно без звонка
the_post()
. Еще лучше: вы можете ограничить запрос, чтобы получать только идентификаторы.Простой пример:
Теперь у вас есть идентификаторы, и вы можете написать:
Никаких накладных расходов, ваш код уже быстрее и легче для чтения.
Синтаксис
Обратите внимание, как я выровнял
=
? Это помогает понять код, потому что человеческий разум специализируется на распознавании образов. Поддержите это, и мы сможем делать потрясающие вещи. Создайте беспорядок, и мы застряли очень быстро.Это также причина, почему я удалил
endwhile
иendif
. Альтернативный синтаксис является грязным и трудно читать. Кроме того, это значительно усложняет работу в среде IDE : с фигурными скобками легче складывать и прыгать от начала до конца выражения.Значения по умолчанию
В вашем
$args
массиве есть поля, которые вы используете везде. Создайте массив по умолчанию и запишите эти поля только один раз :Опять же, обратите внимание на выравнивание. И обратите внимание, как я изменил
posts_per_page
значение. Никогда не спрашивай-1
. Что происходит, когда есть миллион подходящих постов? Вы не хотите прерывать соединение с базой данных каждый раз, когда запускается этот запрос? И кто должен читать все эти посты? Всегда устанавливайте разумный лимит.Теперь все, что вам нужно изменить, это поле
$args[ 'tax_query' ][ 'terms' ]
. Мы расскажем об этом чуть позже.2. Найдите все повторяющиеся выражения и создайте процедуры
Мы уже убрали некоторый повторяющийся код, теперь сложная часть: оценка параметров POST. Очевидно, вы сделали несколько ярлыков в результате некоторых параметров. Я предлагаю переименовать их во что-то более простое для понимания, но пока мы будем работать с вашей схемой именования.
Отделите эти группы от остальных, создайте массив, которым вы можете управлять позже отдельно:
Чтобы заполнить пропущенное
terms
поле в вашем массиве по умолчанию, вы пробегаете$groups
массив, пока не найдете соответствие:Я разделил даже прогон списка терминов и сравнение значений, потому что это разные операции. Каждая часть вашего кода должна делать только одну вещь, и вы должны держать уровень отступов ровным для лучшей читабельности.
Теперь у нас есть все части, давайте склеим их.
3. Организация: отделить модель от вида
Когда я писал модель и представление , я имел в виду кое-что: подход MVC. Это расшифровывается как Model View Controller , хорошо известный шаблон для организации программных компонентов. Пока отсутствующей частью был контроллер, позже мы увидим, как мы его используем.
Вы сказали, что вы мало знаете о PHP, поэтому я надеюсь, что вы знаете больше о выводе. :) Начнем с этого:
Красиво и просто: у нас есть два метода: один для задания источника идентификаторов наших сообщений, другой для отображения миниатюр.
Вы можете спросить, что это
Post_Collector_Interface
такое. Мы доберемся до этого через мгновение.Теперь источник для нашего взгляда, модель.
Это уже не так тривиально, но у нас уже было большинство деталей. Эти
protected
методы (функции) не доступны извне, потому что они нужны нам только для внутренней логики.Эти
public
методы просты: первый получает наш$group
массив сверху, второй возвращает массив почтовых идентификаторов. И снова мы встречаемся с этим сомнительнымPost_Collector_Interface
.Интерфейс представляет собой договор . Это может быть подписано (реализовано) классами. Требование интерфейса, как
Thumbnail_List
делает наш класс , означает: класс ожидает некоторый другой класс с этими открытыми методами.Давайте создадим этот интерфейс. Это действительно просто:
Да, это все. Простой код, не правда ли?
То, что мы сделали здесь: мы сделали нашу точку зрения
Thumbnail_List
независимой от конкретного класса, в то время как мы все еще можем полагаться на методы класса, который мы получили$source
. Если позже вы передумаете, вы можете написать новый класс для извлечения идентификаторов сообщений или использовать класс с фиксированными значениями. Пока вы реализуете интерфейс, представление будет удовлетворено. Теперь вы можете даже протестировать вид с помощью фиктивного объекта:Это очень полезно, когда вы хотите проверить вид. Вы не хотите тестировать оба конкретных класса вместе, потому что вы не увидите, откуда возникла ошибка. Макет объекта слишком прост для ошибок, идеально подходит для модульных тестов.
Теперь мы должны как-то совместить наши занятия. Здесь контроллер выходит на сцену.
Контроллер - это единственная реальная уникальная часть приложения; модель и вид могут быть использованы здесь и там, даже в совершенно разных частях. Но контроллер существует только для этой единственной цели, поэтому мы поместили
$group
здесь.И теперь вам нужно сделать только одно:
Называйте эту линию там, где вам нужен выход.
Вы можете найти весь код из этого ответа в GistHub .
источник
-1
чтобы пользователи с огромными сайтами могли изменить его, если это необходимо.-1
добавить это для каждого фильтра. Что уже возможно с фильтром по запросу.