vettebro1 Posted June 19, 2009 Share Posted June 19, 2009 Hi All, Here is a third party plugin called advanced_excerpt for wordpress. It basically will truncate a long post to a specified character amount while leaving HTML formatting intact. When a post is truncated the ending line of the truncated post has this from a input field in a settings page applied: <th scope="row"><label for="<?php echo $this->name ?>_ellipsis"><?php _e("Ellipsis:", $this->text_domain); ?></label></th> I want to append this to it so any post that gets truncated will have a link to display the full post. <a class="more" href="<?php the_permalink() ?><?php print $urlType; ?>" rel="nofollow"><span><?php print $readType; ?></span></a> Here is the php code from the author. <?php /* Plugin Name: Advanced Excerpt Plugin URI: http://sparepencil.com/code/advanced-excerpt/ Description: Several improvements over WP's default excerpt. The size of the excerpt can be limited using character or word count, and HTML markup is not removed. Version: 0.2.2 Author: Bas van Doren Author URI: http://sparepencil.com/ Copyright 2007 Bas van Doren This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ if(!class_exists('AdvancedExcerpt')) : class AdvancedExcerpt { var $name; var $text_domain; var $mb; var $skip_next_call; function AdvancedExcerpt() { $this->name = strtolower(get_class($this)); $this->text_domain = $this->name; $this->skip_next_call = false; $this->charset = get_bloginfo('charset'); // Carefully support multibyte languages if(extension_loaded('mbstring') && function_exists('mb_list_encodings')) $this->mb = in_array($this->charset, mb_list_encodings()); load_plugin_textdomain($this->text_domain, PLUGINDIR . '/advanced-excerpt/'); register_activation_hook(__FILE__, array(&$this, 'install')); // Nothing to do on deactivation //register_deactivation_hook(__FILE__, array(&$this, 'uninstall')); add_action('admin_menu', array(&$this, 'add_pages')); // Replace the default filter (see /wp-includes/default-filters.php) remove_filter('get_the_excerpt', 'wp_trim_excerpt'); add_filter('get_the_excerpt', array(&$this, 'filter')); } function __construct() { self::AdvancedExcerpt(); } function filter($text, $length = null, $use_words = null, $ellipsis = null, $allowed_tags = null, $no_custom = null, $api_used = false) { global $id, $post; // Avoid trouble when the API (aka template tag) was used if($this->skip_next_call) { $this->skip_next_call = false; return $text; } $this->skip_next_call = $api_used; $no_custom = (!is_null($no_custom)) ? (int) (bool) $no_custom : get_option($this->name . '_no_custom'); // Only make the excerpt if it does not exist or 'No Custom Excerpt' is set to true if('' == $text || $no_custom) { $length = (!is_null($length)) ? (int) $length : get_option($this->name . '_length'); $use_words = (!is_null($use_words)) ? (int) (bool) $use_words : get_option($this->name . '_use_words'); $ellipsis = (!is_null($ellipsis)) ? $ellipsis : get_option($this->name . '_ellipsis'); $allowed_tags = (is_array($allowed_tags)) ? $allowed_tags : get_option($this->name . '_allowed_tags'); $allowed_tags = '<' . implode('><', $allowed_tags) . '>'; $text = apply_filters('the_content', get_the_content('')); // From the default wp_trim_excerpt(): // Some kind of precaution against malformed CDATA in RSS feeds I suppose $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text, $allowed_tags); if(1 == $use_words) { // Count words, not HTML tags if($length > count(preg_split('/[\s]+/', strip_tags($text), -1))) return $text; // Now we start counting $text_bits = preg_split('/([\s]+)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE); $in_tag = false; $n_words = 0; $text = ''; foreach($text_bits as $chunk) { // Determine whether a tag is opened (and not immediately closed) in this chunk if(0 < preg_match('/<[^>]*$/s', $chunk)) $in_tag = true; elseif(0 < preg_match('/>[^<]*$/s', $chunk)) $in_tag = false; // This should check if there is a word before the tag // but it doesn't work very well /* if($in_tag && $this->substr($chunk, 0, 1) != '<') $n_words++; */ // Is there a word? if(!$in_tag && '' != trim($chunk) && $this->substr($chunk, -1, 1) != '>') $n_words++; $text .= $chunk; if($n_words >= $length && !$in_tag) break; } $text = $text . $ellipsis; } else { // Count characters, not whitespace, not those belonging to HTML tags if($length > $this->strlen(strip_tags($text))) return $text; $in_tag = false; $n_chars = 0; for($i = 0; $n_chars < $length || $in_tag; $i++) { // Is the character worth counting (ie. not part of an HTML tag) if($this->substr($text, $i, 1) == '<') $in_tag = true; elseif($this->substr($text, $i, 1) == '>') $in_tag = false; elseif(!$in_tag && '' != trim($this->substr($text, $i, 1))) $n_chars++; // Prevent eternal loops (this could happen with incomplete HTML tags) if($i >= $this->strlen($text) - 1) break; } $text = $this->substr($text, 0, $i) . $ellipsis; } $text = force_balance_tags($text); } return $text; } function update_options() { $length = (int) $_POST[$this->name . '_length']; $use_words = ('on' == $_POST[$this->name . '_use_words']) ? 1 : 0 ; $no_custom = ('on' == $_POST[$this->name . '_no_custom']) ? 1 : 0 ; $ellipsis = (get_magic_quotes_gpc() == 1) ? stripslashes($_POST[$this->name . '_ellipsis']) : $_POST[$this->name . '_ellipsis']; $ellipsis = $ellipsis; $allowed_tags = (array) $_POST[$this->name . '_allowed_tags']; update_option($this->name . '_length', $length); update_option($this->name . '_use_words', $use_words); update_option($this->name . '_no_custom', $no_custom); update_option($this->name . '_ellipsis', $ellipsis); update_option($this->name . '_allowed_tags', $allowed_tags); ?> <div id="message" class="updated fade"><p>Options saved.</p></div> <?php } function page_options() { global $allowedposttags; if ('POST' == $_SERVER['REQUEST_METHOD']) { check_admin_referer($this->name . '_update_options'); $this->update_options(); } $length = get_option($this->name . '_length'); $use_words = get_option($this->name . '_use_words'); $no_custom = get_option($this->name . '_no_custom'); $ellipsis = htmlentities(get_option($this->name . '_ellipsis')); $allowed_tags = get_option($this->name . '_allowed_tags'); ?> <div class="wrap"> <div id="icon-options-general" class="icon32"><br /></div> <h2><?php _e("Advanced Excerpt Options", $this->text_domain); ?></h2> <form method="post" action=""> <?php if ( function_exists('wp_nonce_field') ) wp_nonce_field($this->name . '_update_options'); ?> <table class="form-table"> <tr valign="top"> <th scope="row"><label for="<?php echo $this->name ?>_length"><?php _e("Excerpt Length:", $this->text_domain); ?></label></th> <td> <input name="<?php echo $this->name ?>_length" type="text" id="<?php echo $this->name ?>_length" value="<?php echo $length; ?>" size="2" /> <input name="<?php echo $this->name ?>_use_words" type="checkbox" id="<?php echo $this->name ?>_use_words" value="on" <?php echo (1 == $use_words) ? 'checked="checked" ': ''; ?>/> <?php _e("Use words?", $this->text_domain); ?> </td> </tr> <tr valign="top"> <th scope="row"><label for="<?php echo $this->name ?>_ellipsis"><?php _e("Ellipsis:", $this->text_domain); ?></label></th> <td> <input name="<?php echo $this->name ?>_ellipsis" type="text" id="<?php echo $this->name ?>_ellipsis" value="<?php echo $ellipsis; ?>" size="5" /> <?php _e('(use <a href="http://www.w3schools.com/tags/ref_entities.asp">HTML entities</a>)', $this->text_domain); ?> <br /> <?php _e("Will substitute the part of the post that is omitted in the excerpt.", $this->text_domain); ?> </td> </tr> <tr valign="top"> <th scope="row"><label for="<?php echo $this->name ?>_no_custom"><?php _e("No Custom Excerpts:", $this->text_domain); ?></label></th> <td> <input name="<?php echo $this->name ?>_no_custom" type="checkbox" id="<?php echo $this->name ?>_no_custom" value="on" <?php echo (1 == $no_custom) ? 'checked="checked" ': ''; ?>/> <?php _e("Generate excerpts even if a post has a custom excerpt attached.", $this->text_domain); ?> </td> </tr> <tr valign="top"> <th scope="row"><?php _e("Keep Markup:", $this->text_domain); ?></th> <td> <table> <?php $i = 0; foreach($allowedposttags as $tag => $spec) : if(1 == $i / 4) : ?><tr><?php endif; $i++; ?> <td><input name="<?php echo $this->name ?>_allowed_tags[]" type="checkbox" id="<?php echo $this->name ?>_allow_<?php echo $tag; ?>" value="<?php echo $tag; ?>" <?php echo (in_array($tag, $allowed_tags)) ? 'checked="checked" ': ''; ?>/> <code><?php echo $tag; ?></code></td><?php if(1 == $i / 4) : $i = 0; ?></tr><?php endif;?> <?php endforeach; if(1 != $i / 4) : ?><td colspan="<?php echo (4 - $i); ?>"> </td></tr><?php endif;?> </table> <!--<?php _e("See <a href=\"http://xref.redalt.com/wptrunk/nav.htm?wp-includes/kses.php.source.htm\"><code>wp-includes/kses.php</code></a> if you want to control more tags.", $this->text_domain); ?>--> </td> </tr> </table> <p class="submit"><input type="submit" name="Submit" class="button-primary" value="<?php _e("Save Changes", $this->text_domain); ?>" /></p> </form> </div> <?php } function add_pages() { add_options_page(__("Advanced Excerpt Options", $this->text_domain), __("Excerpt", $this->text_domain), 'manage_options', 'options-' . $this->name, array(&$this, 'page_options')); } function install() { global $allowedposttags; foreach($allowedposttags as $tag => $spec) $allowed_tags[] = $tag; add_option($this->name . '_length', 40); add_option($this->name . '_use_words', 1); add_option($this->name . '_no_custom', 0); add_option($this->name . '_ellipsis', '…'); add_option($this->name . '_allowed_tags', $allowed_tags); } function uninstall() { // Nothing to do (note: deactivation hook is also disabled) } // Careful multibyte support (fallback to normal functions if not available) function substr($str, $start, $length = null) { $length = (is_null($length)) ? $this->strlen($str) : $length; if($this->mb) return mb_substr($str, $start, $length, $this->charset); else return substr($str, $start, $length); } function strlen($str) { if($this->mb) return mb_strlen($str, $this->charset); else return strlen($str); } // PHP seems to lack a simple complement function for arrays function array_complement($a, $b) { $a = array_unique($a); $b = array_unique($b); $c = array(); foreach($a as $t) { if(!in_array($t, $b)) $c[] = $t; } } } $advancedexcerpt = new AdvancedExcerpt(); function the_advanced_excerpt($args = '') { global $advancedexcerpt; $defaults = array( 'length' => get_option($advancedexcerpt->name . '_length'), 'use_words' => get_option($advancedexcerpt->name . '_use_words'), 'no_custom' => get_option($advancedexcerpt->name . '_no_custom'), // URL encode, because URL decode is used on this setting later 'ellipsis' => urlencode(get_option($advancedexcerpt->name . '_ellipsis')), 'allow_tags' => implode(',', get_option($advancedexcerpt->name . '_allowed_tags')), 'exclude_tags' => ''); $r = wp_parse_args($args, $defaults); extract($r, EXTR_SKIP); $allow_tags = preg_split('/[\s,]+/', $allow_tags); $exclude_tags = preg_split('/[\s,]+/', $exclude_tags); $ellipsis = urldecode($ellipsis); // {allow_tags} - {exclude_tags} $allow_tags = $advancedexcerpt->array_complement($allow_tags, $exclude_tags); // All filters are applied, however, the advanced excerpt now behaves like a priorite 1 filter, instead of the default priority 10 $text = $advancedexcerpt->filter('', $length, $use_words, $ellipsis, $allow_tags, $no_custom, true); $text = apply_filters('get_the_excerpt', $text); echo "hello"; echo apply_filters('the_excerpt', $text); } endif; Quote Link to comment https://forums.phpfreaks.com/topic/162841-sweet-php-pros-to-the-rescue-easy-code-placement-question/ Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.