diff --git a/acf-export.php b/acf-export.php index 34d0a2f..9806066 100644 --- a/acf-export.php +++ b/acf-export.php @@ -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', ), @@ -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', @@ -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 ( @@ -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 ( diff --git a/uc-people-widget.php b/uc-people-widget.php new file mode 100644 index 0000000..3748fbd --- /dev/null +++ b/uc-people-widget.php @@ -0,0 +1,314 @@ + __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 .= ''.get_field($field, $id ).''; + } + return $cell; + } + + private function get_people_grid( $args, $information_to_display ){ + $the_query = new WP_Query( $args ); + $out = ''; + if( $the_query->have_posts() ){ + $out = '
'; + $person_count = 1; + + $people = $the_query->get_posts(); + usort( $people, array('UC_People_Widget', 'sort_by_last_then_first') ); + + foreach( $people as $id ){ + $out .= '
'; + $out .= '
'; + + $out .= ''; + if (in_array('photo', $information_to_display)) { + $out .= '
'.get_the_post_thumbnail( $id, 'large').'
'; + }; + if (in_array('first_name', $information_to_display) || in_array('middle_name', $information_to_display) || in_array('last_name', $information_to_display)){ + $out .= '

'; + 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 .= '

'; + }; + $out .= '
'; + + foreach( $this->fields as $f ){ + if( $f == 'file' && in_array('file', $information_to_display) ){ + $file = get_field('file', $id ); + $out .= '

'.$file[title].''.'

'; + } elseif( $f == 'email' && in_array( 'email', $information_to_display ) ){ + $out .= '

'.get_field('email', $id ).''.'

'; + } else if( $f == 'title' && in_array( 'title', $information_to_display ) ){ + $out .= '

'; + $titlePieces = explode(";", get_field('title', $id )); + foreach( $titlePieces as $t ){ + $out .= ( !empty($t) ? "{$t}
": "" ); + } + $out .= '

'; + } else { + if ( in_array($f, $information_to_display) ) { + $out .= '

'.get_field($f, $id ).'

'; + }; + } + } + $out .= '
'; // 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 '
'; + } + $person_count++; + } + $out .= '
'; // 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 .= ''; + $out.= 'List of People'; + $out .= ''; + + $nameCell = false; + foreach($information_to_display as $value){ + if ($value == 'first_name' || $value == 'middle_name' || $value == 'last_name'){ + if ($nameCell == false){ + $out .= ''; + $nameCell = true; + }; + } elseif ($value == 'photo') { + $out .= ''; + } else { + $arr = get_field_object('field_'.$value); + $label = $arr['label']; + $out .= ''; + } + } + $out .= ''; + $out .= ''; + + foreach( $people as $id ){ + $out .= ''; + if (in_array('photo', $information_to_display)) { + $out .= ''; + } + if (in_array('first_name', $information_to_display) || in_array('middle_name', $information_to_display) || in_array('last_name', $information_to_display)){ + $out .= ''; + } + + foreach( $this->fields as $f ){ + if( $f == 'file' && in_array('file', $information_to_display) ){ + $file = get_field('file', $id ); + $out .= ''; + } else if( $f == 'email' && in_array('email', $information_to_display) ){ + $out .= ''; + } else if( $f == 'title' && in_array('title', $information_to_display) ){ + $out .= ''; + } else { + $out .= $this->createTextCell($f, $information_to_display, $id ); + } + } + $out .= ''; + } + $out .= ''; + $out .= '
Name '.$label.'
'.get_the_post_thumbnail($id, array('65', '65')).''; + 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 .= ''.$file[title].''.get_field('email', $id ).''; + $titlePieces = explode(";", get_field('title', $id )); + foreach( $titlePieces as $t ){ + $out .= ( !empty($t) ? "{$t}
": "" ); + } + $out .= '
'; + } 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 '

'.get_term_by('slug', $value, 'group')->name.'

'; + + 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' ); + +?> \ No newline at end of file diff --git a/uc-people.php b/uc-people.php index 6925df3..c36ca08 100644 --- a/uc-people.php +++ b/uc-people.php @@ -2,7 +2,7 @@ /** * Plugin Name: UC People * Description: Displays information about people, a replacement for UUP. - * Version: 1.0 + * Version: 1.1 * Author: Andrew Bacon and Salman Kaleem of UITS Web Dev */ @@ -11,8 +11,8 @@ if ( ! defined( 'WPINC' ) ) { die; } require 'acf-export.php'; -require_once(WP_CONTENT_DIR . '/ldap.php'); - +//require_once(WP_CONTENT_DIR . '/ldap.php'); +include 'uc-people-widget.php'; function create_custom_custom_post_type(){ $labels = array( @@ -32,9 +32,11 @@ function create_custom_custom_post_type(){ 'public' => true, 'menu_position' => 35, 'menu_icon' => 'dashicons-groups', - 'supports' => array( 'tags', 'thumbnail', 'revisions', 'page-attributes', 'author' ), + 'supports' => array( 'title', 'tags', 'thumbnail', 'revisions', 'page-attributes', 'author' ), 'has_archive' => true, - 'rewrite' => false + 'rewrite' => array( + 'slug' => '/person' + ) ); register_post_type( 'person', $args ); @@ -77,6 +79,51 @@ function create_custom_custom_post_type(){ } add_action( 'init', 'create_custom_custom_post_type', 0 ); +// Add Order field to Add New Group Page +function uc_people_new_group_order_field(){ + ?> +
+ + +

Enter a value for this field or leave it blank

+
+ term_id}" ); + $order = $term_meta['group_order']; + ?> + + + + +

Enter a value for this field or leave it blank

+ + + 'NetID', + 'role' => 'Role', 'first_name' => 'First Name', 'last_name' => 'Last Name', 'title' => 'Title', @@ -146,9 +195,21 @@ function importFile( $filename ){ 'office_hours' => 'Office Hours', 'courses' => 'Courses', 'about' => 'About', + 'url' => 'Website', ); foreach( $data as $k => $v ){ + $user = username_exists( $v['NetID'] ); + $postAuthorFlag = false; + if( $user != false && is_user_member_of_blog($user, get_current_blog_id() ) ){ + $postAuthorFlag = true; + $role = $v['Role']; + if( $role == 'profile_user' ){ + $userObject = new WP_User( $user ); + $userObject->remove_role('profile_user'); + $userObject->add_role('contributor'); + } + } $title = $v['First Name'].' '.$v['Last Name']; $args = array( 'post_title' => $title, @@ -156,11 +217,15 @@ function importFile( $filename ){ 'post_status' => 'publish', 'post_type' => 'person', 'menu_order' => ( !empty($v['Order']) ? $v['Order'] : 0 ), + 'post_author' => ( $postAuthorFlag == true ? $user: get_current_user_id() ), ); $id = wp_insert_post( $args, true ); wp_set_object_terms( $id, explode(' ', $v['Tags']), 'tag' ); set_post_thumbnail( $id, intval($v['Profile Image']) ); foreach ($fields as $l => $w) { + if( $l == 'netid' || $l == 'role' ){ + continue; + } update_field($l, $v[$w], $id); } } @@ -171,6 +236,8 @@ function importFile( $filename ){ } } + + function uc_people_settings_page_menu(){ add_submenu_page('tools.php', 'Import People', 'Import People', 'manage_options', 'uc-import-people', 'uc_people_settings_page' ); }