<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Consulting Archives - Chris Gilligan » new media</title>
	<atom:link href="http://chrisgilligan.com/consulting/feed/" rel="self" type="application/rss+xml" />
	<link>https://chrisgilligan.com/consulting/</link>
	<description>portfolio of web work</description>
	<lastBuildDate>Tue, 12 Sep 2023 16:33:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>University Website Redesign: Scrapbook</title>
		<link>https://chrisgilligan.com/drupal/university-website-redesign-scrapbook/</link>
					<comments>https://chrisgilligan.com/drupal/university-website-redesign-scrapbook/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Wed, 19 Jul 2017 12:51:27 +0000</pubDate>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Education]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=2444</guid>

					<description><![CDATA[<p>Here are some websites and resources that may be useful for a redesign of UTC.edu. Higher Education sites College of Southern Nevada Case Study: Acquia &#124; College of Southern Nevada &#124; Acquia Engage Award 2016 Finalist 68 percent increase in page views 60 percent decrease in bounce rate 90 percent increase in mobile visitors Austin Peay State [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/drupal/university-website-redesign-scrapbook/">University Website Redesign: Scrapbook</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-24-at-4.04.09-PM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p>Here are some websites and resources that may be useful for a redesign of UTC.edu.</p>
<h1>Higher Education sites</h1>
<h2>College of Southern Nevada</h2>
<p><strong>Case Study:</strong><br />
<a href="https://www.acquia.com/resources/case-study/college-southern-nevada">Acquia | College of Southern Nevada | Acquia Engage Award 2016 Finalist</a></p>
<ul>
<li>68 percent increase in page views</li>
<li>60 percent decrease in bounce rate</li>
<li>90 percent increase in mobile visitors</li>
</ul>
<p><a href="https://www.csn.edu"><img loading="lazy" decoding="async" class="aligncenter wp-image-2491 size-large" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-24-at-4.04.09-PM-982x1024.png?x25141" alt="" width="982" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-24-at-4.04.09-PM-982x1024.png?x25141 982w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-24-at-4.04.09-PM-288x300.png?x25141 288w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-24-at-4.04.09-PM-768x800.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-24-at-4.04.09-PM.png?x25141 1489w" sizes="auto, (max-width: 982px) 100vw, 982px" /></a></p>
<a href="https://www.csn.edu" class="woo-sc-button  silver" ><span class="woo-">CSN.edu</span></a>
<h2>Austin Peay State University</h2>
<p>This is a newer design that is built on OU Campus CMS.</p>
<ul>
<li>Very clean design, mobile first.</li>
<li>Prominent but not obtrusive Apply/Visit/Give sub-menu on home page.</li>
<li>Great organization to introduce Admissions up front: Explore Austin Peay.</li>
<li>Student profile cards: diversity of people; could use diversity of disciplines.</li>
<li>Visual index of major colleges with department landing pages.</li>
<li>Visual calendar layout for upcoming featured events/dates/deadlines.</li>
</ul>
<p><a href="http://apsu.edu/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2489" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-3.20.46-PM-667x1024.png?x25141" alt="" width="667" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-3.20.46-PM-667x1024.png?x25141 667w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-3.20.46-PM-195x300.png?x25141 195w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-3.20.46-PM-768x1179.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-3.20.46-PM.png?x25141 1011w" sizes="auto, (max-width: 667px) 100vw, 667px" /></a></p>
<a href="http://www.apsu.edu/" class="woo-sc-button  silver" ><span class="woo-">APSU.edu</span></a>
<h2>UT Knoxville</h2>
<p>One of the most innovative and fresh website designs in higher education.</p>
<p>Home page &amp; Vol Stories built with Expression Engine CMS; interior pages with WordPress CMS, and other portions such as maps are custom-built.</p>
<ul>
<li>Fresh and simple, very fast page load; only 1 large image.</li>
<li>Featured Vol Story changes frequently.</li>
<li>Menu is main part of the page. Most frequently used links are grouped with logo at very top left.</li>
<li>Separate landing page for news.</li>
</ul>
<p><a href="http://www.utk.edu"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2454" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.35.09-AM-594x1024.png?x25141" alt="" width="594" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.35.09-AM-594x1024.png?x25141 594w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.35.09-AM-174x300.png?x25141 174w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.35.09-AM-768x1324.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.35.09-AM.png?x25141 900w" sizes="auto, (max-width: 594px) 100vw, 594px" /></a></p>
<a href="http://www.utk.edu" class="woo-sc-button  silver" ><span class="woo-">UTK.edu</span></a>
<h2>South Dakota State University</h2>
<p>Mobile-first, recruitment-first. Close to our color palette. Drupal 8.</p>
<p><a href="https://www.sdstate.edu"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2453" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.33.27-AM-594x1024.png?x25141" alt="" width="594" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.33.27-AM-594x1024.png?x25141 594w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.33.27-AM-174x300.png?x25141 174w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.33.27-AM-768x1324.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.33.27-AM.png?x25141 900w" sizes="auto, (max-width: 594px) 100vw, 594px" /></a></p>
<a href="https://www.sdstate.edu" class="woo-sc-button  silver" ><span class="woo-">SDstate.edu</span></a>
<h2>Florida International University</h2>
<p>Very close to UTC color palette. Creative use of photography and marketing in the image carousel. Proper use of HTML titles vs. text-on-image. Intersting, simple calendar &#8220;teaser&#8221;.</p>
<p><a href="http://www.fiu.edu/index.html"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2456" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.36.56-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.36.56-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.36.56-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.36.56-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.36.56-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="http://www.fiu.edu/index.html" class="woo-sc-button  silver" ><span class="woo-">FIU.edu</span></a>
<h2>Chicago Booth Review</h2>
<p>Drupal 8 CMS.</p>
<p>Excellent news magazine style. Featured/Cover article, popular articles, latest articles, video.</p>
<p><a href="http://review.chicagobooth.edu"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2457" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.25-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.25-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.25-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.25-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.25-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="http://review.chicagobooth.edu" class="woo-sc-button  silver" ><span class="woo-">Review.ChicagoBooth.edu</span></a>
<hr />
<h1>Corporate sites</h1>
<h2>The Guardian</h2>
<p>Ultra-responsive and fast loading news site with excellent use of color.</p>
<ul>
<li>large custom serif type, readable on all devices</li>
<li>multiple versions of headlines, subheads and excerpts for home page, indices, and stories &#8211; very readable and scannable</li>
</ul>
<p><a href="https://www.theguardian.com"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2494" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-25-at-2.41.46-PM-725x1024.png?x25141" alt="" width="725" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-25-at-2.41.46-PM-725x1024.png?x25141 725w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-25-at-2.41.46-PM-213x300.png?x25141 213w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-25-at-2.41.46-PM-768x1084.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-25-at-2.41.46-PM.png?x25141 1096w" sizes="auto, (max-width: 725px) 100vw, 725px" /></a></p>
<a href="https://www.theguardian.com" class="woo-sc-button  silver" ><span class="woo-">The Guardian</span></a>
<h2>First Tennessee Bank</h2>
<p><strong>Features a &#8220;task-oriented&#8221; home page.</strong>&#8220;I want to&#8230; do X&#8221; actions, &#8220;I&#8217;m looking for&#8230; Y&#8221; interactives &amp; animated menus.</p>
<p>There are multiple pathways to common tasks:</p>
<ul>
<li>prominent top-level menus with icons and action words</li>
<li>call-to action panels for other common tasks or features</li>
<li>common pathways have several routes
<ul>
<li>also enables A/B testing to see which method or path is most effective</li>
</ul>
</li>
</ul>
<p><a href="https://ftb.com/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2458" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.55-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.55-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.55-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.55-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.38.55-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="https://ftb.com/" class="woo-sc-button  silver" ><span class="woo-">FTB.com</span></a>
<h2>National Trust for Historic Preservation</h2>
<p>Beautiful site with video backgrounds, clean-yet-interesting design with some slanted lines to add interest.</p>
<ul>
<li>Scalable Vector Graphics (SVG images) for headlines.</li>
<li>Extensive and beautiful photography.</li>
<li>Simple interactivity on wide hover in the CTAs, blog article cards, etc.</li>
</ul>
<p><a href="https://savingplaces.org/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2459" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.39.33-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.39.33-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.39.33-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.39.33-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.39.33-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="https://savingplaces.org/" class="woo-sc-button  silver" ><span class="woo-">SavingPlaces.org</span></a>
<h2>United States Postal Service</h2>
<p><strong>Action-oriented interface:</strong> Track Package, Create Label, Buy Stamps, Order Boxes.</p>
<ul>
<li>Intersting use of slanted elements that match the logo geometry.</li>
<li>Basic white background lets the corporate colors stand out.</li>
<li>&#8220;Blades&#8221; Section in the middle of the page gives a more visual &amp; interactive option for CTAs.</li>
</ul>
<p><a href="https://www.usps.com/welcome.htm"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2460" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.40.01-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.40.01-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.40.01-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.40.01-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.40.01-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="https://www.usps.com/welcome.htm" class="woo-sc-button  silver" ><span class="woo-">USPS.com</span></a>
<h2>Chevrolet</h2>
<p>Chevy.com, like many auto sites, has rich mega-menu content.</p>
<ul>
<li>Clean white palette, which gives photography and brand-color highlights a chance to stand out.</li>
<li>Scalable Vector Graphic (SVG) icons and display text are accessible and look great on all devices.</li>
</ul>
<p><a href="http://www.chevrolet.com/low-cab-forward-trucks"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2461" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.19-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.19-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.19-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.19-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.19-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="http://www.chevrolet.com/low-cab-forward-trucks" class="woo-sc-button  silver" ><span class="woo-">Chevy.com</span></a>
<h2>Sucuri</h2>
<p><strong>Long-scroll page</strong>, heavy use of icons.</p>
<ul>
<li>Strong use of a very limited color palette.</li>
<li>CTAs right in the top menu, then repeated throughout page.</li>
</ul>
<p><a href="https://sucuri.net"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2462" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.50-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.50-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.50-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.50-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.41.50-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="https://sucuri.net" class="woo-sc-button  silver" ><span class="woo-">Sucuri.net</span></a>
<h2>Drupal</h2>
<p><strong>Simple and clean design</strong> with a hero video background.</p>
<p><a href="http://www.drupal.com"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2463" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.28-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.28-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.28-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.28-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.28-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="http://www.drupal.com" class="woo-sc-button  silver" ><span class="woo-">Drupal.com</span></a>
<h2>Mercury Marine</h2>
<p><strong>Good visual menus:</strong> icon top menus, image-filled megamenus.</p>
<ul>
<li>Correct use of slider/carousel with delayed titles and CTAs.</li>
</ul>
<p><a href="https://www.mercurymarine.com/en/us/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2464" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.56-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.56-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.56-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.56-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.42.56-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="https://www.mercurymarine.com/en/us/" class="woo-sc-button  silver" ><span class="woo-">Mercury Marine</span></a>
<h2> AirServer</h2>
<p><strong>Cute animations &amp; graphics</strong> with a consistent style.</p>
<p><strong>Menu:</strong> desktop effect on top menu after scroll; pinned/fixed menu on scroll; mobile menu interactive animations.</p>
<p><a href="https://www.airserver.com/Usage/Education"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2466" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.43.36-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.43.36-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.43.36-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.43.36-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.43.36-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="https://www.airserver.com/Usage/Education" class="woo-sc-button  silver" ><span class="woo-">Air Server</span></a>
<hr />
<h1>Creative Sites</h1>
<h2>Macau Design Biennial</h2>
<p><strong>Long-scroll with definite color cues between sections.</strong></p>
<ul>
<li>Does not look like a website&#8230; looks like print.</li>
<li>Very creative interactions  invite exploration.</li>
</ul>
<p><a href="http://www.macaudesignbiennial.com/en/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2467" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.44.21-AM-749x1024.png?x25141" alt="" width="749" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.44.21-AM-749x1024.png?x25141 749w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.44.21-AM-219x300.png?x25141 219w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.44.21-AM-768x1050.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.44.21-AM.png?x25141 1134w" sizes="auto, (max-width: 749px) 100vw, 749px" /></a></p>
<a href="http://www.macaudesignbiennial.com/en/" class="woo-sc-button  silver" ><span class="woo-">Macau Design Biennial</span></a>
<h2>gskinner</h2>
<p><strong>Fast loading site with a long-scroll</strong>, landing page feel and multiple calls to action. Nice scrolling behavior for the Calls to Action (CTAs).</p>
<p><a href="http://gskinner.com"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2468" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.45.27-AM-787x1024.png?x25141" alt="" width="787" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.45.27-AM-787x1024.png?x25141 787w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.45.27-AM-231x300.png?x25141 231w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.45.27-AM-768x999.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.45.27-AM.png?x25141 1127w" sizes="auto, (max-width: 787px) 100vw, 787px" /></a></p>
<a href="http://gskinner.com" class="woo-sc-button  silver" ><span class="woo-">gskinner.com</span></a>
<h2>ustwo</h2>
<p><strong>Clean and simple logo + teaser video engages the viewer</strong>, shows off products, staff, users, services&#8230; makes you want to click or scroll down to learn more.</p>
<p>No menu or layout until click or scroll, then more user interface elements, navigation appear.</p>
<p><a href="https://ustwo.com/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2469" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.46.44-AM-1024x830.png?x25141" alt="" width="1024" height="830" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.46.44-AM-1024x830.png?x25141 1024w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.46.44-AM-300x243.png?x25141 300w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.46.44-AM-768x622.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.46.44-AM.png?x25141 1155w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></p>
<a href="https://ustwo.com/" class="woo-sc-button  silver" ><span class="woo-">ustwo.com</span></a>
<h2>HTML5up: Solid State</h2>
<p>Super clean responsive landing page designs from a Nashville designer, see others at <a href="https://html5up.net/solid-state">html5up.net</a>.</p>
<p><a href="https://html5up.net/uploads/demos/solid-state/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2470" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.47.56-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.47.56-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.47.56-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.47.56-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.47.56-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<a href="https://html5up.net/uploads/demos/solid-state/" class="woo-sc-button  silver" ><span class="woo-">HTML5up</span></a>
<h2>Palantir</h2>
<p>Drupal agency&#8230; design, use of colors, CTAs with interesting layout, interactivity/rollover effects, forms, etc. Very clean and mobile-first design.</p>
<p><a href="https://palantir.net"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2471" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.48.37-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.48.37-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.48.37-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.48.37-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.48.37-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<a href="https://palantir.net/" class="woo-sc-button  silver" ><span class="woo-">Palantir.net</span></a>
<hr />
<h1>Drupal 8 Premium Themes</h1>
<p>These provide many more user interface elements than the base Bootstrap Drupal 8 Theme. Inexpensive jump-start for a project; typical price is $40-60.</p>
<p><a href="http://www.esors.com/demo/omni/consultancy/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2472" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.13-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.13-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.13-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.13-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.13-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<p><a href="http://fiprint.drupalet.com"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2473" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.40-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.40-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.40-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.40-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.49.40-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<p><a href="http://foundry.symphonythemes.net"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2474" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.09-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.09-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.09-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.09-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.09-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<p><a href="http://demo.morethanthemes.com/scholarly8/default/"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2475" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.43-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.43-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.43-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.43-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.50.43-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<p><a href="http://stack.symphonythemes.net"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2476" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.04-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.04-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.04-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.04-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.04-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<p><a href="http://okno.drupalet.com"><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2477" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.36-AM-712x1024.png?x25141" alt="" width="712" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.36-AM-712x1024.png?x25141 712w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.36-AM-209x300.png?x25141 209w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.36-AM-768x1104.png?x25141 768w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2017/07/screen-shot-2017-07-19-at-8.51.36-AM.png?x25141 1077w" sizes="auto, (max-width: 712px) 100vw, 712px" /></a></p>
<hr />
<h1>Resources:</h1>
<ul>
<li><a href="http://www.ecityinteractive.com/blog/elements-of-an-effective-university-website-design/">12 Elements of an Effective University Website Design<br />
</a><em>(Louis Miller, 4/14/16, <a href="http://www.ecityinteractive.com/blog/elements-of-an-effective-university-website-design/">ecityinteractive.com</a>)</em></li>
<li><a href="https://medium.com/microsoft-design/take-the-time-to-use-fewer-words-450e650cdaf7">Take the Time to Use Fewer Words</a><br />
<em>tl;dr: If a user experience needs an explanation, something is broken. Redesign until people do not need explanation.<br />
(Torrey Podmajersky, <a href="https://medium.com/microsoft-design/take-the-time-to-use-fewer-words-450e650cdaf7">Microsoft Design</a>)</em></li>
<li><a href="https://standards.usa.gov">U.S. Web Design Standards</a><br />
<em>Best practices in user interface and user experience, accessibility, etc.</em></li>
<li><a href="https://playbook.cio.gov">Digital Services Playbook</a><br />
<em>Tips for project management, design and execution of gov&#8217;t digital projects</em></li>
<li><a href="https://www.smashingmagazine.com/taking-pattern-libraries-next-level/">Taking Pattern Libraries to the Next Level</a><br />
<em>(Vitaly Friedman, <a href="https://www.smashingmagazine.com/taking-pattern-libraries-next-level/">smashingmagazine.com</a>)</em></li>
<li><a href="http://brentspore.com">Brent Spore &#8211; User Experience Designer</a><br />
<em>Case studies of high-profile projects for major clients</em></li>
<li><a href="http://brettjankord.com/projects/style-guide-boilerplate/">Style Guide Boilerplate<br />
</a><em>Catalog of the basic HTML user interface items; use to make a style guide page</em></li>
<li><a href="https://codepen.io/collection/AdpjMZ/2/">Magazine Article Inspired Layouts</a><br />
<em>These are nice for featured articles or landing pages; don&#8217;t look like web pages.</em></li>
<li><a href="https://www.microsoft.com/en-us/Design/inclusive">Microsoft Inclusive Design</a><br />
Opening up digital experiences to everyone, helping everyone interact with the world around them.</li>
</ul>
<p>The post <a href="https://chrisgilligan.com/drupal/university-website-redesign-scrapbook/">University Website Redesign: Scrapbook</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/drupal/university-website-redesign-scrapbook/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>YouTube Gallery snippet &#038; table transform for OU Campus</title>
		<link>https://chrisgilligan.com/consulting/youtube-gallery-snippet-table-transform-ou-campus/</link>
					<comments>https://chrisgilligan.com/consulting/youtube-gallery-snippet-table-transform-ou-campus/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Wed, 02 Mar 2016 18:20:55 +0000</pubDate>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[OU Campus]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=2401</guid>

					<description><![CDATA[<p>Here&#8217;s a neat way to present multiple YouTube videos in a responsive &#8220;gallery&#8221; in OU Campus. This example uses a mix of Bootstrap CSS and CSS specific to the gallery. Thanks to Wooster Web Design for the HTML/CSS/JS. With the YouTube Gallery snippet and XSL transform, you can create a video gallery of multiple YouTube [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/consulting/youtube-gallery-snippet-table-transform-ou-campus/">YouTube Gallery snippet &#038; table transform for OU Campus</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2016/03/screen-shot-2016-03-02-at-1.13.28-PM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p>Here&#8217;s a neat way to <a href="http://www.utc.edu/university-web-services/advanced/youtube-gallery.php" target="_blank">present multiple YouTube videos in a responsive &#8220;gallery&#8221;</a> in OU Campus. This example uses a mix of Bootstrap CSS and CSS specific to the gallery. Thanks to <a href="http://www.woosterwebdesign.com/responsive-youtube-player-with-playlist/" target="_blank">Wooster Web Design</a> for the HTML/CSS/JS.</p>
<p>With the YouTube Gallery snippet and XSL transform, you can create a video gallery of multiple YouTube videos, selectable by clicking thumbnail images.</p>
<p>Here&#8217;s the table transform snippet (add HTML to /_resources/ou/snippets, then create new item in Content &gt; Snippets).</p>
<pre class="theme:monokai lang:default decode:true" title="YouTube Gallery table transform snippet">&lt;table class="ou-youtube-gallery transform" style="width: 100%;"&gt;
	&lt;caption&gt;YouTube Gallery Table&lt;/caption&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th width="30%"&gt;Title&lt;/th&gt;
			&lt;th&gt;YouTube ID (code after "watch?v=" e.g. G4RT-prDbIw in youtube.com/watch?v=G4RT-prDbIw or youtu.be/G4RT-prDbIw)&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td&gt;
			My YouTube Video
			&lt;/td&gt;
			&lt;td&gt;
			G4RT-prDbIw
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;
			Another YouTube Video
			&lt;/td&gt;
			&lt;td&gt;
			o5ZymO9UgjM
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
</pre>
<p>Here&#8217;s the XSL template match; this belongs in an XSL file such as common.xsl or interior.xsl.</p>
<pre class="theme:monokai lang:default decode:true " title="XSL template match for YouTube Gallery snippet">&lt;!-- transform YouTube Gallery --&gt;
&lt;xsl:template match="table[contains(@class, 'ou-youtube-gallery')]"&gt;
	&lt;xsl:variable name="id" select="position()" /&gt;
  	&lt;style type="text/css"&gt;
		@import url(//www.yourdomain.edu/_resources/css/youtube-gallery.css);
  	&lt;/style&gt;
	&lt;script type="text/javascript" src="/_resources/js/youtube-gallery.js?x25141" /&gt;

	&lt;div class="well"&gt;
		&lt;!-- THE YOUTUBE PLAYER --&gt;
		&lt;div class="vid-container"&gt;
			&lt;iframe id="vid_frame{$id}" frameborder="0" width="560" height="315"&gt;
				&lt;xsl:attribute name="src"&gt;https://www.youtube.com/embed/&lt;xsl:value-of select="./tbody/tr[1]/td[2]//text()"/&gt;?rel=0&amp;amp;showinfo=0&amp;amp;autohide=1&lt;/xsl:attribute&gt;
			&lt;/iframe&gt;
		&lt;/div&gt;

		&lt;!-- THE PLAYLIST --&gt;
		&lt;div class="vid-list-container"&gt;
			&lt;div class="vid-list"&gt;

				&lt;xsl:for-each select="./tbody/tr"&gt;
					&lt;div class="vid-item" onclick="document.getElementById('vid_frame{$id}').src='https://youtube.com/embed/{td[2]//text()}?autoplay=1&amp;amp;rel=0&amp;amp;showinfo=0&amp;amp;autohide=1'"&gt;

						&lt;div class="thumb"&gt;&lt;img alt="video thumbnail" src="https://img.youtube.com/vi/{td[2]//text()}/0.jpg" /&gt;&lt;/div&gt;

						&lt;div class="desc"&gt;&lt;xsl:value-of select="td[1]//text()" /&gt;&lt;/div&gt;

					&lt;/div&gt;
				&lt;/xsl:for-each&gt;

			&lt;/div&gt;&lt;!--/vid-list--&gt;
		&lt;/div&gt;&lt;!--/vid-container--&gt;

		&lt;!-- LEFT AND RIGHT ARROWS --&gt;
		&lt;div class="arrows"&gt;
			&lt;div class="arrow-left"&gt;&lt;i class="icon-chevron-left icon-large"&gt;&lt;!--scroll left--&gt;&lt;/i&gt;&lt;/div&gt;
			&lt;div class="arrow-right"&gt;&lt;i class="icon-chevron-right icon-large"&gt;&lt;!--scroll right--&gt;&lt;/i&gt;&lt;/div&gt;
		&lt;/div&gt;

	&lt;/div&gt;
&lt;/xsl:template&gt;
</pre>
<p>And here are the .js for scrolling and .css for styling</p>
<pre class="theme:monokai lang:js decode:true " title=".js for scrolling">//www.woosterwebdesign.com/responsive-youtube-player-with-playlist/

$(document).ready(function () {
		    $(".arrow-right").bind("click", function (event) {
		        event.preventDefault();
		        $(".vid-list-container").stop().animate({
		            scrollLeft: "+=336"
		        }, 750);
		    });
		    $(".arrow-left").bind("click", function (event) {
		        event.preventDefault();
		        $(".vid-list-container").stop().animate({
		            scrollLeft: "-=336"
		        }, 750);
		    });
		});</pre>
<pre class="theme:monokai lang:css decode:true ">/* styles responsive YouTube Gallery with scrolling thumbnails */
/** /www.woosterwebdesign.com/responsive-youtube-player-with-playlist/ **/

/*  VIDEO PLAYER CONTAINER
############################### */
.vid-container {
	position: relative;
	padding-bottom: 52%;
	padding-top: 30px; 
	height: 0; 
}

.vid-container iframe,
.vid-container object,
.vid-container embed {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}


/*  VIDEOS PLAYLIST 
############################### */
.vid-list-container {
	width: 92%;
	overflow: hidden;
	margin-top: 20px;
	margin-left:4%;
	padding-bottom: 20px;
}

.vid-list {
	width: 3680px;
	position: relative;
	top:0;
	left: 0;
}

.vid-item {
	display: block;
	width: 148px;
	height: 148px;
	float: left;
	margin: 0;
	padding: 10px;
}

.thumb {
	/*position: relative;*/
	overflow:hidden;
	height: 84px;
}

.thumb img {
	width: 100%;
	position: relative;
	top: -13px;
}

.vid-item .desc {
	color: #21A1D2;
	font-size: 15px;
	margin-top:5px;
}

.vid-item:hover {
	background: #eee;
	cursor: pointer;
}

.arrows {
	position:relative;
	width: 100%;
}

.arrow-left {
	color: #fff;
	position: absolute;
	background: #777;
	padding: 15px;
	left: -25px;
	top: -130px;
	z-index: 99;
	cursor: pointer;
}

.arrow-right {
	color: #fff;
	position: absolute;
	background: #777;
	padding: 15px;
	right: -25px;
	top: -130px;
	z-index:100;
	cursor: pointer;
}

.arrow-left:hover {
	background: #CC181E;
}

.arrow-right:hover {
	background: #CC181E;
}


@media (max-width: 624px) {
	body {
		margin: 15px;
	}
	.caption {
		margin-top: 40px;
	}
	.vid-list-container {
		padding-bottom: 20px;
	}

	/* reposition left/right arrows */
	.arrows {
		position:relative;
		margin: 0 auto;
		width:96px;
	}
	.arrow-left {
		left: 0;
		top: -17px;
	}

	.arrow-right {
		right: 0;
		top: -17px;
	}
}
</pre>
<p>&#8230;and, finally, some instructions for use:</p>
<blockquote><p>Click the Insert Snippet button, then choose category Video/Embedded Media &gt; YouTube Gallery</p>
<p>This will insert a table in which you enter Title and YouTube ID for each video. This creates a gallery as shown below. To insert additional videos, click the cursor on a table row, then click the Table button, and choose Row &gt; Insert Row Before (or after), then enter the additional title and ID.</p></blockquote>
<p>&nbsp;</p>
<p>The post <a href="https://chrisgilligan.com/consulting/youtube-gallery-snippet-table-transform-ou-campus/">YouTube Gallery snippet &#038; table transform for OU Campus</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/consulting/youtube-gallery-snippet-table-transform-ou-campus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Integrating Content from External Sources into OU Campus Using RSS, PHP, and JavaScript</title>
		<link>https://chrisgilligan.com/consulting/integrating-content-from-external-sources-into-ou-campus-using-rss-php-and-javascript/</link>
					<comments>https://chrisgilligan.com/consulting/integrating-content-from-external-sources-into-ou-campus-using-rss-php-and-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Tue, 23 Feb 2016 00:50:35 +0000</pubDate>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[OU Campus]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=2386</guid>

					<description><![CDATA[<p>The web team of the University of Tennessee at Chattanooga&#160;uses PHP and RSS to syndicate blog content, news releases, and calendar events into their main website. PHP SimpleXML is used to parse the XML of the RSS feeds. We import a variety of feeds, from WordPress, from Master Calendar, and from other sites such as [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/consulting/integrating-content-from-external-sources-into-ou-campus-using-rss-php-and-javascript/">Integrating Content from External Sources into OU Campus Using RSS, PHP, and JavaScript</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2016/02/screen-shot-2016-02-22-at-4.45.18-PM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p><strong>The web team of the University of Tennessee at Chattanooga</strong>&nbsp;uses PHP and RSS to syndicate blog content, news releases, and calendar events into their main website.</p>
<p><a href="http://php.net/manual/en/book.simplexml.php" target="_blank" rel="noopener noreferrer">PHP SimpleXML</a> is used to parse the XML of the RSS feeds. We import a variety of feeds, from WordPress, from Master Calendar, and from other sites such as an external athletics CMS. WordPress provides some RSS features, including RSS from categories, tags and search strings, but we have added media attachments and a customized template to output a more complicated RSS feed on the University home page.</p>
<ul>
<li><em>this is a companion blog post for a <a href="https://s3.amazonaws.com/cgilligan-share/OUTC16-presentation-chris-gilligan-php-rss-ou-campus.pdf">presentation</a> given at<br />
<a href="https://www.outc16.com" target="_blank" rel="noopener noreferrer">OmniUpdate OU Campus User Training Conference 2016</a></em></li>
<li><em>shortcut to this blog post:&nbsp;<a href="http://utc.edu/outc16">utc.edu/outc16</a></em></li>
<li><em>links below are production&nbsp;examples of the concepts outlined in this post</em></li>
</ul>
<h2>News releases, events and content from WordPress via RSS</h2>
<p>Example web pages:</p>
<ul>
<li><a href="http://www.utc.edu/sustainability/" target="_blank" rel="noopener noreferrer">OU Campus PHP page with news feed and events feed from WordPress</a></li>
<li><a href="http://www.utc.edu/athletics/" target="_blank" rel="noopener noreferrer">OU Campus PHP page with news feed from SideArm Sports</a></li>
</ul>
<h3>WordPress plugin &amp; PHP to add media attachments to RSS feed</h3>
<p>Example RSS feeds <em>(view XML/XSL styled page in FireFox; View Source to see XML structure, namespaces, node names and structure)</em>:</p>
<ul>
<li><a href="http://watoosa.com/feed/" target="_blank" rel="noopener noreferrer">normal WordPress RSS feed</a></li>
<li><a href="http://blog.utc.edu/news/headlines.xml/" target="_blank" rel="noopener noreferrer">customized WordPress feed with additional namespace and media attachments</a>
<ul>
<li>headlines-customfeed.php&nbsp;<em>(custom feed template)</em></li>
<li>functions.php: load_template&nbsp;<em>(registers and loads the custom feed template)</em></li>
</ul>
</li>
<li><a href="http://gomocs.com/rss.aspx" target="_blank" rel="noopener noreferrer">RSS feed with inline images</a>&nbsp;<em>(open in Firefox to see XML &amp; XSL)</em></li>
</ul>
<p>Custom WordPress RSS feed template, followed by the functions call to load and create it:</p>
<pre class="theme:monokai lang:php decode:true " title="custom-headlines.php goes in (child) template directory">&lt;?php
/*
Template Name: Custom Current Headlines Feed

*/

$numposts = 10;
$category_id = get_cat_ID('Current Headlines');

function custom_rss_date( $timestamp = null ) {
  $timestamp = ($timestamp==null) ? time() : $timestamp;
  echo date(DATE_RSS, $timestamp);
}

function custom_rss_text_limit($string, $length, $replacer = '&amp;hellip;') { 
  $string = strip_tags($string);
  if(strlen($string) &gt; $length) 
    return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;   
  return $string; 
}

$posts = query_posts('cat='.$category_id.'&amp;showposts='.$numposts);

$lastpost = $numposts - 1;



header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true);
$more = 1;

echo '&lt;?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'&gt;'; ?&gt;

&lt;rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	&lt;?php do_action('rss2_ns'); ?&gt;
&gt;

&lt;channel&gt;
	&lt;title&gt;&lt;?php bloginfo_rss('name'); wp_title_rss(); ?&gt;&lt;/title&gt;
	&lt;atom:link href="&lt;?php self_link(); ?&gt;" rel="self" type="application/rss+xml" /&gt;
	&lt;link&gt;&lt;?php bloginfo_rss('url') ?&gt;&lt;/link&gt;
	&lt;description&gt;&lt;?php bloginfo_rss("description") ?&gt;&lt;/description&gt;
	&lt;lastBuildDate&gt;&lt;?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?&gt;&lt;/lastBuildDate&gt;
	&lt;language&gt;&lt;?php bloginfo_rss( 'language' ); ?&gt;&lt;/language&gt;
	&lt;sy:updatePeriod&gt;&lt;?php echo apply_filters( 'rss_update_period', 'hourly' ); ?&gt;&lt;/sy:updatePeriod&gt;
	&lt;sy:updateFrequency&gt;&lt;?php echo apply_filters( 'rss_update_frequency', '1' ); ?&gt;&lt;/sy:updateFrequency&gt;
	&lt;?php do_action('rss2_head'); ?&gt;
	&lt;?php while( have_posts()) : the_post(); ?&gt;
	&lt;item&gt;
		&lt;title&gt;&lt;?php the_title_rss() ?&gt;&lt;/title&gt;
		&lt;link&gt;&lt;?php the_permalink_rss() ?&gt;&lt;/link&gt;
		&lt;comments&gt;&lt;?php comments_link_feed(); ?&gt;&lt;/comments&gt;
		&lt;pubDate&gt;&lt;?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?&gt;&lt;/pubDate&gt;
		&lt;dc:creator&gt;&lt;?php the_author() ?&gt;&lt;/dc:creator&gt;
&lt;?php the_category_rss('rss2') ?&gt;
		&lt;guid isPermaLink="false"&gt;&lt;?php the_guid(); ?&gt;&lt;/guid&gt;
&lt;?php if (get_option('rss_use_excerpt')) : ?&gt;
		&lt;description&gt;&lt;![CDATA[&lt;?php get_the_excerpt(); ?&gt;]]&gt;&lt;/description&gt;
&lt;?php else : ?&gt;
		&lt;description&gt;&lt;?php echo '&lt;![CDATA['.custom_rss_text_limit($post-&gt;post_content, 256).']]&gt;';  ?&gt;&lt;/description&gt;
&lt;?php $content = get_the_content_feed('rss2'); ?&gt;
	&lt;?php if ( strlen( $content ) &gt; 0 ) : ?&gt;
		&lt;content:encoded&gt;&lt;![CDATA[&lt;?php echo $content; ?&gt;]]&gt;&lt;/content:encoded&gt;
	&lt;?php else : ?&gt;
		&lt;content:encoded&gt;&lt;![CDATA[&lt;?php the_excerpt(); ?&gt;]]&gt;&lt;/content:encoded&gt;
	&lt;?php endif; ?&gt;
&lt;?php endif; ?&gt;
		&lt;wfw:commentRss&gt;&lt;?php echo esc_url( get_post_comments_feed_link(null, 'rss2') ); ?&gt;&lt;/wfw:commentRss&gt;
		&lt;slash:comments&gt;&lt;?php echo get_comments_number(); ?&gt;&lt;/slash:comments&gt;
&lt;?php rss_enclosure(); ?&gt;
&lt;?php do_action('rss2_item'); ?&gt;
		&lt;/item&gt;
	&lt;?php endwhile; ?&gt;
&lt;/channel&gt;
&lt;/rss&gt;
</pre>
<pre class="theme:monokai lang:php decode:true " title="goes in functions.php to load the custom feed">/* Custom RSS Feed for Home Page headlines */

function create_my_customfeed() {
load_template( get_stylesheet_directory() . '/headlines-customfeed.php');
}
add_action('do_feed_headlines', 'create_my_customfeed', 10, 1);
</pre>
<h3>OU Campus PHP helper file and code asset</h3>
<p>To parse an existing external RSS feed, such as a standard or custom WordPress feed, we use a helper file that employs PHP&#8217;s simplexml_load_string to load the targeted RSS feed, traverse the XML document, select node content, then echo out a block of styled html for each set of targeted XML nodes. The helper file accepts&nbsp;the $feed variable to specify the location of the targeted feed, and the $maxitems variable to specify the number of items to select from the top of the that feed.</p>
<p>On its own, the PHP helper file can be hit in a browser, to verify the targeted feed type exists and is parsed correctly. The browser will return an un-styled&nbsp;html page from the helper file URL.</p>
<p>The OU Campus Code Asset includes the helper file, over-rides the helper&#8217;s default variables, is and is very simple to copy and modify, according to the intended target feed and desired number of items to be presented on the final page. Many different Assets can include a single helper file.</p>
<p><em>(Vinit from OmniUpdate outlined a much better way to handle the feed URL and number of items in his Server Side Scripting class: via PCF Page Parameters.)</em></p>
<h3>PHP file</h3>
<ul>
<li><a href="http://www.utc.edu/_resources/php/get-headlines-gomocs.php" target="_blank" rel="noopener noreferrer">parses feed and displays HTML</a>
<ul>
<li>variables set to defaults for testing
<ul>
<li>may need to verify feed access and XML structure</li>
</ul>
</li>
</ul>
</li>
<li>various types of display html
<ul>
<li>title, excerpt, thumbnail from WordPress</li>
<li>title only from WordPress</li>
<li>RSS feed with formatting or namespaces different&nbsp;from WordPress</li>
</ul>
</li>
</ul>
<pre class="theme:monokai lang:php decode:true" title="/_resources/get-headlines-sidebar.php">&lt;?php

$input = $_SERVER['QUERY_STRING'];
parse_str($input);

if (!isset($feed))//script or page property will choose which feed to display
	$feed = "http://blog.utc.edu/news/headlines.xml/";

if(!isset($maxitems))
	$maxitems = 3;

$file = file_get_contents($feed);
$file = str_ireplace('src="http://', 'src="//', $file);
$file = str_ireplace('media:content url="http://', 'media:content url="//', $file);
$file = str_ireplace('media:thumbnail url="http://', 'media:thumbnail url="//', $file);

$sxml = simplexml_load_string($file);

$i = 0;
	foreach ($sxml-&gt;channel-&gt;item as $item) {
		if (++$i &gt; $maxitems) {
				break;
			}
		$namespaces      = $item-&gt;getNameSpaces( true );
		$content         = isset($namespaces['content']) ? $item-&gt;children( $namespaces['content'] ) : '';
		$content_encoded = isset($content-&gt;encoded)      ? $content-&gt;encoded                         : '';
		$media           = isset($namespaces['media'])   ? $item-&gt;children( $namespaces['media'] )   : '';
		$html       = "&lt;div class=\"row-fluid\"&gt;"
					.     "&lt;h3&gt;&lt;a href=\"{$item-&gt;link}\"&gt;{$item-&gt;title}&lt;/a&gt;&lt;/h3&gt;"
					.     "{$content_encoded}"
					.  "&lt;/div&gt;";
	echo($html);
}
?&gt;
&lt;script&gt;
	$(document).ready(function(){
		$('.sidebar img').removeClass().addClass('thumbnail pull-right span5');
		$('aside.well img').removeClass().addClass('thumbnail pull-right span5');
	});
&lt;/script&gt;
</pre>
<h3>OU Campus Assets</h3>
<ul>
<li>simple structure
<ul>
<li>specify RSS source</li>
<li>number of posts to display</li>
</ul>
</li>
</ul>
<pre class="lang:php decode:true " title="OU Campus Asset">&lt;?php
$feed = "//blog.utc.edu/hr/category/benefits/feed/";
include($_SERVER['DOCUMENT_ROOT']. '/_resources/php/get-headlines-sidebar.php');
$maxitems = 5;
?&gt;</pre>
<p><em>(Vinit from OmniUpdate outlined a much better way to handle the feed URL and number of items in his Server Side Scripting class: via PCF Page Parameters.)</em></p>
<h3>More Speed</h3>
<p>After you verify the final production page, you should set up cron jobs for any external feeds that are created via database calls on the external servers. A&nbsp;WordPress feed will require a bit of PHP and MySQL work to generate the RSS feed. This requires some processing, and will introduce a delay in service of the OU Campus PHP page. To avoid this latency, we create cron jobs on the production server to periodically fetch the feeds and cache them locally on the production server. The speed increase for the final page product is noticeable.</p>
<p>If your OU Campus Sites include development, test, training, or mobile Sites, you will want to duplicate the local static feeds on all of the OU Sites.</p>
<p>If you control an external WordPress site, you can&nbsp;employ caching mechanisms or plugins to more efficiently serve RSS feeds.</p>
<ul>
<li>cache RSS feeds via WordPress plugin, e.g. W3 &nbsp;Total Cache</li>
<li>cron job to fetch feeds to local production servers</li>
<li>minimize external requests for faster page load</li>
</ul>
<p>This cron job can be placed in /etc/cron.hourly to fetch WordPress feeds, check <code>lastBuildDate</code>, and compare that to the existing build date, and create a cached RSS xml file.</p>
<pre class="theme:monokai lang:default decode:true" title="wget the feeds to local via cron">#!/bin/bash

# Preload WordPress Feeds for Website

# UTC News
wget http://blog.utc.edu/news/headlines.xml/ -O /data/web/prod/www/_resources/rss/wp-news.tmp &gt;/dev/null 2&gt;&amp;1
TMP_LASTBUILD="$(xml_grep '/rss/channel/lastBuildDate' --text_only /data/web/prod/www/_resources/rss/wp-news.tmp)"
XML_LASTBUILD="$(xml_grep '/rss/channel/lastBuildDate' --text_only /data/web/prod/www/_resources/rss/wp-news.xml)"
MIMETYPE=`file -b --mime-type /data/web/prod/www/_resources/rss/wp-news.tmp`
if [ "$MIMETYPE" == "application/xml" -a  "$TMP_LASTBUILD" != "$XML_LASTBUILD" ] ; then
    mv /data/web/prod/www/_resources/rss/wp-news.tmp /data/web/prod/www/_resources/rss/wp-news.xml
fi

# Duplicate for development, test &amp; training environments
cp -p /data/web/prod/www/_resources/rss/wp*.xml /data/web/test/www/_resources/rss/
cp -p /data/web/prod/www/_resources/rss/wp*.xml /data/web/test/train/_resources/rss/
cp -p /data/web/prod/www/_resources/rss/wp*.xml /data/web/dev/www/_resources/rss/
</pre>
<p>For other RSS sources, the structure may be different; maybe we can&#8217;t do a <code>lastBuildDate</code> check. And&#8230; some servers may not respond to a default wget request from a shell script. No problem: just specify <code>--header</code> and <code>--user-agent</code>, don&#8217;t do the <code>lastBuildDate</code> check, and just write the RSS XML file.</p>
<pre class="theme:monokai lang:default decode:true">#!/bin/bash

# Preload GoMocs Feeds for Website


# Gomocs.com News
wget  --header="Accept: text/html" --user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0" http://www.gomocs.com/rss.aspx -O /data/web/prod/www/_resources/gomocs-news.xml

# Duplicate for development, test &amp; training environments
cp -p /data/web/prod/www/_resources/rss/gomocs*.xml /data/web/test/www/_resources/rss/
cp -p /data/web/prod/www/_resources/rss/gomocs*.xml /data/web/test/train/_resources/rss/
cp -p /data/web/prod/www/_resources/rss/gomocs*.xml /data/web/dev/www/_resources/rss/</pre>
<h2>Event Calendar RSS feeds from Master Calendar via RSS</h2>
<p>Example pages that include feeds from Master Calendar. MC has a very rudimentary RSS output of title, date/time and description. MC caches its RSS feeds by default, and expects a lot of traffic to the feed locations, so it is not so necessary to create cron jobs to fetch them. However, if you have an OU Campus page that fetches and displays a large number of MC feeds, you will see a performance increase by using cron jobs. UTC.edu&#8217;s home page fetches a number of feeds, and we saw a noticeably faster page load after moving these calls to cron jobs.</p>
<ul>
<li><a href="http://www.utc.edu/" target="_blank" rel="noopener noreferrer">home page tabbed calendar</a></li>
<li><a href="http://www.utc.edu/music/" target="_blank" rel="noopener noreferrer">simple sidebar calendar</a></li>
</ul>
<h2>Social Media Streams</h2>
<p><strong>UTC uses a jQuery plugin and PHP</strong>&nbsp;to pull in social media posts for the university account, as well as for individual departments and colleges. This is an easy way to create a social stream sidebar or social wall page.</p>
<ul>
<li><a href="http://codecanyon.net/item/jquery-social-stream/2103997" target="_blank" rel="noopener noreferrer">jQuery Social Stream</a></li>
<li><a href="http://www.utc.edu/read-achieve/" target="_blank" rel="noopener noreferrer">program site with Twitter feed</a></li>
<li><a href="http://www.utc.edu/" target="_blank" rel="noopener noreferrer">home page with multiple feeds in a sidebar stream</a></li>
<li><a href="http://www.utc.edu/mocs-news/" target="_blank" rel="noopener noreferrer">social wall page with YouTube videos</a></li>
</ul>
<p><em>Facebook, Twitter and Instagram require PHP &nbsp;API script for connection to signed apps.<a href="http://lulalake.org/" target="_blank" rel="noopener noreferrer">&nbsp;jquery.imagesloaded</a>&nbsp;is helpful for the wall display</em></p>
<h2>Code Samples</h2>
<p><em>(A compilation zip including all code mentioned in the presentation is available. Comment and subscribe to this post&nbsp;to be notified of updates.)</em></p>
<ul>
<li>WordPress plugin to add media attachments to RSS feed</li>
<li>WordPress functions.php changes</li>
<li>PHP files to parse feeds and display HTML</li>
<li>OU Campus Assets to specify RSS source and set number of posts</li>
<li>cron job to fetch RSS feeds to local server</li>
</ul>
<p>The post <a href="https://chrisgilligan.com/consulting/integrating-content-from-external-sources-into-ou-campus-using-rss-php-and-javascript/">Integrating Content from External Sources into OU Campus Using RSS, PHP, and JavaScript</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/consulting/integrating-content-from-external-sources-into-ou-campus-using-rss-php-and-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TEDx Event Website</title>
		<link>https://chrisgilligan.com/portfolio/tedx-event-website/</link>
					<comments>https://chrisgilligan.com/portfolio/tedx-event-website/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Wed, 04 Nov 2015 17:13:14 +0000</pubDate>
				<category><![CDATA[Arts and Nonprofit]]></category>
		<category><![CDATA[NginX]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Virtualmin]]></category>
		<category><![CDATA[Web Server Performance Tuning]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=2342</guid>

					<description><![CDATA[<p>I&#8217;m very excited to help out with Chattanooga&#8217;s premier TEDx event: TEDxChattanooga. For this site, I chose a responsive Bootstrap 3 SASS WordPress theme, originally developed for TEDxToronto. I made a few tweaks and improvements to better fit our event, and worked with April Cox from UT Chattanooga to dial in&#160;the design and architecture. Developed&#160;on [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/portfolio/tedx-event-website/">TEDx Event Website</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.46.47-AM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p>I&#8217;m very excited to help out with Chattanooga&#8217;s premier TEDx event: <a href="https://www.tedxchattanooga.com/">TEDxChattanooga</a>.</p>
<div id="attachment_2346" style="width: 933px" class="wp-caption aligncenter"><a href="http://www.tedxchattanooga.com/"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2346" class="size-large wp-image-2346" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.46.47-AM-923x1024.png?x25141" alt="TEDxChattanooga website screenshot" width="923" height="1024" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.46.47-AM-923x1024.png?x25141 923w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.46.47-AM-270x300.png?x25141 270w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.46.47-AM.png?x25141 1378w" sizes="auto, (max-width: 923px) 100vw, 923px" /></a><p id="caption-attachment-2346" class="wp-caption-text">TEDxChattanooga website</p></div>
<p><a href="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.51.25-AM.png?x25141"><img loading="lazy" decoding="async" class="size-medium wp-image-2343 alignright" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.51.25-AM-177x300.png?x25141" alt="screen-shot 2015-11-04 at 11.51.25 AM" width="177" height="300" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.51.25-AM-177x300.png?x25141 177w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.51.25-AM-605x1024.png?x25141 605w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.51.25-AM.png?x25141 616w" sizes="auto, (max-width: 177px) 100vw, 177px" /></a>For this site, I chose a responsive Bootstrap 3 SASS WordPress theme, originally developed for TEDxToronto. I made a few tweaks and improvements to better fit our event, and worked with April Cox from UT Chattanooga to dial in&nbsp;the design and architecture. Developed&nbsp;on an Amazon EC2+Ubuntu+Webmin&nbsp;server running a Nginx+MySQL+PHP-FPM stack, the site&nbsp;should handle plenty of traffic, and can be scaled up to meet spikes in demand coinciding with the event.</p>
<p>Please check out <a href="http://www.tedxchattanooga.com/">TEDxChattanooga.com</a>!</p>
<p>Love Open Source software, but hate the generic&nbsp;branding? No problem. It&#8217;s very simple to create a fully-branded login&nbsp;screen for&nbsp;WordPress and Webmin/Virtualmin, to&nbsp;match a client&#8217;s logo and color scheme.</p>
<hr>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2344 size-medium" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.49.19-AM-283x300.png?x25141" alt="screen-shot 2015-11-04 at 11.49.19 AM" width="283" height="300" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.49.19-AM-283x300.png?x25141 283w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-11.49.19-AM.png?x25141 616w" sizes="auto, (max-width: 283px) 100vw, 283px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2347 size-full" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.06.49-PM.png?x25141" alt="screen-shot 2015-11-04 at 12.06.49 PM" width="969" height="865" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.06.49-PM.png?x25141 969w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.06.49-PM-300x268.png?x25141 300w" sizes="auto, (max-width: 969px) 100vw, 969px" /></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-large wp-image-2348" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.09.52-PM-1024x793.png?x25141" alt="screen-shot 2015-11-04 at 12.09.52 PM" width="1024" height="793" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.09.52-PM-1024x793.png?x25141 1024w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.09.52-PM-300x232.png?x25141 300w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2015/11/screen-shot-2015-11-04-at-12.09.52-PM.png?x25141 1061w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>The post <a href="https://chrisgilligan.com/portfolio/tedx-event-website/">TEDx Event Website</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/portfolio/tedx-event-website/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Fail2Ban RegEx for RedHat, CentOS, Amazon Linux</title>
		<link>https://chrisgilligan.com/consulting/wordpress-wp-fail2ban-regex-redhat-centos-amazon-linux/</link>
					<comments>https://chrisgilligan.com/consulting/wordpress-wp-fail2ban-regex-redhat-centos-amazon-linux/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Thu, 30 May 2013 00:30:24 +0000</pubDate>
				<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Cpanel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Virtualmin]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=1875</guid>

					<description><![CDATA[<p>VacantServer WordPress sites are getting hammered with bad logins and probes. We&#8217;ve implemented a plugin to log failed login attempts to syslog, and a Fail2Ban filter for the same. If you run these on RedHat, you&#8217;ll need some additional configuration info&#8230; here it is: WordPress login failure regex (error_log): ^%(__prefix_line)sAuthentication failure for .* from &#60;HOST&#62;$ [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/consulting/wordpress-wp-fail2ban-regex-redhat-centos-amazon-linux/">WordPress Fail2Ban RegEx for RedHat, CentOS, Amazon Linux</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong><a href="http://vacantserver.net/">VacantServer</a> WordPress sites are getting hammered with bad logins and probes.</strong></p>
<p>We&#8217;ve implemented a <a href="http://wordpress.org/extend/plugins/wp-fail2ban/">plugin to log failed login attempts to syslog</a>, and a Fail2Ban filter for the same. If you run these on RedHat, you&#8217;ll need some additional configuration info&#8230; here it is:</p>
<div>
<div><strong>WordPress login failure regex (error_log):</strong></div>
<div>
<pre class="lang:default decode:true ">^%(__prefix_line)sAuthentication failure for .* from &lt;HOST&gt;$</pre>
<p><strong>Apache nohome regex (error_log):</strong></p>
</div>
<div>
<pre class="lang:default decode:true ">[[]client &lt;HOST&gt;[]] File does not exist: .*/~.*</pre>
<p><strong>PHP noscript regex (/home/*/logs/error_log,/var/log/httpd/error_log):</strong></p>
</div>
<div>
<pre class="lang:default decode:true">[[]client &lt;HOST&gt;[]] (File does not exist|script not found or unable to stat): /\S*(\.php|\.asp|\.exe|\.pl)
[[]client &lt;HOST&gt;[]] script '/\S*(\.php|\.asp|\.exe|\.pl)\S*' not found or unable to stat *$</pre>
<p><strong>XMLRPC flood attacks &#8212; DDoS and probing (/home/*/logs/access_log):</strong></p>
<pre class="lang:default decode:true crayon-selected">&lt;HOST&gt;\s.*\s.POST\s/xmlrpc.php*.\s.*</pre>
<p>Please also enable the generic apache-nohome, apache-noscript. Install wp fail2ban plugin (and configure it for your server) on your high traffic blogs. These all are helping during the current onslaught, which also includes probing for wp-admin directories, probing for /wp-admin/login.php, plus comment spam.</p>
<p>A new XMLRPC exploit has the script kiddies doing DDoS and probing for vulnerable services, and possibly doing remote code execution on vulnerable services.</p>
<h4>Here are some additional resources:</h4>
<ul>
<li>RegEx testing tool: <a href="http://gskinner.com/RegExr/">RegExr (AIR and web versions)</a></li>
<li>use <a href="http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Testing">Fail2Ban&#8217;s built-in regex testing</a></li>
<li>additionally, try <a href="http://23x.net/908/securing-wordpress-using-fail2ban.html">23x&#8217;s Apache WordPress Fail2Ban advice</a></li>
<li>block spammer IP&#8217;s via <a href="http://blog.shadypixel.com/spam-log-plugin/">Akismet: Spam-Log Plugin</a></li>
</ul>
</div>
</div>
<p>The post <a href="https://chrisgilligan.com/consulting/wordpress-wp-fail2ban-regex-redhat-centos-amazon-linux/">WordPress Fail2Ban RegEx for RedHat, CentOS, Amazon Linux</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/consulting/wordpress-wp-fail2ban-regex-redhat-centos-amazon-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fail2Ban Regex for RedHat, Fedora, CentOS and Amazon Linux 2013</title>
		<link>https://chrisgilligan.com/consulting/amazon-web-services/fail2ban-regex/</link>
					<comments>https://chrisgilligan.com/consulting/amazon-web-services/fail2ban-regex/#comments</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Sat, 20 Apr 2013 01:07:24 +0000</pubDate>
				<category><![CDATA[Amazon Web Services]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=1831</guid>

					<description><![CDATA[<p>Fail2Ban is a very efficient daemon that scans log files for malicious activity, and offers several options to ban offending IPs and hostnames. Although it is highly configurable, it requires a depth of knowledge beyond that required for GUI-accessible firewalls such as ConfigServer Security &#38; Firewall. Harden the Kernel Before do anything further, it is [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/consulting/amazon-web-services/fail2ban-regex/">Fail2Ban Regex for RedHat, Fedora, CentOS and Amazon Linux 2013</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2013/04/Screen-Shot-2013-04-19-at-6.32.51-PM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p><a href="http://www.fail2ban.org/">Fail2Ban</a> is a very efficient daemon that scans log files for malicious activity, and offers several options to ban offending IPs and hostnames. Although it is highly configurable, it requires a depth of knowledge beyond that required for GUI-accessible firewalls such as <a href="http://configserver.com/">ConfigServer Security &amp; Firewall</a>.</p>
<h3>Harden the Kernel</h3>
<p>Before do anything further, it is necessary to harden the server at the kernel level. Doing so will prevent the majority of attacks that Fail2Ban config will have to deal with. Do this: <a href="http://www.cyberciti.biz/faq/linux-kernel-etcsysctl-conf-security-hardening/">Linux kernel sysctl hardening</a>. Prior to learning those trix, I had solely relied upon <a href="http://configserver.com/">ConfigServer Security and Firewall </a>(CSF) to block malicious attacks. Heading those off at the kernel level is much more efficient.</p>
<p>I&#8217;m a huge fan of CSF, having used it with cPanel, Webmin and Virtualmin for many years. Moving to Amazon Web Services presented a challenge, however. I&#8217;ve yet to figure out how to use CSF on AWS, so I&#8217;ve backtracked to my old standby, Fail2Ban.</p>
<p>&#8220;Out of the box,&#8221; Fail2Ban for CentOS &amp; other RedHat downstream distros only provides protection against SASL login failures. But with a little work and research, one can successfully configure many more &#8220;jails&#8221; for the malicious traffic. To take full advantage of Fail2Ban, the admin will need to become familiar with RegEx: regular expressions.</p>
<h3>Amazon Web Services Security Groups</h3>
<p>AWS provides several levels of firewall protection for EC2 instances; I mainly utilize EC2 security groups and VPC security groups. These firewalls serve to allow traffic to an instance based on IP address, IP block, port, etc. VPC will gateway traffic to and within a virtual cloud; one can create a security group for a cohort of replicated database servers to only allow traffic from within the virtual cloud. Likewise, one could create a cloud group with public facing, load-balanced Varnish reverse proxies that interact with an Apache or NginX app server, and that app server connects to the database cohort. The only publicly-accessible servers would be the web proxies. This is similar to what one might expect in a traditional network operations center.</p>
<h3>Learn some RegEx</h3>
<p>Learning a bit about RegEx will benefit the admin in virtually every programming endeavor: PHP, Perl, C, SQL etc. all make use of RegEx to match strings of text. Matching a variable string of text in a log file, for example, allows Fail2Ban to act upon that string, sending an email, looking up a hostname, and/or invoking a firewall rule to block traffic from the offending origin for a designated amount of time.</p>
<p>As stated earlier, plain vanilla Fail2Ban regex from EPEL is functional only to block SASL authentication errors. Most of the filters in the package are, at best, examples of what can be done, and will not function as written. Why? Because Fail2Ban has to deal with the particular implementations of log files in various GNU/Linux distributions, and the peculiarities of the reporting structure in those logs, no single RegEx, nor log file location, is going to work for every distribution. Neither can Fail2Ban account for every change in log file location or structure from version to version. What worked for Centos 5.x may not work for CentOS 6.x; what worked in kernel 2.8 may be invalid in kernel 3.4.</p>
<p>Also stated earlier, it is well worth the time to learn a little about RegEx. One vehicle to propel the admin far along the path is <a href="http://gskinner.com/RegExr/">RegExr</a>. Author Greg Skinner provides an online version as well as Adobe AIR standalone app. RegExr is an invaluable tool for writing and proofing regular expressions.</p>
<p><a href="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2013/04/Screen-Shot-2013-04-19-at-6.32.51-PM.png?x25141"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1838" alt="Screen Shot 2013-04-19 at 6.32.51 PM" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2013/04/Screen-Shot-2013-04-19-at-6.32.51-PM.png?x25141" width="864" height="447" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2013/04/Screen-Shot-2013-04-19-at-6.32.51-PM.png?x25141 864w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2013/04/Screen-Shot-2013-04-19-at-6.32.51-PM-300x155.png?x25141 300w" sizes="auto, (max-width: 864px) 100vw, 864px" /></a></p>
<h3>Write the RegEx</h3>
<p>OK, here&#8217;s the payoff for reading so far: a regex filter that will squelch Dovecot brute force attacks on CentOS 6, Amazon Linux 2013 and other kernel 3.4 RedHat downstream distros such as Fedora and Arch. This would, of course go in /etc/fail2ban/filter.d/dovecot.conf:</p>
<p>Here&#8217;s the original, commented out via #:</p>
<pre class="lang:default decode:true">#failregex = .*(?:pop3-login|dovecot):.*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed).*rip=(?P&lt;host&gt;\S*),.*</pre>
<p>&#8230;and here&#8217;s a substitute, created via experimentation with RegExr:</p>
<pre class="lang:default decode:true">failregex = .*auth.*pam.*dovecot.*(?:authentication failure).*rhost=&lt;HOST&gt;.*</pre>
<p>How to create a valid RegEx to match the failures to ban? For that, one must monitor log files. In the case of Dovecot on Amazon Linux 2013, that would be /var/log/secure &#8212; same as it has ever been with RedHat downstreams. However, the logging is different than it may have been in CentOS 5.8.</p>
<p>Have a look at the log files: use grep to filter the secure log on &#8220;authentication failure&#8221;</p>
<pre class="lang:default decode:true">tail -f -n 20000 /var/log/secure | grep "authentication failure"</pre>
<p>There will likely be log entries similar to the following:</p>
<pre class="lang:default decode:true">Apr 19 05:22:19 vm5 auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=oracle rhost=80.255.3.104 
Apr 19 05:22:20 vm5 auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=sybase rhost=80.255.3.104 
Apr 19 05:22:20 vm5 auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=informix rhost=80.255.3.104</pre>
<p>RegEx mentioned previously will match those entries, and via Fail2Ban: BAN the offending IPs.</p>
<p>So, you think you&#8217;re ready with RegEx fu to tackle the Local Jail (jail.local)? Not so fast. Don&#8217;t use regex in jail.local. This file takes wild cards, not regex&#8230; so if you want to monitor all users&#8217; /home/user/logs/access_log &#8212; you must wildcard /home/*/logs/access_log . NOT /home/.*/logs !</p>
<p>&#8230; more to come: follow this post for more details!</p>
<ul>
<li><a title="WordPress Fail2Ban RegEx for RedHat, CentOS, Amazon Linux" href="https://chrisgilligan.com/consulting/wordpress-wp-fail2ban-regex-redhat-centos-amazon-linux/">WordPress RegEx</a></li>
<li><a href="http://blog.shadypixel.com/spam-log-plugin/">Akismet Spam Logging &amp; Fail2Ban</a></li>
</ul>
<p>The post <a href="https://chrisgilligan.com/consulting/amazon-web-services/fail2ban-regex/">Fail2Ban Regex for RedHat, Fedora, CentOS and Amazon Linux 2013</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/consulting/amazon-web-services/fail2ban-regex/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Install phpMyAdmin with SSL on CentOS, Amazon Linux, RedHat (Apache or NginX)</title>
		<link>https://chrisgilligan.com/consulting/install-phpmyadmin-with-ssl-on-centos-amazon-linux-redhat/</link>
					<comments>https://chrisgilligan.com/consulting/install-phpmyadmin-with-ssl-on-centos-amazon-linux-redhat/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Mon, 24 Sep 2012 05:53:52 +0000</pubDate>
				<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Virtualmin]]></category>
		<category><![CDATA[amazon linux]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<category><![CDATA[redhat]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=1132</guid>

					<description><![CDATA[<p>How to install phpMyAdmin on CentOS, Amazon Linux, or Redhat. Configuration instructions are provided for Apache and NginX web servers.</p>
<p>The post <a href="https://chrisgilligan.com/consulting/install-phpmyadmin-with-ssl-on-centos-amazon-linux-redhat/">Install phpMyAdmin with SSL on CentOS, Amazon Linux, RedHat (Apache or NginX)</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-07-at-11.09.50-AM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><div id="attachment_1137" style="width: 310px" class="wp-caption alignright"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1137" class="size-medium wp-image-1137" title="phpMyAdmin database display" alt="" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-07-at-11.09.50-AM-300x195.png?x25141" width="300" height="195" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-07-at-11.09.50-AM-300x195.png?x25141 300w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-07-at-11.09.50-AM-1024x668.png?x25141 1024w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-07-at-11.09.50-AM.png?x25141 1263w" sizes="auto, (max-width: 300px) 100vw, 300px" /><p id="caption-attachment-1137" class="wp-caption-text">phpMyAdmin database display</p></div>
<p>I recently ran into a problem with the upgraded 3.5.2 phpMyAdmin package provided via the rpmforge.repo. Search no longer works, nor does pagination, etc. Plus, it&#8217;s out of date and vulnerable to an XSS exploit.</p>
<p>I have solved this by changing to the EPEL repo, which maintains the latest version of phpMyAdmin.</p>
<p>This post will teach you how to install phpMyAdmin on CentOS, Amazon Linux, or Redhat. Configuration instructions are provided for Apache and NginX web servers.</p>
<p>For this to work properly and safely, you should be running SSL on your host. Otherwise, change the ForceSSL line in the config file provided below&#8230;</p>
<h3>Install phpMyAdmin from EPEL repository</h3>
<p><strong>Uninstall current PMA:</strong><br />
<code>yum erase phpMyAdmin</code></p>
<p><strong>Set up EPEL repo:</strong></p>
<p>Find the latest epel-release at <a href="http://download.fedoraproject.org/pub/epel/6/x86_64/">http://download.fedoraproject.org/pub/epel/6/x86_64/</a><br />
<code>rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</code></p>
<p>On Amazon Linux, epel-release is already loaded. Edit /etc/yum.repos.d/epel.repo to enabled=1</p>
<p><strong>Edit /etc/yum.repos.d/epel.repo to only include necessary software packages:</strong><br />
<code>includepkgs=phpMyAdmin php-php-gettext</code></p>
<p>I have removed RPMforge repo due to some recent problems, but if you still need rpm forge repo:<br />
<code>exclude=phpMyAdmin php-php-gettext</code></p>
<p><strong>Install PMA:</strong><br />
<code>yum install phpMyAdmin</code></p>
<div>
<h3>Apache</h3>
<div><strong>Edit /etc/httpd/conf.d/phpMyAdmin.conf</strong></div>
<div>
<ul>
<li>Allow all incoming hosts for a web hosting server, or only allow hosts you require: localhost, your local workstation, etc.)</li>
<li>For a hosting server with open access, you should have a login failure daemon to block offending IP addresses with multiple failed HTTP logins. <a href="http://configserver.com/">ConfigServer Firewall</a> works well, and has modules for cPanel and Webmin. <a href="http://ossec.net/">OSSEC</a> is another reactive IPTables firewall with Apache login failure IP blacklisting.</li>
<li>For Amazon EC2, a good practice is to create a discrete database server, and only allow access to it inside a VPC security group, or from specific IP addresses enabled in that security group. That way, you can safely Allow from ALL hosts, because the VPC firewall will prevent other access. Install phpMyAdmin on a separate web server, and restrict access to PMA&#8217;s directory (see below).</li>
</ul>
</div>
<div>
<pre class="lang:python decode:true"># phpMyAdmin - Web based MySQL browser written in php
# 
# Allows only localhost by default
#
# But allowing phpMyAdmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

&lt;Directory /usr/share/phpMyAdmin/&gt;
   &lt;IfModule mod_authz_core.c&gt;
     # Apache 2.4
     &lt;RequireAny&gt;
       Require ip 127.0.0.1
       Require ip ::1
     &lt;/RequireAny&gt;
   &lt;/IfModule&gt;
   &lt;IfModule !mod_authz_core.c&gt;
     # Apache 2.2
     Order Deny,Allow
     # comment out Allow from All and add your own static IPs here for security 
     # Allow from All
     Allow from 123.456.7.89
     Allow from 12.345.67.89
     Allow from 127.0.0.1
     Allow from ::1
   &lt;/IfModule&gt;
&lt;/Directory&gt;

&lt;Directory /usr/share/phpMyAdmin/setup/&gt;
   &lt;IfModule mod_authz_core.c&gt;
     # Apache 2.4
     &lt;RequireAny&gt;
       Require ip 127.0.0.1
       Require ip ::1
     &lt;/RequireAny&gt;
   &lt;/IfModule&gt;
   &lt;IfModule !mod_authz_core.c&gt;
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   &lt;/IfModule&gt;
&lt;/Directory&gt;

# These directories do not require access over HTTP - taken from the original
# phpMyAdmin upstream tarball
#
&lt;Directory /usr/share/phpMyAdmin/libraries/&gt;
    Order Deny,Allow
    Deny from All
    Allow from None
&lt;/Directory&gt;

&lt;Directory /usr/share/phpMyAdmin/setup/lib/&gt;
    Order Deny,Allow
    Deny from All
    Allow from None
&lt;/Directory&gt;

&lt;Directory /usr/share/phpMyAdmin/setup/frames/&gt;
    Order Deny,Allow
    Deny from All
    Allow from None
&lt;/Directory&gt;

# This configuration prevents mod_security at phpMyAdmin directories from
# filtering SQL etc.  This may break your mod_security implementation.
#
#&lt;IfModule mod_security.c&gt;
#    &lt;Directory /usr/share/phpMyAdmin/&gt;
#        SecRuleInheritance Off
#    &lt;/Directory&gt;
#&lt;/IfModule&gt;</pre>
<h3>NginX</h3>
<p><strong>Edit nginx.conf for the hostname&#8217;s server_name website</strong></p>
<pre class="lang:default decode:true">       location /phpMyAdmin {
               root /usr/share/;
               index index.php;
               location ~ ^/phpMyAdmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass localhost:9002;
                       fastcgi_param HTTPS on;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME /usr/share$fastcgi_script_name;
                       include /etc/nginx/fastcgi_params;
                       fastcgi_buffer_size 128k;
                       fastcgi_buffers 256 4k;
                       fastcgi_busy_buffers_size 256k;
                       fastcgi_temp_file_write_size 256k;
                       fastcgi_intercept_errors on;
               }
               location ~* ^/phpMyAdmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }

        location /phpmyadmin {
               rewrite ^/* /phpMyAdmin last;
        }</pre>
<p><strong>Edit /etc/phpMyAdmin/config.inc.php</strong></p>
<p>The config below shows some common config options. Important ones are ForceSSL and auth_type. For a production server, SSL should be ON and auth_type http is better; http auth uses MySQL user/pass combinations to restrict access to user-specific databases.</p>
</div>
<div>
<pre class="lang:php decode:true">&lt;?php
/* Servers configuration */
$i = 0;

/* Server: MySQL Server [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'MySQL Server';
$cfg['Servers'][$i]['host'] = '122.34.567.89';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'http';
$cfg['Servers'][$i]['user'] = 'pma';
$cfg['Servers'][$i]['password'] = '';
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = 'pmapassword';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
$cfg['Servers'][$i]['userconfig'] = 'pma_userconfig';
$cfg['Servers'][$i]['table_info'] = 'pma_table_info';
$cfg['Servers'][$i]['column_info'] = 'pma_column_info';
$cfg['Servers'][$i]['history'] = 'pma_history';
$cfg['Servers'][$i]['recent'] = 'pma_recent';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma_table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma_tracking';
$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
$cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';

/* End of servers configuration */

$cfg['UploadDir'] = '/tmp';
$cfg['SaveDir'] = '/tmp';
/* only if your host supports SSL */
$cfg['ForceSSL'] = true;
$cfg['DefaultLang'] = 'en';
$cfg['ServerDefault'] = 1;
?&gt;</pre>
<h3>Create the phpmyadmin database for advanced functionality</h3>
</div>
</div>
<p>Look in phpMyAdmin folder /usr/share/phpMyAdmin/examples for create_tables.sql</p>
<p>ssh to server as root user<br />
<code>mysql<br />
-- or if it asks for password --<br />
mysql -u your-mysql-superuser -pyour-superuser-password<br />
mysql &gt; source /usr/share/phpMyAdmin/examples/create_tables.sql<br />
</code></p>
<h3>Log in to PMA</h3>
<p>Now you can log into PMA with your mysql root user credentials. https://yourhost.tld/phpmyadmin</p>
<ul>
<li>Create a mysql user, pma, with the password you added to the config file, with no default permissions, on localhost</li>
<li>Give pma user all permissions on phpmyadmin database, on localhost</li>
</ul>
<p>Now you have a secure PMA which will work for all mysql users on your host. Version 3.5+ now has Status Monitoring and Advisor. Used in conjunction with a performance tuning script like <a title="MySQL Tuning Primer" href="https://launchpad.net/mysql-tuning-primer">MySQL Tuning Primer</a>, it will help you fine-tune your MySQL server to your requirements and your environment.</p>
<div id="attachment_1394" style="width: 310px" class="wp-caption aligncenter"><a href="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-24-at-8.51.27-PM.png?x25141"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1394" class="size-medium wp-image-1394" title="phpMyAdmin MySQL server dashboard" alt="" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-24-at-8.51.27-PM-300x202.png?x25141" width="300" height="202" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-24-at-8.51.27-PM-300x202.png?x25141 300w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-24-at-8.51.27-PM-1024x692.png?x25141 1024w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/Screen-Shot-2012-09-24-at-8.51.27-PM.png?x25141 1447w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1394" class="wp-caption-text">phpMyAdmin MySQL server dashboard</p></div>
<p>The post <a href="https://chrisgilligan.com/consulting/install-phpmyadmin-with-ssl-on-centos-amazon-linux-redhat/">Install phpMyAdmin with SSL on CentOS, Amazon Linux, RedHat (Apache or NginX)</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/consulting/install-phpmyadmin-with-ssl-on-centos-amazon-linux-redhat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Portable Wifi Hotspot Rental Site</title>
		<link>https://chrisgilligan.com/portfolio/portable-wifi-hotspot-rental-site/</link>
					<comments>https://chrisgilligan.com/portfolio/portable-wifi-hotspot-rental-site/#respond</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Wed, 12 Sep 2012 16:25:53 +0000</pubDate>
				<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[E-Commerce]]></category>
		<category><![CDATA[Forms]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Small Business]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[Virtualmin]]></category>
		<category><![CDATA[Web Server Performance Tuning]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=2318</guid>

					<description><![CDATA[<p>Trawire.com offers portable 4G MiFi and iPad rentals for visitors traveling to Iceland. Trawire&#8217;s CIO approached me for assistance after his systems administrator bailed and left him with a poorly maintained, self-hosted MacMini server running unoptimized WordPress installs. I migrated the site to Amazon Web Services, where it now can handle traffic spikes and can be [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/portfolio/portable-wifi-hotspot-rental-site/">Portable Wifi Hotspot Rental Site</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2014/10/screen-shot-2014-10-02-at-12.29.29-PM.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p><strong><a href="http://iceland.trawire.com/">Trawire.com</a> offers portable 4G MiFi and iPad rentals for visitors traveling to Iceland.</strong> Trawire&#8217;s CIO approached me for assistance after his systems administrator bailed and left him with a poorly maintained, self-hosted MacMini server running unoptimized WordPress installs.</p>
<div id="attachment_2319" style="width: 310px" class="wp-caption aligncenter"><a href="http://iceland.trawire.com/"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2319" class="size-medium wp-image-2319" src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2014/10/screen-shot-2014-10-02-at-12.29.29-PM-300x259.png?x25141" alt="Trawire website" width="300" height="259" srcset="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2014/10/screen-shot-2014-10-02-at-12.29.29-PM-300x259.png?x25141 300w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2014/10/screen-shot-2014-10-02-at-12.29.29-PM-1024x886.png?x25141 1024w, https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2014/10/screen-shot-2014-10-02-at-12.29.29-PM.png?x25141 1235w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2319" class="wp-caption-text">Trawire website</p></div>
<p>I migrated the site to Amazon Web Services, where it now can handle traffic spikes and can be scaled and built out more easily, should the concept grow to additional markets. Working with my WordPress coding contacts in India, Trawire developed plugins to add features, and keep the software up-to-date. My contributions: caching and content distribution for static assets &amp; queries, Virtualmin and phpMyAdmin for ease of management and development.</p>
<p>&nbsp;</p>
<p>The post <a href="https://chrisgilligan.com/portfolio/portable-wifi-hotspot-rental-site/">Portable Wifi Hotspot Rental Site</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/portfolio/portable-wifi-hotspot-rental-site/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SSL and CloudFront CDN Support for WebFonts via .htaccess</title>
		<link>https://chrisgilligan.com/wordpress/add-cloudfront-cdn-support-for-webfonts-via-htaccess/</link>
					<comments>https://chrisgilligan.com/wordpress/add-cloudfront-cdn-support-for-webfonts-via-htaccess/#comments</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Wed, 05 Sep 2012 21:33:27 +0000</pubDate>
				<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[webfont]]></category>
		<category><![CDATA[webfonts]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=1005</guid>

					<description><![CDATA[<p>I recently upgraded my WordPress theme to WooThemes Canvas 5.x, and I found that some of the icons were not rendering, but were showing a letter or integer instead. I dug into the code and found that these icons are now delivered via @font-face webfonts. Meanwhile, I&#8217;m working on a client&#8217;s e-commerce site with Google [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/wordpress/add-cloudfront-cdn-support-for-webfonts-via-htaccess/">SSL and CloudFront CDN Support for WebFonts via .htaccess</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/09/twitter_font-face.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p>I recently upgraded my WordPress theme to <a href="http://zfer.us/OtCqz">WooThemes Canvas 5.x</a>, and I found that some of the icons were not rendering, but were showing a letter or integer instead. I dug into the code and found that these icons are now delivered via @font-face webfonts.</p>
<p>Meanwhile, I&#8217;m working on a client&#8217;s e-commerce site with Google WebFonts and a custom webfont to display the Rupee symbol (Indian currency).</p>
<p>Though the fonts were uploading properly to the CloudFront CDN, and were properly referenced in the minified CSS on the CDN, they were not rendering in Firefox or IE, and the SSL pages on the client&#8217;s site were throwing security warnings.</p>
<p>At first I thought this might be a W3 Total Cache issue, because upgrading to the latest development release had solved some other CSS issues. However, it turned out to be a browser security issue.</p>
<p>Evidently this is a security measure to prevent cross-site attacks, but you can allow this via Apache mod_headers, to allow your specific CloudFront (or other) domain, specified in the .htaccess file.</p>
<p>Some sites have suggested using &#8220;*&#8221; wildcards to allow all domains&#8230; but obviously this is a security issue: with this Header, you are granting JavaScript clients basic access to your resources. I recommend you only allow access to the specific CDN domains you require. Do this with a comma separated list, in double quotes.</p>
<pre class="lang:default decode:true" title=".htaccess for CDN webfonts cross-site"># BEGIN CDN Cross-Site for Webfonts
&lt;IfModule mod_mime.c&gt;
        AddType font/ttf .ttf
        AddType font/eot .eot
        AddType font/opentype .otf
        AddType font/x-woff .woff
&lt;/IfModule&gt;
&lt;FilesMatch "\.(svg|ttf|otf|eot|woff)$"&gt;
    &lt;IfModule mod_headers.c&gt;
        Header set Access-Control-Allow-Origin "fonts.googleapis.com,{{yourdistro69}}.cloudfront.net"
    &lt;/IfModule&gt;
&lt;/FilesMatch&gt;
# END CDN Cross-Site for Webfonts</pre>
<p>Yay! Delicious webfonts, even on SSL pages via CDN!</p>
<p>The post <a href="https://chrisgilligan.com/wordpress/add-cloudfront-cdn-support-for-webfonts-via-htaccess/">SSL and CloudFront CDN Support for WebFonts via .htaccess</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/wordpress/add-cloudfront-cdn-support-for-webfonts-via-htaccess/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Varnish VCL and Config for WordPress with W3 Total Cache</title>
		<link>https://chrisgilligan.com/consulting/varnish-vcl-and-config-for-wordpress-with-w3-total-cache/</link>
					<comments>https://chrisgilligan.com/consulting/varnish-vcl-and-config-for-wordpress-with-w3-total-cache/#comments</comments>
		
		<dc:creator><![CDATA[Chris Gilligan]]></dc:creator>
		<pubDate>Wed, 15 Aug 2012 00:23:11 +0000</pubDate>
				<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[Web Server Performance Tuning]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[apc cache]]></category>
		<category><![CDATA[apc fcgid]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[varnish]]></category>
		<category><![CDATA[varnish cache]]></category>
		<category><![CDATA[w3 total cache]]></category>
		<category><![CDATA[w3tc]]></category>
		<guid isPermaLink="false">https://chrisgilligan.com/?p=867</guid>

					<description><![CDATA[<p>I have been working on a Varnish front-end for Apache, to be used with WordPress sites. I described the architecture in Load Balancing Virtualmin WordPress Hosting Server with Varnish on AWS. I now have a configuration that seems to work for all WordPress features, including logged-out commenting. This configuration also works well with W3 Total [&#8230;]</p>
<p>The post <a href="https://chrisgilligan.com/consulting/varnish-vcl-and-config-for-wordpress-with-w3-total-cache/">Varnish VCL and Config for WordPress with W3 Total Cache</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="float: right; margin: 0 0 10px 15px; width:240px; height: auto;">
		<img src="https://d2lehxir4n36oh.cloudfront.net/wp-content/uploads/2012/08/wordnish.png?x25141" width="240" style="max-width: 100%; height: auto;" />
		</p><p>I have been working on a Varnish front-end for Apache, to be used with WordPress sites. I described the architecture in <a title="Load Balancing Virtualmin WordPress Hosting Server with Varnish on AWS" href="https://chrisgilligan.com/consulting/load-balancing-virtualmin-wordpress-hosting-server-varnish-aws/">Load Balancing Virtualmin WordPress Hosting Server with Varnish on AWS</a>. I now have a configuration that seems to work for all WordPress features, including logged-out commenting. This configuration also works well with W3 Total Cache.</p>
<p>This configuration is for Varnish on a separate server, but should also work on a single server with appropriate changes to the port and backend IP settings.</p>
<h3>Varnish Config (/etc/sysconfig/varnish)</h3>
<pre class="lang:perl decode:true crayon-selected"># Configuration file for varnish
#
# /etc/init.d/varnish expects the variable $DAEMON_OPTS to be set from this
# shell script fragment.
#
#
# Maximum number of open files (for ulimit -n)
NFILES=131072
#
# Locked shared memory (for ulimit -l)
# Default log size is 82MB + header
MEMLOCK=82000
#
# Maximum size of corefile (for ulimit -c). Default in Fedora is 0
# DAEMON_COREFILE_LIMIT="unlimited"
#
# Set this to 1 to make init script reload try to switch vcl without restart.
# To make this work, you need to set the following variables
# explicit: VARNISH_VCL_CONF, VARNISH_ADMIN_LISTEN_ADDRESS,
# VARNISH_ADMIN_LISTEN_PORT, VARNISH_SECRET_FILE
RELOAD_VCL=1
#
## Advanced configuration
#
# # Main configuration file.
VARNISH_VCL_CONF=/etc/varnish/wordpress-varnish3.vcl
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=1
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120
#
# # Cache file location if using file cache
#VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin
#
# # Cache size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=3G
#
# # Backend storage specification
# malloc runs from RAM, file from file
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
#VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120
#
# # DAEMON_OPTS is used by the init script. If you add or remove options,
# # be sure you update this section, too.
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-t ${VARNISH_TTL} \
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
-u varnish -g varnish \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
#</pre>
<h3>Varnish VCL (/etc/varnish/wordpress-varnish3.vcl)</h3>
<pre class="lang:default decode:true">backend origin {
.host = "10.11.12.13";
.port = "80";
.connect_timeout = 60s;
.first_byte_timeout = 60s;
.between_bytes_timeout = 60s;
}
#
sub vcl_recv {
# only using one backend
set req.backend = origin;
#
# set standard proxied ip header for getting original remote address
set req.http.X-Forwarded-For = client.ip;
#
# logged in users must always pass
if( req.url ~ "^/wp-(login|admin)" || req.http.Cookie ~ "wordpress_logged_in_" ){
return (pass);
}
# accept purges from w3tc and varnish http purge
if (req.request == "PURGE") {
return (lookup);
}
#
# don't cache search results
if( req.url ~ "\?s=" ){
return (pass);
}
#
# always pass through posted requests and those with basic auth
if ( req.request == "POST" || req.http.Authorization ) {
return (pass);
}
#
# else ok to fetch a cached page
unset req.http.Cookie;
return (lookup);
}
#
# accept purges from w3tc and varnish http purge
sub vcl_hit {
if (req.request == "PURGE") { purge; }
return (deliver);
}
#
# accept purges from w3tc and varnish http purge
sub vcl_miss {
if (req.request == "PURGE") { purge; }
return (fetch);
}
#
sub vcl_fetch {
#
# remove some headers we never want to see
unset beresp.http.Server;
unset beresp.http.X-Powered-By;
#
# only allow cookies to be set if we're in admin area - i.e. commenters stay logged out
if( beresp.http.Set-Cookie &amp;&amp; req.url !~ "^/wp-(login|admin)" ){
unset beresp.http.Set-Cookie;
}
#
# don't cache response to posted requests or those with basic auth
if ( req.request == "POST" || req.http.Authorization ) {
return (hit_for_pass);
}
#
# only cache status ok
if ( beresp.status != 200 ) {
return (hit_for_pass);
}
#
# don't cache search results
if( req.url ~ "\?s=" ){
return (hit_for_pass);
}
#
# else ok to cache the response
set beresp.ttl = 24h;
return (deliver);
}
#
sub vcl_deliver {
# add debugging headers, so we can see what's cached
if (obj.hits &gt; 0) {
set resp.http.X-Cache = "HIT";
}
else {
set resp.http.X-Cache = "MISS";
}
# remove some headers added by varnish
unset resp.http.Via;
unset resp.http.X-Varnish;
}
#
sub vcl_hash {
hash_data( req.url );
# altering hash so subdomains are ignored.
# don't do this if you actually run different sites on different subdomains
if ( req.http.host ) {
hash_data( regsub( req.http.host, "^([^\.]+\.)+([a-z]+)$", "\1\2" ) );
} else {
hash_data( server.ip );
}
# ensure separate cache for mobile clients (WPTouch workaround)
if( req.http.User-Agent ~ "(iPod|iPhone|incognito|webmate|dream|CUPCAKE|WebOS|blackberry9\d\d\d)" ){
hash_data("touch");
}
return (hash);
}</pre>
<p>The post <a href="https://chrisgilligan.com/consulting/varnish-vcl-and-config-for-wordpress-with-w3-total-cache/">Varnish VCL and Config for WordPress with W3 Total Cache</a> appeared first on <a href="https://chrisgilligan.com">Chris Gilligan » new media</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://chrisgilligan.com/consulting/varnish-vcl-and-config-for-wordpress-with-w3-total-cache/feed/</wfw:commentRss>
			<slash:comments>25</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Page Caching using Disk: Enhanced 
Content Delivery Network via Amazon Web Services: CloudFront: d2lehxir4n36oh.cloudfront.net
Lazy Loading (feed)

Served from: chrisgilligan.com @ 2026-07-02 16:32:31 by W3 Total Cache
-->