rober hughes
Estoy usando “wp job manager” e intento filtrar/buscar por un campo personalizado que he agregado a los trabajos al enviarlos. El autor del complemento ofrece un tutorial para agregar un menú desplegable para filtrar un campo de ‘salario’ agregado, y me gustaría modificar este tutorial para usar un cuadro de texto en lugar de un menú desplegable.
El tutorial se encuentra aquí: https://wpjobmanager.com/document/tutorial-agregando-un-campo-de-salario-para-empleos/
Suponiendo que los datos se envíen correctamente con el trabajo (en mi caso, lo es), el siguiente código le permite filtrar los trabajos con un menú desplegable, seleccionando entre rangos de precios.
add_action( 'job_manager_job_filters_search_jobs_end', 'filter_by_salary_field' );
function filter_by_salary_field() {
?>
<div class="search_categories">
<label for="search_categories"><?php _e( 'Salary', 'wp-job-manager' ); ?></label>
<select name="filter_by_salary" class="job-manager-filter">
<option value=""><?php _e( 'Any Salary', 'wp-job-manager' ); ?></option>
<option value="upto20"><?php _e( 'Up to $20,000', 'wp-job-manager' ); ?></option>
<option value="20000-40000"><?php _e( '$20,000 to $40,000', 'wp-job-manager' ); ?></option>
<option value="40000-60000"><?php _e( '$40,000 to $60,000', 'wp-job-manager' ); ?></option>
<option value="over60"><?php _e( '$60,000+', 'wp-job-manager' ); ?></option>
</select>
</div>
<?php
}
/**
* This code gets your posted field and modifies the job search query
*/
add_filter( 'job_manager_get_listings', 'filter_by_salary_field_query_args', 10, 2 );
function filter_by_salary_field_query_args( $query_args, $args ) {
if ( isset( $_POST['form_data'] ) ) {
parse_str( $_POST['form_data'], $form_data );
// If this is set, we are filtering by salary
if ( ! empty( $form_data['filter_by_salary'] ) ) {
$selected_range = sanitize_text_field( $form_data['filter_by_salary'] );
switch ( $selected_range ) {
case 'upto20' :
$query_args['meta_query'][] = array(
'key' => '_job_salary',
'value' => '20000',
'compare' => '<',
'type' => 'NUMERIC'
);
break;
case 'over60' :
$query_args['meta_query'][] = array(
'key' => '_job_salary',
'value' => '60000',
'compare' => '>=',
'type' => 'NUMERIC'
);
break;
default :
$query_args['meta_query'][] = array(
'key' => '_job_salary',
'value' => array_map( 'absint', explode( '-', $selected_range ) ),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
);
break;
}
// This will show the 'reset' link
add_filter( 'job_manager_get_listings_custom_filter', '__return_true' );
}
}
return $query_args;
}
Lo que debo hacer es cambiar el menú desplegable a un cuadro de texto, y si busco “20000”, solo tengo trabajos con un “salario” guardado de 20000 para mostrar. (Al final, este no será un campo de salario, pero el tutorial parecía una buena base para comenzar)
He hecho algunos intentos, pero no he podido hacer que esto funcione correctamente. Al cambiar la entrada a un cuadro de texto y eliminar las opciones, tengo una capacidad de búsqueda limitada, por ejemplo. Puedo buscar “más de 60” y se muestran los trabajos con un valor de 60000 o más, pero al buscar 60000 (o cualquier selección aleatoria de letras y números) aparecen todos los trabajos sin filtrar.
Suponiendo que ya haya agregado un campo de salario según la documentación de WP Job Manager, este código debería darle lo que está buscando:
add_action( 'job_manager_job_filters_search_jobs_end', 'filter_by_salary_field' );
function filter_by_salary_field() {
?>
<div class="search_categories">
<label for="search_categories"><?php _e( 'Search Salary Amounts', 'wp-job-manager' ); ?></label>
<input type="text" class="job-manager-filter" name="filter_by_salary" placeholder="Search Salary Amounts">
</div>
<?php
}
/**
* This code gets your posted field and modifies the job search query
*/
add_filter( 'job_manager_get_listings', 'filter_by_salary_field_query_args', 10, 2 );
function filter_by_salary_field_query_args( $query_args, $args ) {
if ( isset( $_POST['form_data'] ) ) {
parse_str( $_POST['form_data'], $form_data );
// If this is set, we are filtering by salary
if ( ! empty( $form_data['filter_by_salary'] ) ) {
$salary = sanitize_text_field( $form_data['filter_by_salary'] );
$query_args['meta_query'][] = array(
'key' => '_job_salary',
'value' => $salary,
'compare' => '=',
'type' => 'NUMERIC'
);
// This will show the 'reset' link
add_filter( 'job_manager_get_listings_custom_filter', '__return_true' );
}
}
return $query_args;
}
Hará lo que solicitó y solo arrojará resultados que coincidan exactamente con la forma en que se ingresaron cuando se envió el trabajo. Lo que significa que si envía un trabajo con un número en el campo de salario de “55,000”, necesitará la coma para encontrar ese trabajo en la página de búsqueda de trabajo. si un usuario busca un salario de “55 000”, no se devolverán resultados en ese caso; sin embargo, se devolverá un resultado si buscara “55 000”
Si desea tener en cuenta varios caracteres de moneda (es decir, símbolos de dólar, comas y centavos al final), es posible que desee considerar el uso de expresiones regulares: http://php.net/manual/en/function.preg-replace.php
Mencionó que querrá usarlo para algo más que salarios, por lo que será necesario realizar más modificaciones si desea usarlo para buscar contenido que no sea números. Entre otros cambios posibles, una línea que probablemente querrá eliminar por completo es:
'type' => 'NUMERIC'
Nota: Cuando pasa estos elementos a través del filtro ‘job_manger_get_listings’, está enviando estos datos a una función que utiliza WP_Query. Cuando estás devolviendo $query_args[‘meta_query’] en su código, está utilizando más específicamente la parte WP_Meta_Query de WP_Query. Saber eso podría ayudar a que tenga sentido modificar el código anterior. Consulte la documentación aquí para obtener más información: https://codex.wordpress.org/Class_Reference/WP_Meta_Query
-
Respuesta absolutamente fantástica, esto realmente me ha ayudado mucho. Estoy usando esto para buscar fechas mínimas y máximas, así que cambié los nombres de los filtros, ‘tipo’ => ‘fecha’ y cambié comparar a =. Usando un jquery datepicker esto filtra perfectamente. Desafortunadamente, no tengo suficientes comentarios para votarte.
– Rob Hughes
3 de noviembre de 2015 a las 10:44
-
¡Me alegro de que haya ayudado! Estaba buscando una pregunta propia y me topé con la tuya… Dado que recientemente tuve que hacer lo mismo, pensé en transmitirla. Con suerte, también ayudará a alguien más.
– ahurleb
4 de noviembre de 2015 a las 14:55
-
@ahurleb Quiero la misma solución para el estado y la ciudad. Así que por favor ayúdame. urgentemente
– Dnyan
18 de enero de 2016 a las 4:45
-
@Dnyan: WP Job Manager ya tiene la opción de buscar por ubicación. Si desea limitar la funcionalidad solo a estados específicos, use Regiones predefinidas (wordpress.org/plugins/wp-job-manager-ubicaciones) y cree el combo Ciudad, Estado en la sección “Agregar regiones”. Hay una opción en la página de configuración para reemplazar el campo de ubicación con una lista desplegable de las regiones que crea.
– ahurleb
19 de enero de 2016 a las 19:28
-
@ahurleb Ese complemento proporciona una región predefinida, pero quiero completar el menú desplegable en la selección del estado. pero no puedo filtrar el resultado. He usado la solución anterior, pero los resultados no se filtran, así que por favor ayuda. Del código anterior, eliminé el atributo tipo y comparación. En lugar de estos, qué atributo es adecuado para filtrar el resultado. también dígame cómo poblar el estado en la selección de ciudad.
– Dnyan
21 de enero de 2016 a las 4:54