• Skip to primary navigation
  • Skip to main content
  • Skip to footer
  • Store
  • Support
  • Theme Documentation
  • My Account
  • Cart

9seeds

Building Custom WordPress Solutions | Plugin Development

 
  • Custom Development
  • Themes
  • Plugins
  • About
  • Contact
  • Blog

News

Plugin Update: CPT Speakers

Posted on April 8, 2011

Back in January I released a plugin that we put together when we were building the site for WordCamp Las Vegas to make it easy to display a page of speakers for the event. It’s was pretty basic, but it served our purpose. We released it in hopes that we could save somebody else some time if they had a similar need.

Fast forward a couple months… I received an email from Josh Harrison letting me know he used the plugin for WordCamp Seattle’s site, and, he had made several improvements to it. Nice! He sent the updates with a note:

I made some modifications to your plugin CPT Speakers. Go ahead and use them if you’d like. Here is what I added:

  • template tags for speaker information with filters and paragraph formatting
  • shortcode to include the speaker information on an agenda (like what I put on http://wordcampseattle.org/agenda)
  • post thumbnails. I did not remove the old way of uploading images though.

After merging in the changes Josh made, it made perfect sense to go ahead and remove the old way we were dealing with speaker image uploads and instead use the featured image method.

WordPress Community
One of the greatest parts about working with the WordPress community is their willingness to give back. It would have been very easy for Josh to use the plugin we provided, make his changes, use it for his site and go about his merry way. But instead, when he was done he bundled up the changes and did his part to make the plugin better for the next person who comes along. That’s what it’s all about. Thanks, Josh!

You can download the latest version (1.1) from the WordPress plugin directory.

Upgrading
If you are planning to upgrade from a previous version, keep in mind that you will need to go back and add the speaker’s photo as the featured image for their post as we’ve switched the way photos are handled. Also, you will need to manually move single-speakers.php and template_speakers.php from the plugin folder to your active theme folder.

Styling
After you install the plugin you will want to add some styling to it. There is no inline styling, so you will need to some CSS to your existing style sheet. You can use the following as a base and change it up as needed:

#speakers {
font-size: 12px;
min-height: 300px;
}

#speaker_image_section {
width: 150px;
float: left;
height: 300px;
margin-right: 18px;
}

#speaker_image img {
margin-top: 5px;
border: 1px solid #333;
padding: 3px;
background: #0099cc;
}

#speaker_name {
font-size: 18px;
font-weight: bold;
margin-bottom: 10px;
}

#speaker_url {
text-align: center;
}

#speaker_twitter_url {
text-align: center;
}

#speaker_pres_title {
margin: 5px 0px 5px 0px;
font-size: 13px;
}

#speaker_pres_description {
font-size: 12px;
font-family: arial, helvetica;
line-height: 16px;
}

#speaker_session_description {
font-size: 12px;
line-height: 18px;
}

#speaker_image_section_single {
width: 150px;
float: left;
height: 600px;
margin-right: 18px;
}

#speaker_image_section_single img{
margin-top: 5px;
border: 1px solid #333;
padding: 3px;
background: #0099cc;
}

#pres_url {
text-align: center;
}

.speaker_snippet .thumbnail {
float:left;
display:inline;
margin-right:10px;
border-bottom:0;
}
#content .speaker_snippet .thumbnail a {
border-bottom:0;
}
.speaker_snippet .name {
font-weight:bold;
line-height:16px;
}
.speaker_snippet .title {
font-size:0.9em;
line-height:15px;
}

Continue Reading

john

    More by john

    New Plugin: Genesis Simple Headers

    Posted on March 18, 2011

    Earlier this week I was installing some of the Genesis child themes (aff link) on a WordPress multi-site network. I quickly realized that I had a problem on my hands. If more than one site wanted to use the same theme, they wouldn’t be able to use a custom logo because uploading the logo to the theme directory would make it the only logo available for all network sites using the same theme. So, I spent spent some time retrofitting half a dozen themes to use the WordPress headers functionality to replace the logo on each individual site.

    Then it dawned on me… Why not just build this as a plugin? That was, of course, followed immediately with “why didn’t I think of that first?”

    Obviously, if you are running a single site you can simply FTP in and upload the file to your server. But, if you have clients who you’d like to keep away from FTP and make it simple for them to upload a new header once a day (if they so choose), then the Genesis Simple Headers plugin will do the trick.

    You can Download Genesis Simple Headers here.

    To install, download the plugin, unzip it and upload the entire ‘genesis-simple-headers’ folder to your /wp-content/plugins/ folder. Then activate it from the WordPress plugins menu. It requires that you have Genesis 1.5 installed and if you aren’t currently using a Genesis child theme, this plugin is totally useless.

    Once it’s installed, go to the Appearance tab and click the Headers menu option. You will be given the opportunity to upload a file to replace the logo. The page will also tell the size of the image to upload (if you upload a different sized image, you’ll be asked to crop the image prior to saving).

    All current Genesis Child Themes are handled in this plugin with the following two exceptions
    – Prose: The functionality is built in to that child theme already.
    – Family Tree: I’ll add this one when I can figure out how best to go about it.

    Let me know what you think of the plugin!

    Cheers!

    Continue Reading

    john

      More by john

      Paypal Express Checkout and Credit Cards

      Posted on March 16, 2011

      I have found hundreds if not thousands of posts on the Internet at large saying that Paypal won’t let customers use credit cards if they don’t have a Paypal account if you’ve integrated your cart using Express Checkout.

      OK, that’s a bit of hyperbole. It probably wasn’t hundreds but it was enough that while initially searching for a solution, I took it as gospel that is just wasn’t possible.

      Then, when attempting to convert WP Event Ticketing to use Web Payments Standard and hitting some snags, it took me almost an hour to hit upon the correct combination of words while searching Google that led me to this post.

      The relevant information is this

      It appears that some of the confusion surrounds the myth that Express Checkout requires users to have a PayPal account to make payment. This is patently untrue. To allow credit card payments without creation of a PayPal account set SOLUTIONTYPE to Sole in the SetExpressCheckout api call. To change the first page of the Express Checkout flow from a PayPal login page to both a credit card form AND a paypal login form set LANDINGPAGE to Billing in the SetExpressCheckout api call.

      That’s all there is to it. The relevant bit of my code went from this

                          
      $nvp = array('PAYMENTREQUEST_0_AMT' => $total,
              "RETURNURL" => $returnsite,
              "CANCELURL" => $returnsite,
              "PAYMENTREQUEST_0_PAYMENTACTION" => 'Sale',
              "PAYMENTREQUEST_0_CURRENCYCODE" => 'USD'
      

      to

                          
      $nvp = array('PAYMENTREQUEST_0_AMT' => $total,
              "RETURNURL" => $returnsite,
              "CANCELURL" => $returnsite,
              "PAYMENTREQUEST_0_PAYMENTACTION" => 'Sale',
              "PAYMENTREQUEST_0_CURRENCYCODE" => 'USD',
              "SOLUTIONTYPE" => 'Sole',
              "LANDINGPAGE" => 'Billing'
      

      That’s all there is to it. Customers are now faced with either using their credit cards or using their Paypal account while checking out.

      Tonight we are releasing WP Event Ticketing version 1.2.2 which gives your buyers the option to purchase tickets with a credit card without requiring them to have a Paypal account.

      Continue Reading

      Todd Huish

        More by Todd Huish

        The path to admin menu enlightenment

        Posted on February 25, 2011

        We’ve all seen this menu a million times. It’s our friendly neighborhood WordPress admin nav menu. If your’re the kind of person who enjoys making plugins you’re probably on the following path.

        Level 1

        Q) My plugin is simple and all my options fit on a single page. How do I add an option page for my plugin?
        A) Let add_options_page() be your guide.

        add_options_page('Simple Options','Simple','activate_plugins','simple-admin-settings',array('tutorial','controlForm'));

        Level 2

        Q) My plugin is not that simple anymore and I’m going to need more than one page to control all this awesome. How do I make a whole new top level nav container like Users, Tools or Settings?
        A) add_menu_page() with a couple add_submenu_page() calls will solve this problem lickety split.

        add_menu_page('Complicated Options', 'Complicated', 'activate_plugins', 'complicated', array("tutorial", "controlForm"));
        add_submenu_page('complicated', 'Reporting', 'Reporting', 'activate_plugins', 'reporting', array('tutorial', 'reporting'));
        add_submenu_page('complicated', 'More Options', 'More', 'activate_plugins', 'moreoptions', array('tutorial', 'moreControl'));
        

        Level 3

        Q) My awesome is contained in a box but I don’t want the first link to match the name of the nav container. I want reporting to be first and I don’t want that first link to say Complicated. How do I change the name in that first link?
        A) add_menu_page() with a couple add_submenu_page() still but we have to do something a little weird.

        What you have to do is make the first submenu page have the same slug as the top level menu page and have them both point at the same callback.

        add_menu_page('Complicated Options', 'Complicated', 'activate_plugins', 'complicated', array("tutorial", "reporting"));
        add_submenu_page('complicated', 'Reporting', 'Reporting', 'activate_plugins', 'complicated', array('tutorial', 'reporting'));
        add_submenu_page('complicated', 'Options', 'Options', 'activate_plugins', 'control', array('tutorial', 'controlForm'));
        add_submenu_page('complicated', 'More Options', 'More', 'activate_plugins', 'moreoptions', array('tutorial', 'moreControl'));
        

        Level 4 – Menu Nirvana

        Q) My menu link is perfect in every way but for UI purposes I want the menu page to show up somewhere else in the nav menu, not at the bottom. How do I place it somewhere else?
        A) add_menu_page() and its siblings add_object_page() and add_utility_page() help you out here.

        First, a brief description of the “priority” argument to add_menu_page(). You can forcibly put your menu page wherever you want in the nav menu. If you ever programmed BASIC in the days you had to type line numbers this will seem familiar. Each menu has a position, illustrated here

        So if you wanted to drop your menu right after comments you could do the following (but don’t, I’ll explain why in a second)

        add_menu_page('Tickets', 'Tickets', 'activate_plugins', 'eventticketing', array("eventTicketingSystem", "ticketReporting"),'',30);
        

        It looks good but there is a fatal flaw in this method and that is that there is no internal check to make sure that 2 plugins aren’t picking the same position in the menu. In this case what happens is whichever plugin gets loaded second wins. Your plugin will work just find and you can manually get to all your option pages via their slugs but you won’t be able to see it at all. We discovered this the hard way when we picked 30 for a plugin we wrote. 30 is an especially bad one to chose as that’s the same menu position that Thesis picks for itself.

        WordPress understands this desire, however, and gives you an easy way to pick that spot which picking 30 would get you: add_object_page().

        add_object_page('Complicated Options', 'Complicated', 'activate_plugins', 'complicated', array("tutorial", "reporting"));
        add_submenu_page('complicated', 'Reporting', 'Reporting', 'activate_plugins', 'complicated', array('tutorial', 'reporting'));
        add_submenu_page('complicated', 'Options', 'Options', 'activate_plugins', 'control', array('tutorial', 'controlForm'));
        add_submenu_page('complicated', 'More Options', 'More', 'activate_plugins', 'moreoptions', array('tutorial', 'moreControl'));
        

        The benefit here is that it just appends and as long as plugins are using it, they won’t be bumping into each other. There’s also add_utility_page() which appends your menu below the Settings menu page. The difference between this and just not using a position whatsoever is that this method puts it above anything menu page which has no position defined. Position 81 instead of position 100 as seen in the previous screenshots.

        Hopefully this helps you understand menu positioning a little bit more and if you find that your menu position is causing your plugin to disappear in certain circumstances, take a look at what else you have activated and what positions they’re grabbing. Odds are it’s the same one you are

        And, like so many things in life, it’s not always what you know but who you know. Big, big thank you to Brandon Dove for pointing out how to rename the first link in a menu page to be something different than the name of the menu page.

        Continue Reading

        Todd Huish

          More by Todd Huish

          A Change at 9seeds

          Posted on February 4, 2011

          Normally when we have BIG NEWS to announce, we’re really excited to share it with the World. Unfortunately, today’s news isn’t like that and has been one of the toughest posts I’ve had write.

          I am sad to announce that on February 14th, Shayne Sanderson will be leaving 9seeds.

          We know you have questions. Heck, we have a ton of them, too. But, let me answer what seem to be the two most important; why? and what now?

          The Why
          Things change. Situations change. Building a business is hard work and sometimes that can cause issues in other areas of your life. Shayne feels it’s best that he step away, refocus himself and his energy and try something different. We know that everybody loves a bit of drama. You are going to be sorely disappointed. There just isn’t any.

          The What Now
          Todd and I spoke at length about our plans for 9seeds. We are both really happy with the direction things are going and have every intention to continue on our path. We will continue to take on new development projects and we will most definitely continue working on our own plugins.

          Shayne has been in integral part of the growth of 9seeds over the past 16 months and we are going to miss having him on our team. Over the past two years Shayne and his wife Abbie have become part of our family. Both Todd and I have assured him that we are friends first and business partners second. Losing him as a partner hurts, losing him as a friend would be devastating.

          Best of luck my friend.

          Continue Reading

          john

            More by john
            • Prev
            • Page 1
            • Interim pages omitted …
            • Page 12
            • Page 13
            • Page 14
            • Page 15
            • Page 16
            • Interim pages omitted …
            • Page 20
            • Next

            Footer

            Get in Touch

            • New Project Inquiry
            • Product Support and General Inquiry
            • Store Purchase Terms and Conditions
            • Store FAQ
            • Cookie Policy
            • Privacy Policy

            Our Services

            • Custom WP Development
            • Theme Store
            • Plugin Store

            WordPress Plugins for Sale

            • Time Tracker
            • Authorize.net SIM Gateway

            WordPress Plugins for Free

            • Simple Calendar
            • WP Chargify
            • Facebook
            • Twitter
            • LinkedIn
            • WordPress
            • GitHub

            Copyright 2025 | 9seeds, LLC

            Like nearly all websites this one uses cookies too. Like most users we think consent banners like these are a dumb solution, but it's what we've got until new laws are passed. We use cookies on our website for remembering your preferences, for example if you're logged in or what is in your cart. We also use 3rd party cookies for analytics so we know what pages on the site are most popular. By clicking “Accept”, you consent to the use of ALL the cookies.
            Do not sell my personal information.
            Cookie SettingsAccept
            Manage consent

            Privacy Overview

            This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience and may even preclude you being able to login to the website.
            Necessary
            Always Enabled
            Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
            CookieDurationDescription
            __stripe_mid1 yearThis cookie is set by Stripe payment gateway. This cookie is used to enable payment on the website without storing any patment information on a server.
            __stripe_sid30 minutesThis cookie is set by Stripe payment gateway. This cookie is used to enable payment on the website without storing any patment information on a server.
            cookielawinfo-checkbox-advertisement1 yearSet by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Advertisement" category .
            cookielawinfo-checkbox-analytics1 yearSet by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Analytics" category .
            cookielawinfo-checkbox-necessary1 yearSet by the GDPR Cookie Consent plugin, this cookie is used to record the user consent for the cookies in the "Necessary" category .
            cookielawinfo-checkbox-others1 yearSet by the GDPR Cookie Consent plugin, this cookie is used to store the user consent for cookies in the category "Others".
            cookielawinfo-checkbox-performance1 yearSet by the GDPR Cookie Consent plugin, this cookie is used to store the user consent for cookies in the category "Performance".
            Functional
            Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features.
            Performance
            Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.
            Analytics
            Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
            CookieDurationDescription
            _ga2 yearsThe _ga cookie, installed by Google Analytics, calculates visitor, session and campaign data and also keeps track of site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognize unique visitors.
            _gid1 dayInstalled by Google Analytics, _gid cookie stores information on how visitors use a website, while also creating an analytics report of the website's performance. Some of the data that are collected include the number of visitors, their source, and the pages they visit anonymously.
            CONSENT2 yearsYouTube sets this cookie via embedded youtube-videos and registers anonymous statistical data.
            Advertisement
            Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads.
            CookieDurationDescription
            VISITOR_INFO1_LIVE5 months 27 daysA cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.
            YSCsessionYSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.
            yt-remote-connected-devicesneverYouTube sets this cookie to store the video preferences of the user using embedded YouTube video.
            yt-remote-device-idneverYouTube sets this cookie to store the video preferences of the user using embedded YouTube video.
            Others
            Other uncategorized cookies are those that are being analyzed and have not been classified into a category as yet.
            CookieDurationDescription
            cookielawinfo-checkbox-functional1 yearThe cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
            SAVE & ACCEPT
            Powered by CookieYes Logo