ANTH101 v 3.ish

“You cannot think your way into a new way of living. You have to live your way into a new way of thinking.”
– Mike Wesch

You can’t beat that quote as a way to frame a course and it’s nice to consider how digital content supports that kind of perspective on learning/living. It’s also a key consideration in how I think about building courses like this. You have to do it. You shouldn’t expect to be perfect the first time, or the second, or ever really but if you’re doing it right improving it should be worth the investment. You should get some joy out of the process and it should alleviate things that cause you pain.

I’ve had the opportunity to work with Mike Wesch and Ryan Klataske at Kansas State over the last few years1 on the ANTH101 site. It’s been an interesting progression over time as the course has continued to evolve. We’ve gone done a variety of paths and dealt with human and technical issues.

It has been interesting to participate in the ongoing co-evolution of aesthetics, mechanics, and content. It’s also a scenario where I wish I’d have done a much better job with screenshots so I could more accurately show you how the site has evolved.2

After an initial meeting at Kansas State (our first meeting), we’ve done all of this work through a mix of video calls and Google Docs. You can see the editing stats on one of the Google Docs we used below. Lots of edits, lots of comments, and a decent span of time for one document.

Google Doc activity visualized by the Draftback extension

The course is meant to be used with a large number of students. In today’s world that usually means teaching assistants running smaller groups. The intent was also to use this across institutions. In both cases you’re working extra hard to limit support issues. In this case we don’t have a centralized IT group for support and we couldn’t easily do single sign on between institutions. We did a number of things to try to make life easier. We tried simplifying the backend. We moved posts to the front-end and automated, limited, or forced categories, featured images etc. It definitely improved things but support for teachers and students remained an issue.

The other major issue was the number of students. It was meant to be a large enrollment course and so we end up with a very large number of authors writing to the database during fairly short windows of time. That always creates issues with WordPress (and any other system I’ve used). We struggled with this and were moving towards a setup similar to the way we manage rampages– that is a multisite installation with a sharded database with cohorts of authors writing at the site level. That ended up getting derailed because it was going to take another big chunk of serious infrastructure re-working and wouldn’t solve other some other support problems.

So the big question became whether we could move the student portion to another service. We took a look at many things and ended up coming back around to Instagram. I know. I have feelings about the service and Facebook and all that stuff but it’s also a tool currently in use by most of the students already. It made sense in a number of ways and outsourced a chunk of support issues to an external service so we went with that. Part of that migration process was using Site Sucker on the gigantic old site to create an archive which ended up being about 11GB and 167,000 files. As you might imagine this took a good bit of time to run.

Making this move necessitated thinking through the things we needed to enable in the new environment. The more traditional content (Lessons, Challenges) pages would be relatively straight forward but the clan/group page that was tied into BuddyPress was one of those things that needed custom work. It gave the smaller cohorts a nice way to see just their cohort and enabled the leader of the group to communicate directly with that group. Since we were cutting out BuddyPress and the student content was going to be created elsewhere we needed to work out how to do this. Instagram has taken actions to make their API much more of a hassle to work with even for simply reading public data. As a result, we opted to go with the AccessPress Instagram Feed Pro plugin. That gave us some options to display content by username or hashtag without getting API key approval etc. This plugin creates shortcodes but the parameters are held in the database and the ID of the element is the only thing that’s visible in the shortcode. So you’re not doing something like [insta user=”tom”] or [insta tag=”foo”] but [insta id=”3″]. The other complication here was that Mike likes to have more flexibility in the authoring process so we were also working with the shortcodes created by Visual Composer. Some of these shortcodes are very odd.

The mechanization of this process became somewhat involved as a result. Any time you’re working with multiple shortcode plugins things become more involved.

Step One: Get the User Information

We opted to initiate the course page creation through the user signup process. To create a course page you needed to register for the WordPress site. That would enable us to get information about the course hashtag and the faculty user Instagram account to use as variables in the page creation. The developer version of Gravity Forms gives you a nice way to automate user registration and tie in various additional user metadata fields. You can see the preferences interface for that below.
Gravity Forms user registration options form.

In order to make those fields visible in the user profile view for normal users I added the following via the plugin. I opted to do all of this through a plugin rather than altering the functions.php file of the theme. The hope was that it would be fairly portable in case the theme changed later. I doubt that it really makes much difference one way or another.

function modify_user_meta_methods($profile_fields) {

  // Add new fields
  $profile_fields['faculty_insta'] = 'Faculty Instagram Account';//add stuff
  $profile_fields['insta_hash'] = 'Course Instagram Hashtag';
  $profile_fields['course_name'] = 'Course Name';
  $profile_fields['school'] = 'School';
  $profile_fields['visible'] = 'Visible';
  $profile_fields['course_img'] = 'Course Image';
  //$profile_fields['clan_page'] = 'Clan Page ID'; would make the id visible and editable - nice for testing but not needed
  unset($profile_fields['aim']);//remove stuff

  return $profile_fields;
add_filter('user_contactmethods', 'modify_user_meta_methods');

This essentially gives us all the variables we need to create a custom course page. Now we need to make the page and merge in the variables.

Mike made a template that looked the way he wanted and had the desired functionality. The view source of that looked like so . . .

[vc_row full_width="stretch_row_content td-stretch-content"][vc_column][tdm_block_column_title tds_title="tds_title3" title_text="JTIza2Fwc2NsYW4=" title_size="tdm-title-bg" tds_title2-title_color="#8224e3" tds_title2-line_height="10" content_align_horizontal="content-horiz-center" tds_title3-subtitle_text="Ms. Shearer's Anthropology Class"][vc_empty_space][/vc_column][/vc_row][vc_row full_width="stretch_row"][vc_column][td_block_24 limit="1" custom_title=""][td_block_2 offset="1"][/vc_column][/vc_row][vc_row][vc_column][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

<hr />

<h3><span class="td_text_highlight_marker_green td_text_highlight_marker">Latest Instagrams from Ms. Shearer</span></h3>
[ap_instagram_feed_pro id="26"]

<hr />

<h3><span class="td_text_highlight_marker_red td_text_highlight_marker">Latest posts from #Kapsclan Students</span></h3>
[ap_instagram_feed_pro id="27"]


You can see a combination of the the ap_instagram_feed_pro shortcodes and the vc_ Viscual composer shortcodes. You might note some odd things about the VC element in the first chunk- in particular title_text=”JTIza2Fwc2NsYW4=”. It’s some sort of encoding of regular text but I never did figure out what the encoding method was. In any case, it added some hassle at a point when I wasn’t in the mood for it. As a result, I went to the published post and copied out the HTML that shortcode created rather than spending more time messing with that nonsense. That is an example of either creative problem solving or laziness. Possibly both.

In any case, the post content of my course page now starts to look like this with some variables in there where I need them.

[vc_row full_width="stretch_row_content td-stretch-content"][vc_column]
<div class="vc_row td_uid_1_5a523c3ba9b10_rand  wpb_row td-pb-row"><div class="vc_column td_uid_2_5a523c3ba9d8b_rand  wpb_column vc_column_container tdc-column td-pb-span12"><div class="wpb_wrapper">
<div class="tdm_block td_block_wrap tdm_block_column_title td_uid_3_5a523c3ba9f60_rand tdm-content-horiz-center td-pb-border-top td_block_template_3" data-td-block-uid="td_uid_3_5a523c3ba9f60">
<div class="td-block-row"><div class="td-block-span12 tdm-col">
<div class="tds-title tds-title3  td-fix-index td_uid_4_5a523c3bab26c">
<h2 class="tdm-title tdm-title-bg clan-title">#' . $course_insta .'</h2>
<div class="tdm-title-line"></div><div class="tdm-title-sub">' . $course_title . '</div></div></div></div></div>
<div class="wpb_wrapper td_block_empty_space td_block_wrap vc_empty_space td_uid_5_5a523c3bab3dd_rand " style="height: 32px"></div></div></div></div>[vc_empty_space][/vc_column][/vc_row][vc_row full_width="stretch_row"][vc_column]<div class="anth-course">[td_block_2 autors_id="' . $faculty_ID . '"]</div>
[/vc_column][/vc_row][vc_row][vc_column][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]<hr /><h3>
<span class="td_text_highlight_marker_green td_text_highlight_marker">Latest Instagrams from ' . $faculty_insta . '</span></h3>[ap_instagram_feed_pro id="'. $faculty_insta_id .'"]<hr /><h3><span class="td_text_highlight_marker_red td_text_highlight_marker">Latest posts from #' . $course_insta . ' Students</span></h3>[ap_instagram_feed_pro id="' . $insta_hash_id .'"][/vc_column_text][/vc_column][/vc_row]

Now I have to do a few things to make this work. First, I have to duplicate the Instagram shortcode elements from the database, work in the new variables, and then insert them into the database. They’re pretty ugly looking things3 but we’re only changing a few variables and they’re just serialized arrays so that makes life easier. This is what they look like in the database in the wp_instagram_feeds table. Yuck.

a:166:{s:9:"feed_name";s:8:"KapsClan";s:9:"feed_type";s:3:"tag";s:34:"recent_media_blocked_caption_words";s:0:"";s:34:"recent_media_allowed_caption_words";s:0:"";s:17:"any_user_username";s:0:"";s:39:"any_user_username_blocked_caption_words";s:0:"";s:39:"any_user_username_allowed_caption_words";s:0:"";s:8:"tag_name";s:8:"kapsclan";s:25:"tag_blocked_caption_words";s:0:"";s:25:"tag_allowed_caption_words";s:0:"";s:32:"user_likes_blocked_caption_words";s:0:"";s:32:"user_likes_allowed_caption_words";s:0:"";s:7:"sort_by";s:4:"date";s:10:"image_size";s:19:"standard_resolution";s:20:"instagram_image_link";s:1:"1";s:19:"instagram_user_link";s:1:"1";s:23:"instagram_user_username";s:1:"1";s:10:"like_count";s:1:"1";s:13:"comment_count";s:1:"1";s:20:"counter_type_options";s:1:"3";s:15:"enable_lightbox";s:1:"1";s:15:"lightbox_layout";s:17:"apif_own_lightbox";s:12:"image_number";s:3:"200";s:18:"theme_accent_color";s:0:"";s:22:"hover_image_text_color";s:0:"";s:16:"instagram_mosaic";s:15:"masonry_layout5";s:25:"grid_layout_no_of_columns";s:10:"apif-col-4";s:28:"grid_layout_animation_effect";s:21:"apif-image-zoom-style";s:30:"grid_layout_animate_css_effect";s:9:"slideInUp";s:37:"grid_layout_load_more_button_position";s:11:"apif-center";s:33:"grid_layout_load_more_button_text";s:9:"Load More";s:39:"grid_layout_load_more_button_text_color";s:0:"";s:45:"grid_layout_load_more_button_background_color";s:0:"";s:41:"grid_layout_load_more_button_border_color";s:0:"";s:45:"grid_layout_load_more_button_hover_text_color";s:0:"";s:56:"grid_layout_load_more_button_text_hover_background_color";s:0:"";s:47:"grid_layout_load_more_button_hover_border_color";s:0:"";s:33:"grid_layout_load_more_button_icon";s:2:"14";s:29:"masonary_layout_no_of_columns";s:10:"apif-col-4";s:32:"masonary_layout_animation_effect";s:18:"apif-left-to-right";s:32:"masonary_layout_background_color";s:0:"";s:28:"masonary_layout_border_color";s:0:"";s:28:"masonary_layout_border_width";s:1:"0";s:34:"masonary_layout_animate_css_effect";s:8:"fadeInUp";s:41:"masonary_layout_load_more_button_position";s:11:"apif-center";s:37:"masonary_layout_load_more_button_text";s:9:"Load More";s:43:"masonary_layout_load_more_button_text_color";s:0:"";s:49:"masonary_layout_load_more_button_background_color";s:0:"";s:45:"masonary_layout_load_more_button_border_color";s:0:"";s:49:"masonary_layout_load_more_button_hover_text_color";s:0:"";s:60:"masonary_layout_load_more_button_text_hover_background_color";s:0:"";s:51:"masonary_layout_load_more_button_hover_border_color";s:0:"";s:37:"masonary_layout_load_more_button_icon";s:2:"14";s:30:"masonary_layout1_no_of_columns";s:10:"apif-col-4";s:33:"masonary_layout1_background_color";s:0:"";s:27:"masonary_layout1_text_color";s:0:"";s:29:"masonary_layout1_border_color";s:0:"";s:29:"masonary_layout1_border_width";s:0:"";s:35:"masonary_layout1_animate_css_effect";s:8:"fadeInUp";s:42:"masonary_layout1_load_more_button_position";s:11:"apif-center";s:38:"masonary_layout1_load_more_button_text";s:9:"Load More";s:44:"masonary_layout1_load_more_button_text_color";s:0:"";s:50:"masonary_layout1_load_more_button_background_color";s:0:"";s:46:"masonary_layout1_load_more_button_border_color";s:0:"";s:50:"masonary_layout1_load_more_button_hover_text_color";s:0:"";s:61:"masonary_layout1_load_more_button_text_hover_background_color";s:0:"";s:52:"masonary_layout1_load_more_button_hover_border_color";s:0:"";s:38:"masonary_layout1_load_more_button_icon";s:2:"14";s:30:"masonary_layout2_no_of_columns";s:10:"apif-col-3";s:33:"masonary_layout2_background_color";s:0:"";s:27:"masonary_layout2_text_color";s:0:"";s:29:"masonary_layout2_border_color";s:0:"";s:29:"masonary_layout2_border_width";s:0:"";s:35:"masonary_layout2_animate_css_effect";s:8:"fadeInUp";s:42:"masonary_layout2_load_more_button_position";s:11:"apif-center";s:38:"masonary_layout2_load_more_button_text";s:9:"Load More";s:44:"masonary_layout2_load_more_button_text_color";s:0:"";s:50:"masonary_layout2_load_more_button_background_color";s:0:"";s:46:"masonary_layout2_load_more_button_border_color";s:0:"";s:50:"masonary_layout2_load_more_button_hover_text_color";s:0:"";s:61:"masonary_layout2_load_more_button_text_hover_background_color";s:0:"";s:52:"masonary_layout2_load_more_button_hover_border_color";s:0:"";s:38:"masonary_layout2_load_more_button_icon";s:2:"14";s:30:"masonary_layout3_no_of_columns";s:10:"apif-col-3";s:33:"masonary_layout3_background_color";s:0:"";s:27:"masonary_layout3_text_color";s:0:"";s:29:"masonary_layout3_border_color";s:0:"";s:29:"masonary_layout3_border_width";s:0:"";s:35:"masonary_layout3_animate_css_effect";s:6:"fadeIn";s:42:"masonary_layout3_load_more_button_position";s:11:"apif-center";s:38:"masonary_layout3_load_more_button_text";s:9:"Load More";s:44:"masonary_layout3_load_more_button_text_color";s:0:"";s:50:"masonary_layout3_load_more_button_background_color";s:0:"";s:46:"masonary_layout3_load_more_button_border_color";s:0:"";s:50:"masonary_layout3_load_more_button_hover_text_color";s:0:"";s:61:"masonary_layout3_load_more_button_text_hover_background_color";s:0:"";s:52:"masonary_layout3_load_more_button_hover_border_color";s:0:"";s:38:"masonary_layout3_load_more_button_icon";s:2:"14";s:30:"masonary_layout4_no_of_columns";s:10:"apif-col-3";s:33:"masonary_layout4_background_color";s:0:"";s:27:"masonary_layout4_text_color";s:0:"";s:29:"masonary_layout4_border_color";s:0:"";s:29:"masonary_layout4_border_width";s:0:"";s:35:"masonary_layout4_animate_css_effect";s:8:"fadeInUp";s:42:"masonary_layout4_load_more_button_position";s:11:"apif-center";s:38:"masonary_layout4_load_more_button_text";s:9:"Load More";s:44:"masonary_layout4_load_more_button_text_color";s:0:"";s:50:"masonary_layout4_load_more_button_background_color";s:0:"";s:46:"masonary_layout4_load_more_button_border_color";s:0:"";s:50:"masonary_layout4_load_more_button_hover_text_color";s:0:"";s:61:"masonary_layout4_load_more_button_text_hover_background_color";s:0:"";s:52:"masonary_layout4_load_more_button_hover_border_color";s:0:"";s:38:"masonary_layout4_load_more_button_icon";s:2:"14";s:30:"masonary_layout5_no_of_columns";s:10:"apif-col-3";s:33:"masonary_layout5_background_color";s:0:"";s:27:"masonary_layout5_text_color";s:0:"";s:29:"masonary_layout5_border_color";s:0:"";s:29:"masonary_layout5_border_width";s:0:"";s:35:"masonary_layout5_animate_css_effect";s:6:"fadeIn";s:42:"masonary_layout5_load_more_button_position";s:11:"apif-center";s:38:"masonary_layout5_load_more_button_text";s:9:"Load More";s:44:"masonary_layout5_load_more_button_text_color";s:0:"";s:50:"masonary_layout5_load_more_button_background_color";s:0:"";s:46:"masonary_layout5_load_more_button_border_color";s:0:"";s:50:"masonary_layout5_load_more_button_hover_text_color";s:0:"";s:61:"masonary_layout5_load_more_button_text_hover_background_color";s:0:"";s:52:"masonary_layout5_load_more_button_hover_border_color";s:0:"";s:38:"masonary_layout5_load_more_button_icon";s:2:"14";s:35:"instagram_layout_animate_css_effect";s:6:"fadeIn";s:30:"instagram_layout_show_time_ago";s:1:"1";s:30:"instagram_layout_show_comments";s:1:"1";s:31:"instagram_layout_comments_count";s:1:"8";s:35:"instagram_layout_show_image_caption";s:1:"1";s:42:"instagram_layout_load_more_button_position";s:11:"apif-center";s:38:"instagram_layout_load_more_button_text";s:9:"Load More";s:44:"instagram_layout_load_more_button_text_color";s:0:"";s:50:"instagram_layout_load_more_button_background_color";s:0:"";s:46:"instagram_layout_load_more_button_border_color";s:0:"";s:50:"instagram_layout_load_more_button_hover_text_color";s:0:"";s:61:"instagram_layout_load_more_button_text_hover_background_color";s:0:"";s:52:"instagram_layout_load_more_button_hover_border_color";s:0:"";s:38:"instagram_layout_load_more_button_icon";s:2:"14";s:32:"round_image_layout_no_of_columns";s:10:"apif-col-4";s:35:"round_image_layout_animation_effect";s:16:"circle-rotateyrs";s:37:"round_image_layout_hover_border_width";s:0:"";s:37:"round_image_layout_hover_border_color";s:0:"";s:37:"round_image_layout_animate_css_effect";s:8:"rotateIn";s:44:"round_image_layout_load_more_button_position";s:11:"apif-center";s:40:"round_image_layout_load_more_button_text";s:0:"";s:46:"round_image_layout_load_more_button_text_color";s:0:"";s:52:"round_image_layout_load_more_button_background_color";s:0:"";s:48:"round_image_layout_load_more_button_border_color";s:0:"";s:52:"round_image_layout_load_more_button_hover_text_color";s:0:"";s:63:"round_image_layout_load_more_button_text_hover_background_color";s:0:"";s:54:"round_image_layout_load_more_button_hover_border_color";s:0:"";s:40:"round_image_layout_load_more_button_icon";s:2:"14";s:33:"grid_rotator_layout_no_of_columns";s:1:"4";s:30:"grid_rotator_layout_no_of_rows";s:1:"2";s:38:"slider_layout_show_next_previous_color";s:0:"";s:34:"slider_1_layout_show_image_caption";s:1:"1";s:46:"slider_1_layout_image_caption_background_color";s:0:"";s:40:"slider_1_layout_show_next_previous_color";s:0:"";s:40:"slider_3_layout_show_next_previous_color";s:0:"";s:29:"slider_layout_4_show_time_ago";s:1:"1";s:34:"slider_layout_4_show_image_caption";s:1:"1";s:32:"slider_layout_4_navigation_color";s:0:"";}

But I know which two we’re going to use as template and what pieces we need to alter so we never have to look at that again. Next up is setting a generic function to grab our template data.

function getInstagramTemplate($row){
    global $wpdb;    
    $instaData = $wpdb->get_row( "SELECT `feed_settings` FROM  `wp_instagram_feeds` WHERE `id` = " . $row);
    return $instaData;

Now we want to grab one template for the instructor (get data by instagram user name) and one template for the course (get data by instagram hashtag). We’ll grab the variables from the user account, change our array values, serialize them and stick them back in the database table.

    $og_insta_data_faculty = getInstagramTemplate(26);//get template with ID 26 - the faculty one
    $og_insta_data_course = getInstagramTemplate(27);//get template with ID 27 -  the hashtag one
    $instaDataArrayFaculty = unserialize($og_insta_data_faculty->feed_settings);   //make them arrays
    $instaDataArrayCourse = unserialize($og_insta_data_course->feed_settings);

    //get data from user
    $faculty_ID = $user_id;
    $faculty_name = get_the_author_meta('nickname', $faculty_ID);
    $faculty_insta = get_the_author_meta('faculty_insta', $faculty_ID);//instagram account name
    $course_insta = get_the_author_meta('insta_hash', $faculty_ID);//instagram course hash tag
    $course_insta = str_ireplace('#', '', $course_insta);//remove hashtag if it's in there
    $school = get_the_author_meta('school', $faculty_ID);//school

 //alter instagram elements for faculty
    $instaDataArrayFaculty["feed_name"] = '@' . $faculty_name . ' feed - course is #' . $course_insta ;
    $instaDataArrayFaculty["any_user_username"] = $faculty_insta; 

  //alter instagram elements for course
    $instaDataArrayCourse["feed_name"] = '#' . $course_insta . ' feed - faculty is @' . $faculty_name;
    $instaDataArrayCourse["tag_name"] = $course_insta;

    //reserialize the instagram elements
    $instaDataArrayFaculty = maybe_serialize($instaDataArrayFaculty);
    $instaDataArrayCourse = maybe_serialize($instaDataArrayCourse);
    //insert into database
    $faculty_insta_id = insertInstagramData($instaDataArrayFaculty);//id for faculty instagram plugin shortcode
    $insta_hash_id = insertInstagramData($instaDataArrayCourse);//id for course instagram plugin shortcode

Ok, that takes care of making new instagram shortcodes with the right variables. The rest of the code integrates a few other variables.

 //create post
    $course_title = get_the_author_meta('course_name', $faculty_ID);
    $public = get_the_author_meta('visible', $faculty_ID);

    $featured_img = get_the_author_meta('course_img', $faculty_ID);

    $post_content = '[vc_row full_width="stretch_row_content td-stretch-content"][vc_column]<div class="vc_row td_uid_1_5a523c3ba9b10_rand  wpb_row td-pb-row"><div class="vc_column td_uid_2_5a523c3ba9d8b_rand  wpb_column vc_column_container tdc-column td-pb-span12"><div class="wpb_wrapper"><div class="tdm_block td_block_wrap tdm_block_column_title td_uid_3_5a523c3ba9f60_rand tdm-content-horiz-center td-pb-border-top td_block_template_3" data-td-block-uid="td_uid_3_5a523c3ba9f60"><div class="td-block-row"><div class="td-block-span12 tdm-col"><div class="tds-title tds-title3  td-fix-index td_uid_4_5a523c3bab26c"><h2 class="tdm-title tdm-title-bg clan-title">#' . $course_insta .'</h2><div class="tdm-title-line"></div><div class="tdm-title-sub">' . $course_title . '</div></div></div></div></div><div class="wpb_wrapper td_block_empty_space td_block_wrap vc_empty_space td_uid_5_5a523c3bab3dd_rand " style="height: 32px"></div></div></div></div>[vc_empty_space][/vc_column][/vc_row][vc_row full_width="stretch_row"][vc_column]<div class="anth-course">[td_block_2 autors_id="' . $faculty_ID . '"]</div>[/vc_column][/vc_row][vc_row][vc_column][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]<hr /><h3><span class="td_text_highlight_marker_green td_text_highlight_marker">Latest Instagrams from ' . $faculty_insta . '</span></h3>[ap_instagram_feed_pro id="'. $faculty_insta_id .'"]<hr /><h3><span class="td_text_highlight_marker_red td_text_highlight_marker">Latest posts from #' . $course_insta . ' Students</span></h3>[ap_instagram_feed_pro id="' . $insta_hash_id .'"][/vc_column_text][/vc_column][/vc_row]';

// Create the new course page 
$course_post = array(
  'post_title'    => $course_title,
  'post_content'  => $post_content,
  'post_status'   => 'publish',
  'post_author'   => $faculty_ID,
  'post_type'     => 'page',
  'tags_input'    => $public,//I wrote this in two places after deciding to make tags possible for pages because the query loop was more pleasant
   'meta_input'   => array(
        'public' => $public,//visible in public display of courses 
        'school' => $school,//associated school
// Insert the post into the database
$new_post_id = wp_insert_post( $course_post );

add_post_meta($new_post_id, 'clan_page', $new_post_id, true);//set the id of the clan page to the custom field in case we need to update it
<a href=""></a>
makeFeatured($new_post_id, $featured_img);//make the featured image

Now all of this ends up being trigger by account creation. Which will lead you to believe that you’ll use the user_register action to drive it. That will result in much suffering and your user metadata fields will always come back empty despite propagating when you go to look at the user through the normal WordPress backend or in the database. The action you need to use is gform_user_registered and that makes total sense once you realize it exists.

Now we’re operational and I added some pieces to make user profile updates update the course page in case people make mistakes and want to change elements. That’s not super clean in that it duplicates Instagram entries rather than fixing them but it works.

The result is a page that shows the author posts on this WordPress, the author’s posts on Instagram, and the course hashtag posts on Instagram – all tied to the user profile.


I think it ended up working out pretty well. There are a number of ways I can/should make the code cleaner and DRY-er but you can check out the whole thing if you want on GitHub.

I do encourage you to go check out the ANTH101 site as it just keeps improving and Mike has continued to expand the resources available. It’s also one of those course sites where the student work inevitable draws me in. I always click on at least one.

As part of preparing to write this post, I also wandered around the Internet to see what other people had written. There are some pretty interesting reviews from different people- a few of which I include below.

I think Professor Iderweis is a bit harsh on themselves but it’s a beautiful description of the ANTH101 community and the tolerance for ongoing development. models for me what a living, breathing course can look like. When I look back to when I taught Drugs and Behavior and Intro Psych, I see the classes I taught as boring and lifeless. We as a class didn’t create our own stories together, and we lost the opportunities to make connections. I really like how well-integrated all the various media for each lesson and challenge are on the website. And the more I dig into this site, the more I am personally challenged? to design my classes to have more of an open pedagogy behind them and being okay with my classes being in the “beta” stage every week.

Another teacher wrote

Thinking about my own teaching and learning, this is something that I would like to get better at. As a learner, I was drawn into the videos and probably spent too much time clicking around, rewatching, and thinking about the themes of the week. It was welcoming, creative, and interesting. In many ways, it is like my current class on digital storytelling. There are weekly themes, challenges, and input from our teacher via podcasts, videos, and social media. My students would enjoy this format as well. They love to do real world, authentic, project based learning and when framed properly, they dive right in. That said, as a teacher, I would be interested in seeing that backend of this type of educational structure. I worry that it might be somewhat unmanageable to create, track, give feedback, and grade the class. What would the pace be if everyone was moving along at different rates and exploring different projects? It is one thing to have a class of 20-30 college students, but having 130 high school freshman is a different animal. I think that I could take aspects of this class and incorporate them slowly over time and build towards something larger – step by step…

There’s lots to unpack in that comment especially in light of the scale of the ANTH101 course.

Megan Pendergast notes-

This open source class is an example of challenging the traditional classroom, and I love it! The teacher is providing the students with the resources to learn new lessons, and then challenging them to apply these lesson to their lives. Talk about complete engagement! I believe this class is a WIN for education. Additionally, if a teacher wanted to mimic this class or parts of it, the resources are available to do so. I think participating in the challenges one day (when I’m not in the middle of a graduate degree) would be very rewarding.

Elsa Pranger had more to say about the ease of interaction.

I was really impressed with how easy the layout of the course seems. It also seems very manageable. On a very basic level, there were a lot of parallels with format for this course we are currently in. I think after taking this course, I would be better equipped to participate in the project-based, online model. The information also looks very interesting to me. As someone who is not always into the newest digital, techy advances, I definitely do appreciate when technology is used to connect people. Now, I know we like to think we are way more connected than truly are, but courses like this offer those authentic experiences that go cross-culturally as well. This also reminds me of our video about campfire storytelling in this weeks playlist as they tried to get stories across cultures. In a similar fashion, ANTH101 is trying to really look at what makes us human, how we interact, and then have the students implement these authentic interactions through a free, online course.

And finally there’s an interview with Mike about this course that’s well worth reading here.

1 The earliest email I see is Aug. 7, 2016. It looks like around 357 emails.

2 This has long been a goal of mine but I think I’m actually in a place now where I can make it happen. It’s also a textbook example of something that I have to offload to technology as I always never get the kind of documentation I want.

3 When I first saw them I had no idea what they were and asked Jeff.

2 thoughts on “ANTH101 v 3.ish

  1. (scared to comment, as it usually gets eaten, trying twitter auth rather than WP).

    This is way beyond brilliant design and implementation Tom, the approach of using Instagram for such a large audience works well on a functional side fo students and a slick presentation approach. I salute you for making your way through the Instagram Stingy API.

    I mostly understand the post/page creation; I don’t see them anywhere obvious on the site, are they private? It’s quite a clever way to spread out the class among multiple teachers.

    Y’all should win some kind of award.

    1. So weird you have such problems with commenting here. I’ll have to investigate as I don’t think I have much happening other than akismet.

      I don’t think Mike has made the class pages public yet. I’ll throw you a link to them in a DM.

Comments are closed.