Mi pregunta es sobre php pero involucra wordpress ya que estoy creando un complemento. El caso es que tengo 5 preguntas, cada pregunta tiene 6 opciones y una opción para elegir de cada una. Ahora la persona seleccionaría cualquier opción de cada o solo unas pocas. He creado la condición if que ahora me está volviendo loco, ya que ha pasado demasiado tiempo y hará más, como se harán casi 100 combinaciones. No me gustaría eso, sé que hay una forma de matriz multidimensional, pero no soy un plugin o experto en php para WordPress. así que si alguien puede arreglarlo por mí.
$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
fuente
fuente
Respuestas:
Su pregunta no es realmente sobre WordPress, es más sobre PHP y refactorización. Pero vemos mucho código malo aquí, y el patrón que explicaré a continuación (MVC) podría ayudar a muchos otros desarrolladores, así que decidí escribir una pequeña respuesta. Tenga en cuenta que hay un sitio dedicado para tales preguntas en nuestra red: Revisión de código . Desafortunadamente, muy pocos desarrolladores de WordPress están activos allí.
Cómo refactorizar el código
1. Eliminar el código inútil. Embellecer el resto.
La salida
Tienes este fragmento de repetición:
Ejecutas el bastante caro
the_post()
cada vez para obtener la miniatura de la publicación. Pero eso no es necesario, solo puede llamar:La consulta
Entonces, todo lo que necesita es la ID de publicación, y está disponible sin llamar
the_post()
. Aún mejor: puede restringir la consulta para obtener solo los ID.Un simple ejemplo:
Ahora tiene las ID y puede escribir:
Sin gastos generales, su código ya es más rápido y fácil de leer.
La sintaxis
Tenga en cuenta cómo alineé el
=
? Esto ayuda a comprender el código, porque la mente humana está especializada en el reconocimiento de patrones. Apoye eso y podemos hacer cosas increíbles. Crea un desastre y nos quedamos atrapados muy rápido.Esta es también la razón por la que eliminé
endwhile
yendif
. La sintaxis alternativa es desordenada y difícil de leer. Además, hace que trabajar en un IDE mucho más difícil: doblar y saltar desde el principio hasta el final de una expresión es más fácil con llaves.Los valores por defecto
Su
$args
matriz tiene algunos campos que usa en todas partes. Cree una matriz predeterminada y escriba esos campos solo una vez :Nuevamente, observe la alineación. Y observe también cómo cambié el
posts_per_page
valor. Nunca pidas-1
. ¿Qué sucede cuando hay un millón de publicaciones coincidentes? No desea eliminar la conexión de su base de datos cada vez que se ejecuta esta consulta, ¿verdad? ¿Y quién debería leer todas estas publicaciones? Siempre establezca un límite razonable.Ahora todo lo que tienes que cambiar es el campo
$args[ 'tax_query' ][ 'terms' ]
. Lo cubriremos en un momento.2. Encuentra todas las expresiones repetitivas y crea rutinas
Ya limpiamos un código repetitivo, ahora la parte difícil: la evaluación de los parámetros POST. Obviamente, ha realizado algunas etiquetas como resultado de algunos parámetros. Sugiero cambiarles el nombre a algo más fácil de entender, pero por ahora trabajaremos con su esquema de nombres.
Separe estos grupos del resto, cree una matriz que pueda administrar más adelante por separado:
Para completar el
terms
campo que falta en su matriz predeterminada, recorra la$groups
matriz hasta encontrar una coincidencia:Separé incluso la ejecución de la lista de términos y la comparación de los valores, porque estas son operaciones diferentes. Cada parte de su código debe hacer una sola cosa, y debe mantener el nivel de sangría plano para una mejor legibilidad.
Ahora que tenemos todas las partes, peguémoslas juntas.
3. Organización: separe el modelo de la vista
Cuando escribí modelo y vista , tenía algo en mente: el enfoque MVC. Es sinónimo de Model View Controller , un patrón bien conocido para organizar componentes de software. La parte que faltaba hasta ahora era el controlador, veremos cómo lo usamos más adelante.
Dijiste que no sabes mucho sobre PHP, así que espero que sepas más sobre el resultado. :) Comencemos con eso:
Agradable y simple: tenemos dos métodos: uno para establecer la fuente de nuestras ID de publicaciones, otro para representar las miniaturas.
Quizás te preguntes qué
Post_Collector_Interface
es esto . Llegamos a eso en un momento.Ahora la fuente de nuestra vista, el modelo.
Esto ya no es tan trivial, pero ya teníamos la mayor parte. Los
protected
métodos (funciones) no son accesibles desde el exterior, porque los necesitamos solo para la lógica interna.Los
public
métodos son simples: el primero obtiene nuestra$group
matriz de arriba, el segundo devuelve una matriz de ID de publicación. Y de nuevo nos encontramos con este dudosoPost_Collector_Interface
.Una interfaz es un contrato . Puede ser firmado (implementado) por clases. Que requiere una interfaz, como nuestra clase
Thumbnail_List
hace, mediante: la clase espera alguna otra clase con estos métodos públicos.Construyamos esa interfaz. Es realmente simple:
Sí, eso es todo. Código fácil, ¿no?
Lo que hicimos aquí: hicimos nuestra opinión
Thumbnail_List
independiente de una clase concreta, mientras que todavía podemos confiar en los métodos de la clase que obtuvimos$source
. Si cambia de opinión más adelante, puede escribir una nueva clase para obtener los ID de las publicaciones o usar una con valores fijos. Mientras implemente la interfaz, la vista estará satisfecha. Incluso puede probar la vista ahora con un objeto simulado:Esto es muy útil cuando quieres probar la vista. No desea probar ambas clases concretas juntas, porque no vería de dónde proviene un error. El objeto simulado es demasiado simple para errores, ideal para pruebas unitarias.
Ahora tenemos que combinar nuestras clases de alguna manera. Aquí es donde el controlador entra en escena.
El controlador es la única parte real de una aplicación; el modelo y la vista pueden reutilizarse aquí y allá, incluso en partes completamente diferentes. Pero el controlador existe solo para este único propósito, es por eso que ponemos el
$group
aquí.Y ahora solo tienes que hacer una cosa:
Llame a esta línea donde necesite la salida.
Puede encontrar todo el código de esta respuesta en esta esencia en GitHub .
fuente
-1
para que los usuarios con sitios enormes puedan cambiarlo si es necesario.-1
agregar eso por filtro. Lo cual ya es posible con un filtro en la consulta.