Table of Contents
Preface
Chapter 1: Preparing for WordPress Development
Chapter 2: Anatomy of a Plugin
Chapter 3: Social Bookmarking
Chapter 4: Ajax Search
Chapter 5: Content Rotator
Chapter 6: Standardized Custom Content
Chapter 7: Custom Post Types
Chapter 8: Versioning Your Code with Subversion (SVN)
Chapter 9: Preparing Your Plugin for Distribution
Chapter 10: Publishing Your Plugin
Appendix A: Recommended Resources
Appendix B: WordPress API Reference
Index
- Chapter 1: Preparing for WordPress Development
- WordPress background
- Extending WordPress
- Understanding WordPress architecture
- Templating
- Introducing plugins
- Summarizing architecture
- Tools for web development
- WordPress
- Mac
- Windows
- Text editor
- Using an IDE
- FTP client
- MySQL client
- Coding best practices
- Basic organization
- Isolate tasks into functions
- Use classes
- Use descriptive variable names
- Use descriptive function names
- Separate logic and display layers
- Go modular, to a point
- Avoid short tags
- Planning ahead / starting development
- Interfaces
- Localization
- Documentation for the developer
- Version control
- Environment
- Tests
- Security
- Printing user-supplied data to a page
- Using user-supplied data to construct database queries
- Debugging
- Clearing your browser cache
- Updating your php.ini file
- Configuring your wp-config.php file
- Checking your syntax
- Checking values
- Exercise
- Summary
- Chapter 2: Anatomy of a Plugin
- Deconstructing an existing plugin: "Hello Dolly"
- Activating the plugin
- Examining the hello.php file
- Information header
- Exercise—breaking the header
- Location, name, and format
- Understanding the Includes
- Exercise – parse errors
- Bonus for the curious
- User-defined functions
- Exercise—an evil functionless plugin
- What just happened
- Omitting the closing "?>" PHP tag
- A better example: Adding functions
- Referencing hooks via add_action() and add_filter()
- Actions versus Filters
- Exercise—actions and filters
- Exercise—filters
- Reading more
- Summary
- Chapter 3: Social Bookmarking
- The overall plan
- Proof of concept
- Avoiding conflicting function names
- The master plugin outline
- The plugin information header
- In your browser—information header
- Adding a link to the post content
- Documenting our functions
- In your browser—linking to the post content
- Adding JavaScript to the head
- Making our link dynamic
- Adding a button template
- Getting the post URL
- In your browser—getting the post URL
- Getting the post title
- Getting the description
- Getting the media type
- Getting the post topic
- In your browser—title, description, and topic
- Checking WordPress versions
- Summary
- Chapter 4: Ajax Search
- What is Ajax?
- The overall plan
- The proof of concept mock up
- Hooking up jQuery
- Test that jQuery has loaded
- What happened?
- Using the FireBug console directly
- Writing HTML dynamically to a target div
- Multi-line strings
- Viewing the generated page
- Anonymous functions
- Adding a div on the fly
- Create a listener
- Fetching data from another page
- Creating our plugin
- Creating index.php and activating the plugin
- Creating our first PHP class
- Updating index.php
- Testing your version of PHP
- Testing for searchable pages
- Adding your own CSS files
- Adding your search handler
- Adding your own JavaScript
- Handling Ajax search requests
- Formatting your search results
- Summary
- Chapter 5: Content Rotator
- The plan
- Widget overview
- Preparation
- Activating your plugin
- Activating the widget
- Having problems?
- Parents and children: extending classes
- Objects vs. libraries: when to use static functions
- Add custom text
- Adding widget options
- Generating random content
- Expiration dates: adding options to our widget
- Expiration dates: enforcing the shelf life
- Explaining the $instance
- Adding a custom manager page
- Adding options to the custom manager page
- Randomizing content from the database
- Review of PHP functions used
- Summary
- Chapter 6: Standardized Custom Content
- What WordPress does for you: custom fields
- What WordPress doesn't do for you
- Standardizing a post's custom fields
- Creating a new plugin
- Removing the default WordPress form for custom fields
- Creating our own custom meta box
- Defining custom fields
- Generating custom form elements
- Saving custom content
- Having trouble saving data?
- Displaying custom data in your Templates
- Copying a theme
- Modifying the theme
- Granular display of custom fields
- Bonus for the MySQL curious
- Known limitations
- Summary
- Chapter 7: Custom Post Types
- Background: What's in a name?
- Understanding register_post_type()
- Customizing our post type
- Using shortcodes
- Testing our shortcode
- Customizing our plugin
- Creating a settings shortcut link
- Cleaning up when uninstalling
- Summary
- Chapter 8: Versioning Your Code with Subversion (SVN)
- Why Subversion?
- Understanding the terminology and concepts
- Checking out a local working copy
- SVN folder structure
- Checkout, revisited
- Setting up an SVN repository
- Checking out a local working copy of our repo
- Adding files
- Committing changes to the repository
- Overcoming errors
- Verifying the new state of your repository
- Adding more files to your repository
- Removing files from the repository
- Updating your working copy
- Tagging a version
- Reverting an entire project
- Reverting a single file
- Moving files
- Exporting your working copy
- Quick reference
- Summary
- Chapter 9: Preparing Your Plugin for Distribution
- Public enemy number one: PHP notices
- PHP short tags
- Conflicting names
- Modifying loader.php
- Testing WordPress version
- Testing PHP version
- Testing MySQL version
- Testing PHP modules
- Testing WordPress installed plugins
- Custom tests
- Unit tests
- WordPress limitations
- Health check page
- Storing test results in the database
- Death to clippy: Use sensible configurations
- Double check your interface
- Documentation
- Identify the purpose
- Learning to drive: Keeping it relevant
- Phrasebooks vs. dictionaries: Give examples
- Analogy: The three bears
- Analogy: PC load letter
- The decalog of documentation
- Summary
- Chapter 10: Publishing Your Plugin
- Internationalization and localization
- Processing each message
- Choosing a textdomain
- Best practices
- Working with formatting
- More advanced messages
- Plural vs. singular
- More complex messages
- Notes to translators
- Language files
- Creating a POT file
- Creating translations: .po files
- Loading a textdomain
- Updating a translation
- Format for the readme.txt file
- Section – installation
- Section – Frequently Asked Questions
- Section – screenshots
- New addition – videos
- Section – summary
- Requesting and using SVN access
- Publicity and promotion
- Summary
- Appendix A: Recommended Resources
- PHP reference
- Function reference
- The WordPress forums
- WebDev Studios
- Viper007Bond
- Kovshenin
- SLTaylor
- XPlus3
- WP Engineer
- Other plugins
- Appendix B: WordPress API Reference
- PHP functions
- dirname
- file_get_contents
- preg_match
- preg_replace
- print_r
- sprintf
- strtolower
- substr
- WordPress Functions
- __
- _e
- add_action
- add_filter
- add_meta_box
- add_options_page
- check_admin_referer
- esc_html
- get_option
- get_post_meta
- get_the_ID
- register_post_type
- remove_meta_box
- screen_icon
- the_content
- the_meta
- update_post_meta
- wp_count_posts
- wp_die
- wp_nonce_field
- Actions
- admin_init
- admin_menu
- do_meta_boxes
- init
- save_post
- widgets_init
- wp_head
- Filters
- the_content