Sziasztok!
Azzal a kérdéssel fordulok hozzátok, hogy szeretnék egy részletes összetett keresőt az oldalamra. A következő adottságokkal gondoltam:
Név: szöveges mező
Ország: választható kategória (drop down)
Város: választható kategória (drop down)
Ennek eredményeként a kategóriában található cikkeket kellene kilistáznia.
Több plugint is próbáltam:
Multiple Category Selection Widget
Ajax Categories Posts Dropdown
Ajaxy Live Search
Search By Category
Ezeken kívül a Super search nevű plugin, ami értelmes, viszont abban csak az országokat tudom kilistázni. Próbáltam a plugin forráskódjába belenyúlni, létrehozni egy category2-t, amiben a sima category tartalmát listázná, ahol az Országok alá a Városok kategória van rendelve, de nem sikerült.
Tudnátok ajánlani valamit? Köszönöm előre is! Örök hálám!
van egy ilyen alapom, tehát eszerint festene a dolog:
Név | |
Ország |
Minden MagyarországAusztria |
Város |
Minden BudapestBöcksteinEgerJenigMátramindszentNemesnépRévfülöpSzékesfehérvárTurracher HöheVisegrád |
Viszont itt nekem az kellene, hogy az országokat és a városokat a kategóriákból olvassa ki, és aszerint listázza a keresési eredményt.
Név
Ország
Minden
MagyarországAusztria
Város
Minden
BudapestBöcksteinEgerJenigMátramindszentNemesnépRévfülöpSzékesfehérvárTurracher HöheVisegrád
Viszont itt nekem az kellene, hogy az országokat és a városokat a kategóriákból olvassa ki, és aszerint listázza a keresési eredményt.
A Wp Custom Field Search plugin próbáltad már?
Én ezt használom.
Ez tökéletes! Annyit tudsz esetleg még segíteni, hogy azt hogy tudom megcsinálni, hogy ha category labelt választok, akkor ne az összes kategóriát listázza, hanem csak adottakat? van olyan hogy: Drop Down Options, Compare…stb valahol van rá mód? köszi még egyszer!
A Drop Down Options-ban meg tudod adni, hogy mi jelenjen meg. Az adott kategórianeveket írd be vesszővel elválasztva.
Megtaláltam. Az kivitelezhető, hogy mondjuk ha kiválasztanak az első drop downban egy kategóriát, akkor az alatta lévő drop downban csak a kiválasztott kategóriához tartozó alkategóriákat listázza?
Ezt a kódrészletet találtam:
class CategorySearch {
}
class CustomSearchField extends SearchFieldBase {
function CustomSearchField($nameOrParams,$input=false,$comparison=false,$joiner=false){
CustomSearchField::__construct($nameOrParams,$input,$comparison,$joiner);
}
function __construct($nameOrParams,$input=false,$comparison=false,$joiner=false){
parent::__construct();
if(!is_array($nameOrParams)){
$params = array(‘name’=>$nameOrParams);
} else {
$params = $nameOrParams;
}
$this->name = $params[‘name’];
$this->params = $params;
$this->joiner = $joiner;
$this->comparison = $comparison;
$this->input = $input;
if(!is_object($this->input)){
$input = $this->param(‘input’,‘TextField’);
$this->input = new $input($params);
}
if(!is_object($this->comparison)){
$comparison = $this->param(‘comparison’,‘LikeComparison’);
$this->comparison = new $comparison();
}
if(!is_object($this->joiner)){
$joiner = $this->param(‘joiner’,‘CustomFieldJoiner’);
$this->joiner = new $joiner($this->param(‘name’),$this->params);
}
}
function setIndex($n){
$this->index=$n;
}
function param($key,$default=null){
if(array_key_exists($key,$this->params)) return $this->params[$key];
return $default;
}
function stripInitialForm($form){
$pref=’’;
if(preg_match("/^$pref/",$form)) return $form;
else return $pref;
}
function form_inputs($form){
$form = $this->stripInitialForm($form);
return $form.$this->getInput($this->name,$this->joiner);
}
function hasValue(){
return $this->getValue();
}
function sql_restrict($where){
if($this->hasValue()){
$value = $this->getValue();
$value = $GLOBALS[‘wpdb’]->escape($value);
$where.=$this->joiner->sql_restrict($this->name,$this->index,$value,$this->comparison);
}
if(method_exists($this->joiner,‘process_where’))
$where = $this->joiner->process_where($where);
return $where;
}
function describeSearch($current){
if($this->hasValue()){
$current[] = $this->getLabel()." “.$this->comparison->describeSearch($this->getValue());
}
return $current;
}
function join_meta($join){
global $wpdb;
$join=$this->joiner->sql_join($join,$this->name,$this->index,$this->getValue(),$this->comparison);
return $join;
}
function getQualifiedName(){
return $this->name.’-’.$this->index;
}
function getOldValue(){ return $this->getValue(); }
function getValue(){
$v = $this->input->getValue($this->getQualifiedName(),$this->name);
return $v;
}
function getLabel(){
if(!$this->params[‘label’]) $this->params[‘label’] = ucwords($this->name);
return $this->params[‘label’];
}
function isHidden(){
return $this->input->param(‘hidden’,false);
}
function getInput($wrap=true){
$input = $this->input->getInput($this->getQualifiedName(),$this->joiner,$this->name);
if($wrap){
$input = “
}
return $input;
}
function getCSSClass(){
return method_exists($this->input,‘getCSSClass’)?$this->input->getCSSClass():get_class($this->input);
}
}
function wp_custom_search_fields_include_bridges(){
$dir = opendir($path = dirname(FILE).’/bridges’);
while($file = readdir($dir)){
if(is_file("$path/$file") && preg_match("/^[^.]..php$/",$file)){
require_once("$path/$file");
}
}
}
wp_custom_search_fields_include_bridges();
if($debugMode){
add_filter(‘posts_request’,‘debug_dump_query’);
function debug_dump_query($query){
echo “
$query
”;return $query;
}
}
?>
class CategorySearch {
}
class CustomSearchField extends SearchFieldBase {
function CustomSearchField($nameOrParams,$input=false,$comparison=false,$joiner=false){
CustomSearchField::__construct($nameOrParams,$input,$comparison,$joiner);
}
function __construct($nameOrParams,$input=false,$comparison=false,$joiner=false){
parent::__construct();
if(!is_array($nameOrParams)){
$params = array(‘name’=>$nameOrParams);
} else {
$params = $nameOrParams;
}
$this->name = $params[‘name’];
$this->params = $params;
$this->joiner = $joiner;
$this->comparison = $comparison;
$this->input = $input;
if(!is_object($this->input)){
$input = $this->param(‘input’,‘TextField’);
$this->input = new $input($params);
}
if(!is_object($this->comparison)){
$comparison = $this->param(‘comparison’,‘LikeComparison’);
$this->comparison = new $comparison();
}
if(!is_object($this->joiner)){
$joiner = $this->param(‘joiner’,‘CustomFieldJoiner’);
$this->joiner = new $joiner($this->param(‘name’),$this->params);
}
}
function setIndex($n){
$this->index=$n;
}
function param($key,$default=null){
if(array_key_exists($key,$this->params)) return $this->params[$key];
return $default;
}
function stripInitialForm($form){
$pref=’’;
if(preg_match("/^$pref/",$form)) return $form;
else return $pref;
}
function form_inputs($form){
$form = $this->stripInitialForm($form);
return $form.$this->getInput($this->name,$this->joiner);
}
function hasValue(){
return $this->getValue();
}
function sql_restrict($where){
if($this->hasValue()){
$value = $this->getValue();
$value = $GLOBALS[‘wpdb’]->escape($value);
$where.=$this->joiner->sql_restrict($this->name,$this->index,$value,$this->comparison);
}
if(method_exists($this->joiner,‘process_where’))
$where = $this->joiner->process_where($where);
return $where;
}
function describeSearch($current){
if($this->hasValue()){
$current[] = $this->getLabel()." “.$this->comparison->describeSearch($this->getValue());
}
return $current;
}
function join_meta($join){
global $wpdb;
$join=$this->joiner->sql_join($join,$this->name,$this->index,$this->getValue(),$this->comparison);
return $join;
}
function getQualifiedName(){
return $this->name.’-’.$this->index;
}
function getOldValue(){ return $this->getValue(); }
function getValue(){
$v = $this->input->getValue($this->getQualifiedName(),$this->name);
return $v;
}
function getLabel(){
if(!$this->params[‘label’]) $this->params[‘label’] = ucwords($this->name);
return $this->params[‘label’];
}
function isHidden(){
return $this->input->param(‘hidden’,false);
}
function getInput($wrap=true){
$input = $this->input->getInput($this->getQualifiedName(),$this->joiner,$this->name);
if($wrap){
$input = “”.$this->getLabel().”$input
";
}
return $input;
}
function getCSSClass(){
return method_exists($this->input,‘getCSSClass’)?$this->input->getCSSClass():get_class($this->input);
}
}
function wp_custom_search_fields_include_bridges(){
$dir = opendir($path = dirname(FILE).’/bridges’);
while($file = readdir($dir)){
if(is_file("$path/$file") && preg_match("/^[^.].
.php$/",$file)){require_once("$path/$file");
}
}
}
wp_custom_search_fields_include_bridges();
if($debugMode){
add_filter(‘posts_request’,‘debug_dump_query’);
function debug_dump_query($query){
echo “
$query
”;return $query;
}
}
?>
Van ebben olyan rész, amit ha módosítunk, akkor lehetséges, hogy az adott kategória alkategóriáit listázza?
Nos, meg van végre pontosan a kategóriákra vonatkozó joiner és a keresés rész is az extra_search_fields. php fájlban.
joiner:
class CategoryJoiner extends BaseJoiner {
function sql_restrict($name,$index,$value,$comparison){
if(!($value || $this->params[‘required’])) return $join;
$table = ‘meta’.$index;
return " AND ( “.$comparison->addSQLWhere(”$table.name",$value).")";
}
function getTaxonomy(){
return $this->param(‘taxonomy’,‘category’);
}
function getTaxonomyWhere($table){
return “$table
.taxonomy=’”.$this->getTaxonomy()."’";
}
function sql_join($join,$name,$index,$value){
if(!($value || $this->params[‘required’])) return $join;
global $wpdb;
$table = ‘meta’.$index;
$rel = ‘rel’.$index;
$tax = ‘tax’.$index;
return $join." JOIN $wpdb->term_relationships $rel ON $rel.object_id=$wpdb->posts.id JOIN $wpdb->term_taxonomy $tax ON $tax.term_taxonomy_id=$rel.term_taxonomy_id JOIN $wpdb->terms $table ON $table.term_id=$tax.term_id AND “.$this->getTaxonomyWhere($tax);
}
function getAllOptions($fieldName){
global $wpdb;
$sql = “SELECT distinct t.name FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN $wpdb->posts p ON tr.object_id=p.id AND p.post_status=‘publish’ WHERE “.$this->getTaxonomyWhere(‘tt’);
$q = mysql_query($sql);
if($e = mysql_error()) echo “
SQL: $sql
”.mysql_error();$options = array();
while($r = mysql_fetch_row($q))
$options[$r[0]] = $r[0];
return $options;
}
function needsField(){
return false;
}
}
class TagJoiner extends CategoryJoiner {
function getTaxonomy(){
return $this->param(‘taxonomy’,‘post_tag’);
}
}
search:
class CategorySearch {
}
class CustomSearchField extends SearchFieldBase {
function CustomSearchField($nameOrParams,$input=false,$comparison=false,$joiner=false){
CustomSearchField::__construct($nameOrParams,$input,$comparison,$joiner);
}
function __construct($nameOrParams,$input=false,$comparison=false,$joiner=false){
parent::__construct();
if(!is_array($nameOrParams)){
$params = array(‘name’=>$nameOrParams);
} else {
$params = $nameOrParams;
}
$this->name = $params[‘name’];
$this->params = $params;
$this->joiner = $joiner;
$this->comparison = $comparison;
$this->input = $input;
if(!is_object($this->input)){
$input = $this->param(‘input’,‘TextField’);
$this->input = new $input($params);
}
if(!is_object($this->comparison)){
$comparison = $this->param(‘comparison’,‘LikeComparison’);
$this->comparison = new $comparison();
}
if(!is_object($this->joiner)){
$joiner = $this->param(‘joiner’,‘CustomFieldJoiner’);
$this->joiner = new $joiner($this->param(‘name’),$this->params);
}
}
function setIndex($n){
$this->index=$n;
}
function param($key,$default=null){
if(array_key_exists($key,$this->params)) return $this->params[$key];
return $default;
}
function stripInitialForm($form){
$pref=’’;
if(preg_match(”/^$pref/”,$form)) return $form;
else return $pref;
}
function form_inputs($form){
$form = $this->stripInitialForm($form);
return $form.$this->getInput($this->name,$this->joiner);
}
function hasValue(){
return $this->getValue();
}
function sql_restrict($where){
if($this->hasValue()){
$value = $this->getValue();
$value = $GLOBALS[‘wpdb’]->escape($value);
$where.=$this->joiner->sql_restrict($this->name,$this->index,$value,$this->comparison);
}
if(method_exists($this->joiner,‘process_where’))
$where = $this->joiner->process_where($where);
return $where;
}
function describeSearch($current){
if($this->hasValue()){
$current[] = $this->getLabel().” “.$this->comparison->describeSearch($this->getValue());
}
return $current;
}
function join_meta($join){
global $wpdb;
$join=$this->joiner->sql_join($join,$this->name,$this->index,$this->getValue(),$this->comparison);
return $join;
}
function getQualifiedName(){
return $this->name.’-’.$this->index;
}
function getOldValue(){ return $this->getValue(); }
function getValue(){
$v = $this->input->getValue($this->getQualifiedName(),$this->name);
return $v;
}
function getLabel(){
if(!$this->params[‘label’]) $this->params[‘label’] = ucwords($this->name);
return $this->params[‘label’];
}
function isHidden(){
return $this->input->param(‘hidden’,false);
}
function getInput($wrap=true){
$input = $this->input->getInput($this->getQualifiedName(),$this->joiner,$this->name);
if($wrap){
$input = “”.$this->getLabel().”$input
";
}
return $input;
}
function getCSSClass(){
return method_exists($this->input,‘getCSSClass’)?$this->input->getCSSClass():get_class($this->input);
}
}
function wp_custom_search_fields_include_bridges(){
$dir = opendir($path = dirname(FILE).’/bridges’);
while($file = readdir($dir)){
if(is_file("$path/$file") && preg_match("/^[^.]..php$/",$file)){
require_once("$path/$file");
}
}
}
wp_custom_search_fields_include_bridges();
if($debugMode){
add_filter(‘posts_request’,‘debug_dump_query’);
function debug_dump_query($query){
echo “$query
”;
return $query;
}
}
?>
Én úgy gondolom, hogy a search részbe kellene egy szűrés, csak azt nem tudom, hogy mire szűrjek rá, mert valószínűleg csak 1 kategória változó van megadva. ha úgy kellene megoldjam, hogy veszek fel 2. változót is, azt hogyan tehetem meg?
class CategoryJoiner extends BaseJoiner {
function sql_restrict($name,$index,$value,$comparison){
if(!($value || $this->params[‘required’])) return $join;
$table = ‘meta’.$index;
return " AND ( “.$comparison->addSQLWhere(”$table.name",$value).")";
}
function getTaxonomy(){
return $this->param(‘taxonomy’,‘category’);
}
function getTaxonomyWhere($table){
return “$table
.taxonomy=’”.$this->getTaxonomy()."’";
}
function sql_join($join,$name,$index,$value){
if(!($value || $this->params[‘required’])) return $join;
global $wpdb;
$table = ‘meta’.$index;
$rel = ‘rel’.$index;
$tax = ‘tax’.$index;
return $join." JOIN $wpdb->term_relationships $rel ON $rel.object_id=$wpdb->posts.id JOIN $wpdb->term_taxonomy $tax ON $tax.term_taxonomy_id=$rel.term_taxonomy_id JOIN $wpdb->terms $table ON $table.term_id=$tax.term_id AND “.$this->getTaxonomyWhere($tax);
}
function getAllOptions($fieldName){
global $wpdb;
$sql = “SELECT distinct t.name FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN $wpdb->posts p ON tr.object_id=p.id AND p.post_status=‘publish’ WHERE “.$this->getTaxonomyWhere(‘tt’);
$q = mysql_query($sql);
if($e = mysql_error()) echo “SQL: $sql
”.mysql_error();
$options = array();
while($r = mysql_fetch_row($q))
$options[$r[0]] = $r[0];
return $options;
}
function needsField(){
return false;
}
}
class TagJoiner extends CategoryJoiner {
function getTaxonomy(){
return $this->param(‘taxonomy’,‘post_tag’);
}
}
search:
class CategorySearch {
}
class CustomSearchField extends SearchFieldBase {
function CustomSearchField($nameOrParams,$input=false,$comparison=false,$joiner=false){
CustomSearchField::__construct($nameOrParams,$input,$comparison,$joiner);
}
function __construct($nameOrParams,$input=false,$comparison=false,$joiner=false){
parent::__construct();
if(!is_array($nameOrParams)){
$params = array(‘name’=>$nameOrParams);
} else {
$params = $nameOrParams;
}
$this->name = $params[‘name’];
$this->params = $params;
$this->joiner = $joiner;
$this->comparison = $comparison;
$this->input = $input;
if(!is_object($this->input)){
$input = $this->param(‘input’,‘TextField’);
$this->input = new $input($params);
}
if(!is_object($this->comparison)){
$comparison = $this->param(‘comparison’,‘LikeComparison’);
$this->comparison = new $comparison();
}
if(!is_object($this->joiner)){
$joiner = $this->param(‘joiner’,‘CustomFieldJoiner’);
$this->joiner = new $joiner($this->param(‘name’),$this->params);
}
}
function setIndex($n){
$this->index=$n;
}
function param($key,$default=null){
if(array_key_exists($key,$this->params)) return $this->params[$key];
return $default;
}
function stripInitialForm($form){
$pref=’’;
if(preg_match(”/^$pref/”,$form)) return $form;
else return $pref;
}
function form_inputs($form){
$form = $this->stripInitialForm($form);
return $form.$this->getInput($this->name,$this->joiner);
}
function hasValue(){
return $this->getValue();
}
function sql_restrict($where){
if($this->hasValue()){
$value = $this->getValue();
$value = $GLOBALS[‘wpdb’]->escape($value);
$where.=$this->joiner->sql_restrict($this->name,$this->index,$value,$this->comparison);
}
if(method_exists($this->joiner,‘process_where’))
$where = $this->joiner->process_where($where);
return $where;
}
function describeSearch($current){
if($this->hasValue()){
$current[] = $this->getLabel().” “.$this->comparison->describeSearch($this->getValue());
}
return $current;
}
function join_meta($join){
global $wpdb;
$join=$this->joiner->sql_join($join,$this->name,$this->index,$this->getValue(),$this->comparison);
return $join;
}
function getQualifiedName(){
return $this->name.’-’.$this->index;
}
function getOldValue(){ return $this->getValue(); }
function getValue(){
$v = $this->input->getValue($this->getQualifiedName(),$this->name);
return $v;
}
function getLabel(){
if(!$this->params[‘label’]) $this->params[‘label’] = ucwords($this->name);
return $this->params[‘label’];
}
function isHidden(){
return $this->input->param(‘hidden’,false);
}
function getInput($wrap=true){
$input = $this->input->getInput($this->getQualifiedName(),$this->joiner,$this->name);
if($wrap){
$input = “
}
return $input;
}
function getCSSClass(){
return method_exists($this->input,‘getCSSClass’)?$this->input->getCSSClass():get_class($this->input);
}
}
function wp_custom_search_fields_include_bridges(){
$dir = opendir($path = dirname(FILE).’/bridges’);
while($file = readdir($dir)){
if(is_file("$path/$file") && preg_match("/^[^.]..php$/",$file)){
require_once("$path/$file");
}
}
}
wp_custom_search_fields_include_bridges();
if($debugMode){
add_filter(‘posts_request’,‘debug_dump_query’);
function debug_dump_query($query){
echo “
$query
”;return $query;
}
}
?>
Én úgy gondolom, hogy a search részbe kellene egy szűrés, csak azt nem tudom, hogy mire szűrjek rá, mert valószínűleg csak 1 kategória változó van megadva. ha úgy kellene megoldjam, hogy veszek fel 2. változót is, azt hogyan tehetem meg?
class CategorySearch {
}
class CustomSearchField extends SearchFieldBase {
function CustomSearchField($nameOrParams,$input=false,$comparison=false,$joiner=false){
CustomSearchField::__construct($nameOrParams,$input,$comparison,$joiner);
}
function __construct($nameOrParams,$input=false,$comparison=false,$joiner=false){
parent::__construct();
if(!is_array($nameOrParams)){
$params = array(‘name’=>$nameOrParams);
} else {
$params = $nameOrParams;
}
$this->name = $params[‘name’];
$this->params = $params;
$this->joiner = $joiner;
$this->comparison = $comparison;
$this->input = $input;
if(!is_object($this->input)){
$input = $this->param(‘input’,‘TextField’);
$this->input = new $input($params);
}
if(!is_object($this->comparison)){
$comparison = $this->param(‘comparison’,‘LikeComparison’);
$this->comparison = new $comparison();
}
if(!is_object($this->joiner)){
$joiner = $this->param(‘joiner’,‘CustomFieldJoiner’);
$this->joiner = new $joiner($this->param(‘name’),$this->params);
}
}
function setIndex($n){
$this->index=$n;
}
function param($key,$default=null){
if(array_key_exists($key,$this->params)) return $this->params[$key];
return $default;
}
function stripInitialForm($form){
$pref=’’;
if(preg_match("/^$pref/",$form)) return $form;
else return $pref;
}
function form_inputs($form){
$form = $this->stripInitialForm($form);
return $form.$this->getInput($this->name,$this->joiner);
}
function hasValue(){
return $this->getValue();
}
function sql_restrict($where){
if($this->hasValue()){
$value = $this->getValue();
$value = $GLOBALS[‘wpdb’]->escape($value);
$where.=$this->joiner->sql_restrict($this->name,$this->index,$value,$this->comparison);
}
if(method_exists($this->joiner,‘process_where’))
$where = $this->joiner->process_where($where);
return $where;
}
function describeSearch($current){
if($this->hasValue()){
$current[] = $this->getLabel()." “.$this->comparison->describeSearch($this->getValue());
}
return $current;
}
function join_meta($join){
global $wpdb;
$join=$this->joiner->sql_join($join,$this->name,$this->index,$this->getValue(),$this->comparison);
return $join;
}
function getQualifiedName(){
return $this->name.’-’.$this->index;
}
function getOldValue(){ return $this->getValue(); }
function getValue(){
$v = $this->input->getValue($this->getQualifiedName(),$this->name);
return $v;
}
function getLabel(){
if(!$this->params[‘label’]) $this->params[‘label’] = ucwords($this->name);
return $this->params[‘label’];
}
function isHidden(){
return $this->input->param(‘hidden’,false);
}
function getInput($wrap=true){
$input = $this->input->getInput($this->getQualifiedName(),$this->joiner,$this->name);
if($wrap){
$input = “”.$this->getLabel().”$input
";
}
return $input;
}
function getCSSClass(){
return method_exists($this->input,‘getCSSClass’)?$this->input->getCSSClass():get_class($this->input);
}
}
function wp_custom_search_fields_include_bridges(){
$dir = opendir($path = dirname(FILE).’/bridges’);
while($file = readdir($dir)){
if(is_file("$path/$file") && preg_match("/^[^.].*.php$/",$file)){
require_once("$path/$file");
}
}
}
wp_custom_search_fields_include_bridges();
if($debugMode){
add_filter(‘posts_request’,‘debug_dump_query’);
function debug_dump_query($query){
echo “$query
”;
return $query;
}
}
?>
Én úgy gondolom, hogy a search részbe kellene egy szűrés, csak azt nem tudom, hogy mire szűrjek rá, mert valószínűleg csak 1 kategória változó van megadva. ha úgy kellene megoldjam, hogy veszek fel 2. változót is, azt hogyan tehetem meg?