Great feedback, Daniel; thanks!<div><br></div><div>I knew I was going to wind up with some inconsistencies (which I did try to avoid, but my eyes went over it a few too many times). </div><div><br></div><div>I do actually hook register_setting() into admin_init (actually, I put all of the Settings API bits - register_setting(), add_setting_field(), add_setting_section(), the validation callback function - into a separate file, and hook into admin_init the function in which I call that file), but forgot to point that out in the post.  I&#39;ll fix that.</div>
<meta http-equiv="content-type" content="text/html; charset=utf-8"><div><br></div><div>On settings_fields(): good catch! I&#39;ll fix that, also.</div><div><br></div><div>(update: fixed)</div><div><br></div><div>Chip<br><br>
<div class="gmail_quote">On Fri, Feb 18, 2011 at 4:18 PM, Daniel Tara <span dir="ltr">&lt;<a href="mailto:contact@onedesigns.com">contact@onedesigns.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Hey Chip,</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p><p class="MsoNormal">
<span style="font-size:11.0pt;color:#1F497D">I just took the time to read your tutorial. (Yes I tweeted about it without reading)</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p><p class="MsoNormal">
<span style="font-size:11.0pt;color:#1F497D">This was one piece on enlightenment, especially the settings sections part, which I didn’t know they work like hooks.</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">If anyone complains about the length of the article they’re lazy. If you’re interested you can fly through it.</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Just a few minor observations:</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p><p><span style="font-size:11.0pt;color:#1F497D"><span>1.<span style="font:7.0pt &quot;Times New Roman&quot;">       </span></span></span><span style="font-size:11.0pt;color:#1F497D">register_setting( &#39;theme_oenology_options&#39;, &#39;theme_oenology_options&#39;, &#39;oenology_options_validate&#39; );</span></p>
<p><span style="font-size:11.0pt;color:#1F497D">This needs to be hooked to admin_init or it will return a “Call to undefined function” error. I would also put it somewhere at the beginning, where it makes more sense, since the whole article revolves around this call. You’re putting it on page 4, after you defined all the default options, settings sections and some settings page options.</span></p>
<p><span style="font-size:11.0pt;color:#1F497D"><span>2.<span style="font:7.0pt &quot;Times New Roman&quot;">       </span></span></span><span style="font-size:11.0pt;color:#1F497D">You said the argument in settings_fields must be the same as the option defined in register_setting(). It must actually be the same as the defined options group (you did call it $options_group). I would stress this however, since if they’re not the same it returns an “Options page not found” error and many grasp at it without knowing where this error came from.</span></p>
<p><span style="font-size:11.0pt;color:#1F497D"><span>3.<span style="font:7.0pt &quot;Times New Roman&quot;">       </span></span></span><span style="font-size:11.0pt;color:#1F497D">Your article pwnz</span></p><p class="MsoNormal">
<span style="font-size:11.0pt;color:#1F497D"> </span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Daniel</span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"> </span></p><p class="MsoNormal">
<b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:theme-reviewers-bounces@lists.wordpress.org" target="_blank">theme-reviewers-bounces@lists.wordpress.org</a> [mailto:<a href="mailto:theme-reviewers-bounces@lists.wordpress.org" target="_blank">theme-reviewers-bounces@lists.wordpress.org</a>] <b>On Behalf Of </b>Rahul Bansal<br>
<b>Sent:</b> Friday, February 18, 2011 3:34 PM<br><b>To:</b> Chip Bennett<br><b>Cc:</b> <a href="mailto:theme-reviewers@lists.wordpress.org" target="_blank">theme-reviewers@lists.wordpress.org</a><br><b>Subject:</b> Re: [theme-reviewers] Tutorial: Incorporating the Settings API in WordPress Themes</span></p>
<div><div></div><div class="h5"><p class="MsoNormal"> </p><blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in"><p class="MsoNormal"><span><span style="font-size:10.0pt">Heading anchors, if it would be helpful for linking?</span></span></p>
</blockquote><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">That will be equally helpful!</p></div><div><p class="MsoNormal">You can use any &quot;table of content&quot; plugin to automate it.</p></div><div>
<p class="MsoNormal">There are many plugins, which parse h2/h3 tags to generate that.</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">We provide file-upload for favicon &amp; logo as of now.</p></div>
<div><p class="MsoNormal">In a current theme (underdev) we used register settings for it but quality of our code is yet to be &quot;certified&quot; from theme review team!</p></div><div><p class="MsoNormal">So we have decided to wait to publish articles about our methods till our next theme goes live here. ;-)</p>
</div><div><p class="MsoNormal"> </p></div><p class="MsoNormal" style="margin-bottom:12.0pt">--<br>Rahul Bansal | Founder &amp; CEO | rtCamp Solutions Pvt. Ltd.<br>Skype: rahul286 | Twitter: @rahul286 | Web: <a href="http://rtcamp.com/" target="_blank">http://rtcamp.com/</a><br>
<br><br></p><div><p class="MsoNormal">On Fri, Feb 18, 2011 at 6:56 PM, Chip Bennett &lt;<a href="mailto:chip@chipbennett.net" target="_blank">chip@chipbennett.net</a>&gt; wrote:</p><p class="MsoNormal">I&#39;ll probably cross the &quot;file upload&quot; issue down the road - though, likely, *far* down the road (as my Theme currently has no need for any user-uploaded files). Maybe I&#39;ll add a &quot;custom favicon&quot; option (though my personal preference is for favicons to be Plugin territory, and not tied to a particular Theme).</p>
<div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">I love Justin Tadlock&#39;s Series Plugin; I&#39;ve made some use of it in the past. The problem here was that I found it difficult to break the content up logically in a way that would facilitate separate Posts. So, I went with simple pagination instead.</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Now that it&#39;s done, perhaps I can go back and do some editorial work, and at least provide some Heading anchors, if it would be helpful for linking?</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">And, I&#39;m happy to take the time for something like this. I like to write posts like these, especially when I can document something as I&#39;m learning how to do it - both for my own memory, and to pass on anything useful that I may have learned. It probably cost me the equivalent time away from performing some Theme reviews, but part of the mission of the Theme Review Team is also to provide an educational resource for Theme developers. So hopefully the review queue will forgive me. :)</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal"><span style="color:#888888">Chip</span></p><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"> </p><div><p class="MsoNormal">On Fri, Feb 18, 2011 at 7:16 AM, Rahul Bansal &lt;<a href="mailto:rahul.bansal@rtcamp.com" target="_blank">rahul.bansal@rtcamp.com</a>&gt; wrote:</p>
<p class="MsoNormal">Length is worth the info. Didn&#39;t get time to read in detail till now.</p><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">For ease of navigation, you may break articles into entirely different pages/posts and bind them using a series plugin.</p>
</div><div><p class="MsoNormal">Other reason for this suggestion is that article in series will have their own URLs that will have advantages like:</p></div><div><ul type="disc"><li class="MsoNormal">We can refer people to particular subtopic by sharing a unique post article</li>
<li class="MsoNormal">permalinks will contain keywords like &quot;Register Settings and Define Form Sections/Fields&quot; etc. This wil give better search engine visibility. I am less concerned about traffic gain that wil result, but my intention is to indirectly help Google give better article so developers can avoid following &quot;wrong&quot; article.</li>
</ul><div><p class="MsoNormal">Series creation may require 1-2 hours of extra time from you!</p></div></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">On sidenote, after taking quick overview, I felt that the article missed information about &quot;file upload&quot; box. (I searched &quot;upload&quot; keyword on &quot;all&quot; article page to crosscheck&quot;. Many times I find developers complaining register_settings has issues with file-uploads. </p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Thanks again for taking so much time to write something like this. :-)</p></div><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><br clear="all">
--<br>Rahul Bansal | Founder &amp; CEO | rtCamp Solutions Pvt. Ltd.<br>Skype: rahul286 | Twitter: @rahul286 | Web: <a href="http://rtcamp.com/" target="_blank">http://rtcamp.com/</a><br><br><br></p></div><div><div><div><p class="MsoNormal">
On Fri, Feb 18, 2011 at 6:27 PM, Chip Bennett &lt;<a href="mailto:chip@chipbennett.net" target="_blank">chip@chipbennett.net</a>&gt; wrote:</p><p class="MsoNormal">Thanks!</p><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">
I was worried about the length of the article, but it didn&#39;t seem to make sense to split it into multiple posts.</p></div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Do you think it would be useful to do a more slimmed-down follow-up post, that leaves out some of the advanced topics, like Settings page tabs, contextual help, etc.?</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal"><span style="color:#888888">Chip</span></p><div><div><p class="MsoNormal" style="margin-bottom:12.0pt"> </p><div><p class="MsoNormal">On Fri, Feb 18, 2011 at 6:51 AM, Rahul Bansal &lt;<a href="mailto:rahul.bansal@rtcamp.com" target="_blank">rahul.bansal@rtcamp.com</a>&gt; wrote:</p>
<p class="MsoNormal">Great article... :-)</p><div><p class="MsoNormal"> </p><div><p class="MsoNormal">Added to - <a href="http://make.wordpress.org/themes/about/resources/" target="_blank">http://make.wordpress.org/themes/about/resources/</a> (comments section)</p>
</div><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Timing is good as well! 10 pages gives a lot to explore on weekend! ;-)</p></div><div><p class="MsoNormal" style="margin-bottom:12.0pt"><br clear="all">
--<br>Rahul Bansal | Founder &amp; CEO | rtCamp Solutions Pvt. Ltd.<br>Skype: rahul286 | Twitter: @rahul286 | Web: <a href="http://rtcamp.com/" target="_blank">http://rtcamp.com/</a><br><br><br></p><div><div><div><p class="MsoNormal">
On Fri, Feb 18, 2011 at 9:11 AM, Chip Bennett &lt;<a href="mailto:chip@chipbennett.net" target="_blank">chip@chipbennett.net</a>&gt; wrote:</p></div></div><blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div><div><p class="MsoNormal">All,</p><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">I have just published a tutorial: <a href="http://bit.ly/hHjo6n" target="_blank">Incorporating the Settings API in WordPress Themes</a>:</p>
</div><blockquote style="margin-left:30.0pt;margin-right:0in"><div><p style="margin:0in;margin-bottom:.0001pt;line-height:17.25pt;border-style:initial;border-color:initial"><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">While others such as <a href="http://ottopress.com/2009/wordpress-settings-api-tutorial/" target="_blank"><b><span style="color:#5588AA;text-decoration:none">Otto</span></b></a> and <a href="http://planetozh.com/blog/2009/05/handling-plugins-options-in-wordpress-28-with-register_setting/" target="_blank"><b><span style="color:#5588AA;text-decoration:none">Ozh</span></b></a> have done yeomen&#39;s work in explaining how to implement the Settings API, I have not yet come across anything that really put everything together, and explained the process and implementation from beginning to end, in a way that even the less-experienced Theme developers (like me) could easily understand.</span></p>
<p style="margin-right:0in;margin-bottom:0in;margin-left:0in;margin-bottom:.0001pt;line-height:17.25pt;border-style:initial;border-color:initial"><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">This tutorial will attempt to fill that gap, by providing examples of current (as of the pending release of WordPress 3.1) best-practice implementation, not merely of the Settings API, but of Theme Options implementation as a whole, including:</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Registering options in the database as a single options array</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Initializing default options</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Creating a single Theme Settings page (with tabs)</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Defining settings page sections and fields</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Validating and white-listing user-input form data</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Adding Settings Page contextual help</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Enqueueing custom CSS for the Settings page</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Implementing settings in the Theme template files</span></p>
<p class="MsoNormal" style="margin-left:26.25pt;line-height:13.2pt"><span style="font-size:10.0pt;font-family:Symbol;color:#555555"><span>·<span style="font:7.0pt &quot;Times New Roman&quot;">         </span></span></span><span style="font-size:11.5pt;font-family:&quot;Garamond&quot;,&quot;serif&quot;;color:#555555">Enqueueing front-end CSS</span></p>
</div></blockquote><div><p class="MsoNormal"> </p></div><div><p class="MsoNormal">Please give it a read; I hope it is helpful. Also, any feedback, comments, corrections, criticism, etc. is welcome, so please comment!</p></div>
<div><p class="MsoNormal"> </p></div><div><p class="MsoNormal"><span style="color:#888888">Chip</span></p></div><p class="MsoNormal"> </p></div></div><p class="MsoNormal" style="margin-bottom:12.0pt">_______________________________________________<br>
theme-reviewers mailing list<br><a href="mailto:theme-reviewers@lists.wordpress.org" target="_blank">theme-reviewers@lists.wordpress.org</a><br><a href="http://lists.wordpress.org/mailman/listinfo/theme-reviewers" target="_blank">http://lists.wordpress.org/mailman/listinfo/theme-reviewers</a></p>
</blockquote></div><p class="MsoNormal"> </p></div></div></div><p class="MsoNormal"> </p></div></div></div><p class="MsoNormal" style="margin-bottom:12.0pt"><br>_______________________________________________<br>theme-reviewers mailing list<br>
<a href="mailto:theme-reviewers@lists.wordpress.org" target="_blank">theme-reviewers@lists.wordpress.org</a><br><a href="http://lists.wordpress.org/mailman/listinfo/theme-reviewers" target="_blank">http://lists.wordpress.org/mailman/listinfo/theme-reviewers</a></p>
</div><p class="MsoNormal"> </p></div></div></div></div><p class="MsoNormal"> </p></div></div></div></div><p class="MsoNormal"> </p></div></div></div></div><br>_______________________________________________<br>
theme-reviewers mailing list<br>
<a href="mailto:theme-reviewers@lists.wordpress.org">theme-reviewers@lists.wordpress.org</a><br>
<a href="http://lists.wordpress.org/mailman/listinfo/theme-reviewers" target="_blank">http://lists.wordpress.org/mailman/listinfo/theme-reviewers</a><br>
<br></blockquote></div><br></div>