Minha pergunta é sobre php, mas envolve wordpress como eu estou criando um plugin. O caso é que eu tenho 5 perguntas, cada pergunta tem 6 opções e uma opção para escolher. Agora a pessoa selecionaria qualquer opção entre cada uma ou apenas algumas. Eu criei a condição if que agora está me deixando louca, já que ela passou muito tempo e vai além, como quase 100 combinações serão feitas. Eu não gostaria disso, eu sei que existe uma maneira de matriz multidimensional, mas não sou um especialista em plugins ou php para wordpress. então, se alguém puder resolver isso para mim.
$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
Nofel
fonte
fonte
Respostas:
Sua pergunta não é realmente sobre WordPress, é mais sobre PHP e refatoração. Mas vemos muito código ruim aqui, e o padrão que explicarei abaixo (MVC) pode ajudar muitos outros desenvolvedores, então decidi escrever uma pequena resposta. Lembre-se de que existe um site dedicado a essas perguntas em nossa rede: Revisão de código . Infelizmente, muito poucos desenvolvedores do WordPress estão ativos lá.
Como refatorar código
1. Remova o código inútil. Embeleze o resto.
A saída
Você tem este trecho repetido:
Você executa o bastante caro
the_post()
cada vez para obter a miniatura da postagem. Mas isso não é necessário, basta ligar para:A pergunta
Então, tudo que você precisa é o ID da postagem, e isso está disponível sem ligar
the_post()
. Ainda melhor: você pode restringir a consulta para buscar apenas os IDs.Um exemplo simples:
Agora você tem os IDs e pode escrever:
Sem custos adicionais, seu código já é mais rápido e fácil de ler.
A sintaxe
Observe como eu alinhei o
=
? Isso ajuda a entender o código, porque a mente humana é especializada em reconhecimento de padrões. Apoie isso e podemos fazer coisas incríveis. Crie uma bagunça, e ficamos presos muito rápido.Esta é também a razão pela qual eu removi
endwhile
eendif
. A sintaxe alternativa é confusa e difícil de ler. Além disso, torna o trabalho em um IDE muito mais difícil: dobrar e pular do início ao fim de uma expressão é mais fácil com aparelhos.Os valores padrão
Sua
$args
matriz possui alguns campos que você usa em qualquer lugar. Crie uma matriz padrão e escreva esses campos apenas uma vez :Mais uma vez, observe o alinhamento. E observe também como mudei o
posts_per_page
valor. Nunca peça-1
. O que acontece quando há um milhão de postagens correspondentes? Você não deseja eliminar sua conexão com o banco de dados toda vez que essa consulta for executada, não é? E quem deve ler todos esses posts? Sempre defina um limite razoável.Agora tudo que você precisa mudar é o campo
$args[ 'tax_query' ][ 'terms' ]
. Nós vamos cobrir isso em um momento.2. Encontre todas as expressões repetidas e crie rotinas
Já limpamos alguns códigos repetidos, agora a parte mais difícil: a avaliação dos parâmetros do POST. Obviamente, você criou alguns rótulos como resultado de alguns parâmetros. Sugiro renomeá-los para algo mais fácil de entender, mas, por enquanto, trabalharemos com seu esquema de nomes.
Separe esses grupos dos demais, crie uma matriz que você possa gerenciar posteriormente separadamente:
Para preencher o
terms
campo ausente na matriz padrão, você percorre a$groups
matriz até encontrar uma correspondência:Separei até a execução da lista de termos e a comparação dos valores, porque essas são operações diferentes. Cada parte do seu código deve fazer apenas uma coisa, e você deve manter o nível de indentação plano para melhor legibilidade.
Agora temos todas as partes, vamos juntá-las.
3. Organização: separe o modelo da visualização
Quando escrevi model e view , eu tinha algo em mente: a abordagem MVC. Representa o Model View Controller , um padrão conhecido para organizar componentes de software. A parte que faltava até agora era o controlador, veremos como usá-lo mais tarde.
Você disse que não sabe muito sobre PHP, então espero que saiba mais sobre a saída. :) Vamos começar com isso:
Agradável e simples: temos dois métodos: um para definir a origem dos nossos IDs de postagem, um para renderizar as miniaturas.
Você pode se perguntar o que
Post_Collector_Interface
é isso . Chegamos a isso em um momento.Agora, a fonte da nossa visão, o modelo.
Isso não é mais tão trivial, mas já tínhamos a maioria das partes. Os
protected
métodos (funções) não são acessíveis externamente, porque precisamos deles apenas para a lógica interna.Os
public
métodos são simples: o primeiro obtém nossa$group
matriz de cima, o segundo retorna uma matriz de IDs de postagem. E novamente encontramos esse duvidosoPost_Collector_Interface
.Uma interface é um contrato . Pode ser assinado (implementado) por classes. Exigir uma interface, como a nossa classe
Thumbnail_List
, significa: a classe espera alguma outra classe com esses métodos públicos.Vamos construir essa interface. É realmente simples:
Sim, isso é tudo. Código fácil, não é?
O que fizemos aqui: tornamos nossa visão
Thumbnail_List
independente de uma classe concreta, enquanto ainda podemos confiar nos métodos da classe que obtivemos$source
. Se você mudar de idéia mais tarde, poderá escrever uma nova classe para buscar os IDs de postagem ou usar uma com valores fixos. Contanto que você implemente a interface, a visualização será satisfeita. Você pode até testar a exibição agora com um objeto simulado:Isso é muito útil quando você deseja testar a exibição. Você não deseja testar as duas classes concretas juntas, porque não verá de onde vem um erro. O objeto simulado é muito simples para erros, ideal para testes de unidade.
Agora temos que combinar nossas aulas de alguma forma. É aqui que o controlador entra no palco.
O controlador é a única parte real real de uma aplicação; o modelo e a vista podem ser reutilizados aqui e ali, mesmo em partes completamente diferentes. Mas o controlador existe apenas para esse propósito único, é por isso que colocamos
$group
aqui.E agora você precisa fazer apenas uma coisa:
Ligue para essa linha sempre que precisar da saída.
Você pode encontrar todo o código desta resposta nesta lista no GitHub .
fonte
-1
para que os usuários com sites enormes possam alterá-lo, se necessário.-1
adicionem isso por filtro. O que já é possível com um filtro na consulta.