• 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

New plugin, WP Time Tracker

Posted on July 1, 2013

As our team began to grow, tracking billable time became more and more important. I like the work we do, but I’m not a big fan of doing it for free. Shocker, right? We tried several online services for time tracking, but none were a great fit. We didn’t want to pay a monthly fee for a service that didn’t meet our needs. So that’s when we did what we normally do, we built a solution in WordPress.

Last year we built the first version of Time Tracker as a theme for WordPress. It served our purpose really well and also let us store all the data locally which would make it really easy to add additional functionality over time if needed it. We had a couple people who wanted to try using it, but we found that handing it off wasn’t as easy as it should have been. It required a few add-on plugins and needed a couple bits of customization under the hood. If we were going to make this available to the public, something needed to be done. So we kept the pieces we liked, rewrote the pieces we didn’t and a short time later, we had a plugin that was was better than the original solution.

Introducing WP Time Tracker

Simple. Our goal here is to keep things simple. WP Time Tracker is designed to let you easily track time for you, your staff and your contractors without being overly complicated. If you’re familiar with the WordPress admin panel (and I’ll bet you are), you’re going to find working with Time Tracker very familiar.

Taxonomy of Clients
Adding clients is simple and works the same as adding categories to a post. Making it easy to access a list of all work done for a selected client.

Add Hours
The form for adding hours is uncluttered and gets right to the point. Select the date you did the work using a pop-up date picker, select the client, add a description and the amount of time spent and you’re done. Simple.

Unbilled hours report
The plugin currently offers up two reports. The unbilled hours report seen here shows a list of all clients with hours waiting to be invoiced. There’s also a client history report that lists all clients and the total hours tracked for the life of the client.

Create an Invoice
When it’s time to bill a client, the create invoice page will let you see a list of all work performed for a selected client within a selected date range. (as a side note, and just to clear up any possible confusion, the ‘create invoice’ page does not generate or send an invoice to the client. It simply allows you to mark the items as invoiced. This may change in a future release.)

Add your staff or contractors as users on your site, and they’ll be able to add hours without having access to your reports.

Boom. Simple.

Purchase your copy of WP Time Tracker today!
[purchase_link id=”1290″ text=”Purchase” style=”button” color=”blue”]

Continue Reading

john

    More by john

    Want more free plugins? You might have to pay for them

    Posted on June 4, 2013

    Normally I do a lot of contemplation while riding my bike. This week, it happened while mowing the lawn. I was thinking about Chris Lema’s post about commercial WordPress plugins being too inexpensive.

    Strangely enough, it got me thinking not about commercial plugins, but about free plugins. Everyone wants free plugins. WordPress is free, BuddyPress is free. There are several great free plugins out there that will make WordPress do strange and wonderful things.

    Continue Reading

    justin

      More by justin

      Inserting yourself as admin into WordPress

      Posted on February 28, 2013

      On quite a few occasions I’ve had clients send me a complete backup of their site during the discovery period. Usually this is because they don’t have a Release Candidate / Quality Assurance / Staging / Development version(s) of their site where changes can be made, and approved, without affecting the live site.

      Without standing on my soapbox too long – if your website lacks a staging site, version control for custom code, or backups – you should address them immediately.

      In this case, I was glad the client had at least one backup (the one that was provided to me) which I could turn into a local WordPress installation to begin development. Since the client didn’t provide a WordPress Admin user and password, I just decided to insert myself into WordPress.

      Continue Reading

      justin

        More by justin

        Moving forums from SimplePress to BBPress

        Posted on February 4, 2013

        I was recently asked by a member of our local WordPress meetup group which forum software I would suggest using. I mentioned that I had been using SimplePress for a while, but wasn’t in love with it. I had used BBPress quite a while ago, before it got the major revamp and if I had to choose which to use for a new site, I would go with BBPress. Then, with a stroke of great timing, the BBPress 2.3 beta was released the following day. Since it was fresh in my mind, I installed the beta to test it out. In short, BBPress has come a LONG way in the past year. So much so that we decided it was time to move our support forums off of SimplePress. That process would prove to be tricky.

        To follow are the steps I took to convert our forums from SimplePress version 4.4.0 to BBPress version 2.3

        Step 0

        Backup All The Things

        Seriously. Just do it.

        I went one step further than just backing everything up. Instead, I exported the database and set up a separate WordPress install just to run the conversion. This way, if everything broke I could simple delete it and start again. And now the actual conversion process.

        Step 1: Upgrade SimplePress

        When figuring out what it would take to do the conversion, I found that BBPress could convert SimplePress version 5 forums right from the tools menu. So in order to do the conversion, I first needed to upgrade SimplePress. Unfortunately, their upgrade only works with version 4.5.x. After reading this page, I took these steps:

        – Deactivate the SimplePress plugin (Do Not uninstall it, just deactivate it)
        – Remove the /plugins/simple-forum/ folder from your server
        – Download the latest version of SimplePress
        – Upload simple-press folder to /plugins/simple-press/ on your server
        – Activate the plugin

        Once the plugin is activated, you’ll have the “Forums” item added back to your menu which will link you to an upgrade process. Start the upgrade process and let it run. For our small forum this process took 3-4 minutes. I’m assuming for a larger forum, this process could take a bit longer. Be patient.

        After I ran the update, poking around the forums admin area, everything looked fine. I then checked the actual forums and found this message:

        SP error

        I was concerned that I had lost all my data, but the forum stats displaying below gave me some comfort.

        Forum Stats

         

        Step 2: Install BBPress

        Not wanting BBPress and SimplePress to colide, I started by deactivating SimplePress. I then uploaded the BBPress 2.3 beta to /plugins/bbpress/ and activated it from the plugins menu.

        Yeah, that part was pretty simple.

        Step 3: Import SimplePress forums

        Just a quick note. At the time of this writing BBPress 2.3 beta 2 has a bug related to importing of data. I posted a ticket about it in Trac and I’m sure it will be fixed soon. To get around the bug, I ran a search and replace on the database to remove any instance of   as it causes the post to be truncated upon import.

        Start by going to Tools -> Forums in the WordPress admin area, then click the Import Forums tab at the top. From the dropdown select SimplePress 5 and then fill in the database information. Just under that you’ll see a few options. The most important of which is the Convert Users option.

        The first time I ran the import, I was installing BBPress on the same WordPress installation that SimplePress had previously been installed on. This meant that all my user accounts already existed and their posts were all connected to them. I clicked the convert users tab prior to running the import, and all the posts, once converted, were once again attached to their rightful owners as part of BBPress.

        I then decided that I wanted to move my forum to a different WordPress install on a different domain. When doing so, I accidentally forgot to click the Convert Users checkbox. The results were less than optimal. All of the posts DID come over to the new installation, but they were all attached to a single user account. Oops.

        I can’t think of a reason (although, I’m sure there is one or this wouldn’t be an option) why you would ever want to NOT click the Convert Users checkbox. So before you click Start, make sure it’s checked.

        Step 4: Repair Forums

        After running the conversion in step 3, I was reviewing the forums and noticed that all the data appeared to be in place and the posts were all attached to the proper people, but, all of the counts were off. Anywhere where it said how many posts or replies were on a post or topic was all displaying zero. Back to the admin area we go. This time to Tools -> Forums and click the Repair Forums tab where you will find the following options:

        Repair Forums

        Taking the advice along the top, I clicked the first item in the list and then clicked Repair Items. It took a matter of seconds to complete. I then went through each item on the list, one at a time, and checked the box and ran the repair. When I was done I went back to the forums to find that all the counts had been updated and my forums were working perfectly.

        Once you know all the pieces, the process isn’t actually all that difficult. But hopefully I just saved you some trial and error time.

        Done Done. (as Chris Lema would say)

         

        Continue Reading

        john

          More by john

          WP Affiliate Manager version 1.5

          Posted on January 7, 2013

          We’re glad to announce the release of WP Affiliate Manager version 1.5.0.  This version initially centered around a bugfix having to do with a namespace conflict in the latest (3.8.9.x) versions of WP e-Commerce.  However in the process, we were able to add several minor enhancements that will enhance WP Affiliate Manager for the future.

          gettext translation wrappers

          While not all screens have had the gettext translation wrappers applied (notably the settings and paypal pages in wp-admin), everything else has been added.  Expect a 1.5.x release early in 2013 that will be fully translatable.

          As such, we’re putting out a call for translators.  We are willing to offer free one-year licenses (with support & upgrades) for WP Affiliate Manager to anyone who contributes a full translation in their own language. We have a couple of people already talking to us about certain languages, so if you’re interested, please fill out the form on our translation page and let us know what language you’d like to help us add to WP Affiliate Manager!

          money_format() for Windows

          money_format() is a native PHP function, but it does not exist on Windows platforms.  We added a simple one for those hosting in Windows environments which should get the job done.

          PayPal enhancements

          First, the sandbox PayPal URL has been fixed.  This is mostly used for development/testing purposes, but none-the-less is important.

          Also, we removed the requirement for needing the PHP cURL module requirement.  Instead, WP Affiliate Manager uses WordPress’ native HTTP request methods.

          jQuery UI Tabs + cookies + mod_security bugfix

          An interesting sidenote… we discovered a bug where if you went to the 2nd tab on WP Affiliate Manager’s “My Affiliates” screen on our test server, your next navigation point in WordPress would either result in a 404 error, or an endless loop of 302 redirects.

          Turns out the bug was caused by a perfect storm of Apache’s mod_security (which is enabled on our test server) and the use of jQuery UI Tabs with a cookie save option.  What was occurring was the cookie name was being saved as “ui-tabs-1” and if your last visited tab was the 2nd tab (index 1) the cookie was saved as “ui-tabs-1=1”.  This would be passed with each HTTP request as a cookie header.  Since mod_security doesn’t like anything where “1=1”, it was changing the request, causing WordPress to become all sorts of confused.  You can see a bug report about it here: http://bugs.jqueryui.com/ticket/8027

          The solution was to name the cookie, so the automatically generated name wasn’t used:

          jQuery("#tabs").tabs({
              cookie: {
                  name: 'wpam_detail_tab'
              }
          });

          Enjoy all of the fixes!

          Continue Reading

          justin

            More by justin
            • Prev
            • Page 1
            • Interim pages omitted …
            • Page 9
            • Page 10
            • Page 11
            • Page 12
            • Page 13
            • 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