forked from weblab/uc-people
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Add UC People Widget
-Add UC People widget, using same form UI as a Person post -Change Specific People field to return ID --Makes it easier to fill out the 'post__in' array value in $args array
- Loading branch information
Showing
3 changed files
with
267 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,257 @@ | ||
<?php | ||
|
||
Class UC_People_Widget extends WP_Widget { | ||
private $fields = array('title','about','file','email','phone','phone_(alternate)','fax','mailing_address','office_location','office_hours','courses'); | ||
|
||
public function __construct(){ | ||
parent::__construct( 'uc_people_widget', 'UC People', array( 'classname' => __CLASS__, 'description' => 'A widget to display People' ) ); | ||
} | ||
|
||
private function get_people_grid( $args, $information_to_display ){ | ||
$the_query = new WP_Query( $args ); | ||
$out = ''; | ||
if( $the_query->have_posts() ){ | ||
$out = '<div class="row">'; | ||
$person_count = 1; | ||
|
||
while( $the_query->have_posts() ){ | ||
$the_query->the_post(); | ||
$out .= '<div class="col-sm-3 personcount-'.$person_count.'" id="person-'.get_the_id().'">'; | ||
$out .= '<div class="person">'; | ||
|
||
$out .= '<a href="'.get_the_permalink().'" class="person-permalink">'; | ||
if (in_array('photo', $information_to_display)) { | ||
$out .= '<div class="person-image">'.get_the_post_thumbnail('large').'</div>'; | ||
}; | ||
if (in_array('first_name', $information_to_display) || in_array('middle_name', $information_to_display) || in_array('last_name', $information_to_display)){ | ||
$out .= '<h4 class="person-name">'; | ||
if (in_array('first_name', $information_to_display)) { | ||
$out .= get_field('first_name').' '; | ||
}; | ||
if (in_array('middle_name', $information_to_display)) { | ||
$out .= get_field('middle_name').' '; | ||
}; | ||
if (in_array('last_name', $information_to_display)) { | ||
$out .= get_field('last_name'); | ||
}; | ||
$out .= '</h4>'; | ||
}; | ||
$out .= '</a>'; | ||
|
||
foreach( $this->fields as $f ){ | ||
if( $f == 'file' && in_array('file', $information_to_display) ){ | ||
$file = get_field('file'); | ||
$out .= '<p class="person-file"><a href="'.$file[url].'">'.$file[title].'</a>'.'</p>'; | ||
} elseif( $f == 'email' && in_array( 'email', $information_to_display ) ){ | ||
$out .= '<p class="person-email"><a href="mailto:'.get_field('email').'">'.get_field('email').'</a>'.'</p>'; | ||
} else if( $f == 'title' && in_array( 'title', $information_to_display ) ){ | ||
$out .= '<p class="person-title"><strong>'.get_field('title').'</strong></p>'; | ||
} else { | ||
if ( in_array($f, $information_to_display) ) { | ||
$out .= '<p class="person-'.$f.'">'.get_field($f).'</p>'; | ||
}; | ||
} | ||
} | ||
$out .= '</div></div>'; // div.person and div.col-sm-3 | ||
|
||
// check to see if we need to close this row... | ||
if ($person_count % 4 == 0){ | ||
// if this is the 4th, 8th, 16th, etc person... | ||
echo '</div><!-- /row --><div class="row">'; | ||
} | ||
$person_count++; | ||
} //end of while posts | ||
$out .= '</div>'; // div.row | ||
} else { | ||
|
||
} //end of if posts | ||
|
||
return $out; | ||
} | ||
|
||
private function createTextCell( $field, $information_to_display ){ | ||
$cell = ''; | ||
if (in_array($field, $information_to_display)) { | ||
$cell .= '<td class="person-'.$field.'">'.get_field($field).'</td>'; | ||
} | ||
return $cell; | ||
} | ||
|
||
private function get_people_table( $args, $information_to_display ){ | ||
$the_query = new WP_Query( $args ); | ||
$out = ''; | ||
if ( $the_query->have_posts() ) { | ||
// how many columns? Based on what they chose to display. | ||
$num_cols = count($information_to_display); | ||
|
||
$out .= '<table class="table table-striped">'; | ||
$out.= '<legend class="sr-only">List of People</legend>'; | ||
$out .= '<thead><tr>'; | ||
|
||
$nameCell = false; | ||
foreach($information_to_display as $value){ | ||
if ($value == 'first_name' || $value == 'middle_name' || $value == 'last_name'){ | ||
if ($nameCell == false){ | ||
$out .= '<th>Name</th>'; | ||
$nameCell = true; | ||
}; | ||
} elseif ($value == 'photo') { | ||
$out .= '<th> </th>'; | ||
} else { | ||
$arr = get_field_object('field_'.$value); | ||
$label = $arr['label']; | ||
$out .= '<th>'.$label.'</th>'; | ||
} | ||
} | ||
$out .= '</tr></thead>'; | ||
$out .= '<tbody>'; | ||
|
||
while ( $the_query->have_posts() ) { | ||
$the_query->the_post(); | ||
|
||
$out .= '<tr>'; | ||
if (in_array('photo', $information_to_display)) { | ||
$out .= '<td class="person-image"><a href="'.get_the_permalink().'">'.the_post_thumbnail(array('65', '65')).'</a></td>'; | ||
} | ||
if (in_array('first_name', $information_to_display) || in_array('middle_name', $information_to_display) || in_array('last_name', $information_to_display)){ | ||
$out .= '<td class="person-name"><a href="'.get_the_permalink().'">'; | ||
if (in_array('first_name', $information_to_display)) { | ||
$out .= get_field('first_name'); | ||
$out .= ' '; | ||
}; | ||
if (in_array('middle_name', $information_to_display)) { | ||
$out .= get_field('middle_name'); | ||
$out .= ' '; | ||
}; | ||
if (in_array('last_name', $information_to_display)) { | ||
$out .= get_field('last_name'); | ||
}; | ||
$out .= '</a></td>'; | ||
} | ||
|
||
foreach( $this->fields as $f ){ | ||
if( $f == 'file' && in_array('file', $information_to_display) ){ | ||
$file = get_field('file'); | ||
$out .= '<td class="person-file"><a href="'.$file[url].'">'.$file[title].'</a>'; | ||
} else if( $f == 'email' && in_array('email', $information_to_display) ){ | ||
$out .= '<td class="person-email"><a href="mailto:'.get_field('email').'">'.get_field('email').'</a></td>'; | ||
} else { | ||
$out .= $this->createTextCell($f, $information_to_display); | ||
} | ||
} | ||
$out .= '</tr>'; | ||
} //end of posts | ||
$out .= '</tbody>'; | ||
$out .= '</table>'; | ||
} else { | ||
// no posts found | ||
} | ||
return $out; | ||
} | ||
|
||
public function widget( $args, $instance ){ | ||
$settings = array( 'layout' => '', 'specific_people' => '', 'specific_groups' => '', 'specific_tags' => '', 'break_into_groups' => '', 'information_to_display' => ''); | ||
foreach( $settings as $k => $v ){ | ||
$settings[$k] = get_field( $k, 'widget_' . $args['widget_id'] ); | ||
} | ||
|
||
$wpQueryArgs = array( | ||
'posts_per_page' => -1, | ||
'post_type' => 'person', | ||
'orderby' => 'menu_order title', | ||
'order' => 'ASC', | ||
'post__in' => ( ( !is_null($settings['specific_people']) ) ? $settings['specific_people'] : array() ) | ||
); | ||
|
||
if ( $settings['specific_groups'] != false || $settings['specific_tags'] != false ){ | ||
$tax_query = array(); | ||
|
||
if ( $settings['specific_groups'] != false ) { | ||
$tax_query[] = array( | ||
'taxonomy' => 'group', | ||
'field' => 'term_id', | ||
'terms' => $settings['specific_groups'] | ||
); | ||
} | ||
if ( $settings['specific_tags'] != false ) { | ||
$tax_query[] = array( | ||
'taxonomy' => 'persontag', | ||
'field' => 'term_id', | ||
'terms' => $settings['specific_tags'] | ||
); | ||
} | ||
$wpQueryArgs['tax_query'] = $tax_query; | ||
} | ||
|
||
if( $settings['break_into_groups'] != false ){ | ||
// get all the people | ||
$the_query = new WP_Query( $wpQueryArgs ); | ||
|
||
// focusing on just the people, not the rest of the query. | ||
$people = $the_query->posts; | ||
|
||
// look at each person, and see each group used, use that to create a list of terms. | ||
$groups_in_use = array(); | ||
|
||
foreach($people as $value){ | ||
//$id = $value->ID; | ||
$id = $value; | ||
$terms = get_the_terms($id, 'group'); | ||
if (is_array($terms)){ | ||
foreach($terms as $key => $v){ | ||
//duplicates will overwrite themselves... | ||
$slug = $v->slug; | ||
$groups_in_use[$slug]= $slug; | ||
} | ||
}; | ||
} | ||
|
||
// sort the groups in use alphabetically | ||
sort($groups_in_use); | ||
|
||
// for each item in the list of terms, do a new query, but this time we're going to limit it to ONLY items from that one group. | ||
foreach($groups_in_use as $value){ | ||
|
||
// this sets up the query we'll need, and will overwrite any group queries from the original settings. | ||
$tax_query = array(); | ||
$group_query = array( | ||
'taxonomy' => 'group', | ||
'field' => 'slug', | ||
'terms' => $value | ||
); | ||
array_push($tax_query, $group_query); | ||
$wpQueryArgs['tax_query'] = $tax_query; | ||
|
||
// with $arg updated, let's do a new query. | ||
echo '<h3 class="group-title">'.get_term_by('slug', $value, 'group')->name.'</h3>'; | ||
|
||
if( $settings['layout'] == 'grid' ){ | ||
echo $this->get_people_grid( $wpQueryArgs, $settings['information_to_display'] ); | ||
} else if( $settings['layout'] == 'table' ){ | ||
echo $this->get_people_table( $wpQueryArgs, $settings['information_to_display'] ); | ||
} | ||
} | ||
} else { | ||
if( $settings['layout'] == 'grid' ){ | ||
echo $this->get_people_grid( $wpQueryArgs, $settings['information_to_display'] ); | ||
} else if( $settings['layout'] == 'table' ){ | ||
echo $this->get_people_table( $wpQueryArgs, $settings['information_to_display'] ); | ||
} | ||
} | ||
} | ||
|
||
public function form( $instance ){ | ||
//Form is handled by ACF, code can be found in wp-content/plugins/uc-people/acf-export.php | ||
} | ||
|
||
public function update( $new_instance, $old_instance ){ | ||
//Update is handled by ACF | ||
} | ||
} | ||
|
||
function register_uc_people_widget(){ | ||
register_widget( 'UC_People_Widget' ); | ||
} | ||
add_action( 'widgets_init', 'register_uc_people_widget' ); | ||
|
||
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters