Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request weblab#11 from szk11001/master
Add UC People Widget
  • Loading branch information
jmr06005 committed Dec 4, 2015
2 parents ce851fe + aadfa26 commit 7c7c6b9
Show file tree
Hide file tree
Showing 3 changed files with 411 additions and 7 deletions.
27 changes: 25 additions & 2 deletions acf-export.php
Expand Up @@ -28,7 +28,7 @@ if(function_exists("register_field_group"))
'name' => 'specific_people',
'type' => 'relationship',
'instructions' => 'Choose specific people to display. Leave right side blank to display all People.',
'return_format' => 'object',
'return_format' => 'id',
'post_type' => array (
0 => 'person',
),
Expand Down Expand Up @@ -120,6 +120,13 @@ if(function_exists("register_field_group"))
'group_no' => 0,
),
),
array (
array (
'param' => 'widget',
'operator' => '==',
'value' => 'uc_people_widget',
),
),
),
'options' => array (
'position' => 'normal',
Expand All @@ -131,7 +138,7 @@ if(function_exists("register_field_group"))
));
}

//adds boxes to the "People" pages.
//adds boxes to the "People" pages.
if(function_exists("register_field_group"))
{
register_field_group(array (
Expand Down Expand Up @@ -299,6 +306,22 @@ if(function_exists("register_field_group"))
'formatting' => 'html',
'maxlength' => '',
),
array (
'key' => 'field_url',
'label' => 'URL',
'name' => 'url',
'type' => 'url',
'instructions' => '',
'required' => 0,
'conditional_logic' => 0,
'wrapper' => array (
'width' => '',
'class' => '',
'id' => '',
),
'default_value' => '',
'placeholder' => '',
),
),
'location' => array (
array (
Expand Down
314 changes: 314 additions & 0 deletions uc-people-widget.php
@@ -0,0 +1,314 @@
<?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 static function sort_by_last_then_first($a,$b) {
setlocale(LC_CTYPE, 'en_US.UTF8'); // Using setlocale and iconv incase a name has an accent or other similar characters in them
$r = strnatcasecmp( iconv('UTF-8', 'ASCII//TRANSLIT', get_field('last_name', $a)), iconv('UTF-8', 'ASCII//TRANSLIT', get_field('last_name', $b)) );
if( $r === 0 ){
$r = strnatcasecmp( iconv('UTF-8', 'ASCII//TRANSLIT', get_field('first_name', $a)), iconv('UTF-8', 'ASCII//TRANSLIT', get_field('first_name', $b)) );
}
return $r;
}

private static function sort_group_by_order( $a, $b ){
// Getting the order for groups $a and $b
$groupA = get_term_by('slug', $a, 'group')->term_id;
$array_orderGroupA = get_option( "taxonomy_{$groupA}" );
$orderGroupA = $array_orderGroupA['group_order'];

$groupB = get_term_by('slug', $b, 'group')->term_id;
$array_orderGroupB = get_option( "taxonomy_{$groupB}" );
$orderGroupB = $array_orderGroupB['group_order'];

$r = strnatcasecmp( $orderGroupA, $orderGroupB );
if( $r === 0 ){
$r = strnatcasecmp( $a, $b );
}
return $r;
}

private function createTextCell( $field, $information_to_display, $id ){
$cell = '';
if (in_array($field, $information_to_display)) {
$cell .= '<td class="person-'.$field.'">'.get_field($field, $id ).'</td>';
}
return $cell;
}

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;

$people = $the_query->get_posts();
usort( $people, array('UC_People_Widget', 'sort_by_last_then_first') );

foreach( $people as $id ){
$out .= '<div class="col-sm-3 personcount-'.$person_count.'" id="person-'.$id.'">';
$out .= '<div class="person">';

$out .= '<a href="'.get_the_permalink( $id ).'" class="person-permalink">';
if (in_array('photo', $information_to_display)) {
$out .= '<div class="person-image">'.get_the_post_thumbnail( $id, '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', $id ).' ';
};
if (in_array('middle_name', $information_to_display)) {
$out .= get_field('middle_name', $id ).' ';
};
if (in_array('last_name', $information_to_display)) {
$out .= get_field('last_name', $id );
};
$out .= '</h4>';
};
$out .= '</a>';

foreach( $this->fields as $f ){
if( $f == 'file' && in_array('file', $information_to_display) ){
$file = get_field('file', $id );
$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', $id ).'">'.get_field('email', $id ).'</a>'.'</p>';
} else if( $f == 'title' && in_array( 'title', $information_to_display ) ){
$out .= '<p class="person-title">';
$titlePieces = explode(";", get_field('title', $id ));
foreach( $titlePieces as $t ){
$out .= ( !empty($t) ? "<strong>{$t}</strong><br>": "" );
}
$out .= '</p>';
} else {
if ( in_array($f, $information_to_display) ) {
$out .= '<p class="person-'.$f.'">'.get_field($f, $id ).'</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++;
}
$out .= '</div>'; // div.row
} else {

} //end of if posts

return $out;
}

private function get_people_table( $args, $information_to_display ){
$the_query = new WP_Query( $args );

$out = '';
if ( $the_query->have_posts() ) {
$people = $the_query->get_posts();
usort( $people, array('UC_People_Widget', 'sort_by_last_then_first') );

// 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>&nbsp;</th>';
} else {
$arr = get_field_object('field_'.$value);
$label = $arr['label'];
$out .= '<th>'.$label.'</th>';
}
}
$out .= '</tr></thead>';
$out .= '<tbody>';

foreach( $people as $id ){
$out .= '<tr>';
if (in_array('photo', $information_to_display)) {
$out .= '<td class="person-image"><a href="'.get_the_permalink( $id ).'">'.get_the_post_thumbnail($id, 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( $id ).'">';
if (in_array('first_name', $information_to_display)) {
$out .= get_field('first_name', $id );
$out .= ' ';
};
if (in_array('middle_name', $information_to_display)) {
$out .= get_field('middle_name', $id );
$out .= ' ';
};
if (in_array('last_name', $information_to_display)) {
$out .= get_field('last_name', $id );
};
$out .= '</a></td>';
}

foreach( $this->fields as $f ){
if( $f == 'file' && in_array('file', $information_to_display) ){
$file = get_field('file', $id );
$out .= '<td class="person-file"><a href="'.$file[url].'">'.$file[title].'</a></td>';
} else if( $f == 'email' && in_array('email', $information_to_display) ){
$out .= '<td class="person-email"><a href="mailto:'.get_field('email', $id ).'">'.get_field('email', $id ).'</a></td>';
} else if( $f == 'title' && in_array('title', $information_to_display) ){
$out .= '<td class="person-title">';
$titlePieces = explode(";", get_field('title', $id ));
foreach( $titlePieces as $t ){
$out .= ( !empty($t) ? "<strong>{$t}</strong><br>": "" );
}
$out .= '</td>';
} else {
$out .= $this->createTextCell($f, $information_to_display, $id );
}
}
$out .= '</tr>';
}
$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',
//'order' => 'post__in',
'post__in' => ( ( !is_null($settings['specific_people']) ) ? $settings['specific_people'] : array() ),
'fields' => 'ids'
);

if ( $settings['specific_groups'] != false || $settings['specific_tags'] != false ){
$tax_query = array();
$isGroupSet = false;
$isTagSet = false;

if ( $settings['specific_groups'] != false ) {
$isGroupSet = true;
$taxGroupArray = array(
'taxonomy' => 'group',
'field' => 'term_id',
'terms' => $settings['specific_groups']
);
$tax_query[] = $taxGroupArray;
}
if ( $settings['specific_tags'] != false ) {
$isTagSet = true;
$taxTagArray = array(
'taxonomy' => 'persontag',
'field' => 'term_id',
'terms' => $settings['specific_tags']
);
$tax_query[] = $taxTagArray;
}
$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);
usort($groups_in_use, array('UC_People_Widget', 'sort_group_by_order') );

// 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);
/*if( $isGroupSet != false ){
array_push($tax_query, $taxGroupArray);
}*/
if( $isTagSet != false ){
array_push($tax_query, $taxTagArray);
}
$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' );

?>

0 comments on commit 7c7c6b9

Please sign in to comment.