<?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName /** * View All Posts Pages * * Plugin Name: View All Posts Pages * Plugin URI: http://www.oomphinc.com/plugins-modules/view-all-posts-pages/ * Description: Provides a "view all" (single page) option for posts, pages, and custom post types paged using WordPress' <a href="http://codex.wordpress.org/Write_Post_SubPanel#Quicktags" target="_blank"><code><!--nextpage--></code> Quicktag</a> (multipage posts). * Author: Erick Hitter & Oomph, Inc. * Author URI: http://www.oomphinc.com/ * Text Domain: view_all_posts_pages * Domain Path: /languages * Version: 0.9.2 * * @package View_All_Posts_Pages * * 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 2 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /** * Class view_all_posts_pages */ class view_all_posts_pages { // phpcs:ignore PEAR.NamingConventions.ValidClassName, Generic.Classes.OpeningBraceSameLine.ContentAfterBrace /** * Singleton * * @var self */ private static $__instance = null; /** * Class variables * * @var string */ private $query_var = 'view-all'; /** * Namespace. * * @var string */ private $ns = 'view_all_posts_pages'; /** * Option name. * * @var string */ private $settings_key = 'vapp'; /** * Default settings * * @var array|null */ private $settings_defaults = null; /** * Option indicating admin notice was dismissed. * * @var string */ private $notice_key = 'vapp_admin_notice_dismissed'; /** * Silence is golden */ private function __construct() {} /** * Implement singleton * * @uses self::setup * @return self */ public static function get_instance() { if ( ! is_a( self::$__instance, __CLASS__ ) ) { self::$__instance = new self(); self::$__instance->setup(); } return self::$__instance; } /** * Register actions and filters. * * @uses register_deactivation_hook * @uses add_action */ private function setup() { register_deactivation_hook( __FILE__, array( $this, 'deactivation_hook' ) ); add_action( 'admin_init', array( $this, 'action_admin_init' ) ); add_action( 'admin_menu', array( $this, 'action_admin_menu' ) ); add_action( 'init', array( $this, 'action_init' ), 20 ); add_action( 'redirect_canonical', array( $this, 'filter_redirect_canonical' ) ); add_action( 'the_post', array( $this, 'action_the_post' ), 5 ); } /** * Clean up after plugin deactivation. * * @uses flush_rewrite_rules * @uses delete_option * @action register_deactivation_hook */ public function deactivation_hook() { flush_rewrite_rules(); // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.flush_rewrite_rules_flush_rewrite_rules, WordPressVIPMinimum.VIP.RestrictedFunctions.rewrite_rules_flush_rewrite_rules delete_option( $this->settings_key ); delete_option( $this->notice_key ); } /** * Register plugin option and disable rewrite rule flush warning. * * @uses register_setting * @uses apply_filters * @uses update_option * @action admin_init */ public function action_admin_init() { register_setting( $this->settings_key, $this->settings_key, array( $this, 'admin_options_validate' ) ); if ( isset( $_GET[ $this->notice_key ], $_GET[ $this->notice_key . '_nonce' ] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET[ $this->notice_key . '_nonce' ] ) ), $this->notice_key ) && apply_filters( 'vapp_display_rewrite_rules_notice', true ) ) { update_option( $this->notice_key, 1 ); } } /** * Determine if full post view is being requested. * * @global $wp_query * @uses is_404 * @return bool */ public function is_view_all() { global $wp_query; return is_array( $wp_query->query ) && array_key_exists( $this->query_var, $wp_query->query ) && ! is_404(); } /** * Add rewrite endpoint, which sets query var and rewrite rules. * * @global $wp_rewrite * @uses __ * @uses this::get_options * @uses add_filter * @uses apply_filters * @uses get_option * @uses add_action * @uses add_rewrite_endpoint * @action init */ public function action_init() { // Populate default settings, with translation support. $this->settings_defaults = array( 'wlp' => true, 'wlp_text' => __( 'View All', 'view_all_posts_pages' ), 'wlp_class' => 'vapp', 'wlp_post_types' => array( 'post', ), 'link' => false, 'link_position' => 'below', 'link_text' => __( 'View All', 'view_all_posts_pages' ), 'link_class' => 'vapp', 'link_post_types' => array( 'post', ), 'link_priority' => 10, ); // Register additional plugin actions if settings call for them. $options = $this->get_options(); if ( array_key_exists( 'wlp', $options ) && true === $options['wlp'] ) { add_filter( 'wp_link_pages_args', array( $this, 'filter_wp_link_pages_args_early' ), 0 ); } if ( $options['link'] ) { add_filter( 'the_content', array( $this, 'filter_the_content_auto' ), $options['link_priority'] ); } if ( apply_filters( 'vapp_display_rewrite_rules_notice', true ) && ! get_option( $this->notice_key ) ) { add_action( 'admin_notices', array( $this, 'action_admin_notices_activation' ) ); } // Register rewrite endpoint, which handles most of our rewrite needs. add_rewrite_endpoint( $this->query_var, EP_ALL ); // Extra rules needed if verbose page rules are requested. global $wp_rewrite; if ( $wp_rewrite->use_verbose_page_rules ) { // Build regex. $regex = substr( str_replace( $wp_rewrite->rewritecode, $wp_rewrite->rewritereplace, $wp_rewrite->permalink_structure ), 1 ); $regex = trailingslashit( $regex ); $regex .= $this->query_var . '/?$'; // Build corresponding query string. $query = substr( str_replace( $wp_rewrite->rewritecode, $wp_rewrite->queryreplace, $wp_rewrite->permalink_structure ), 1 ); $query = explode( '/', $query ); $query = array_filter( $query ); $i = 1; foreach ( $query as $key => $qv ) { $query[ $key ] .= '$matches[' . $i . ']'; $i++; } $query[] = $this->query_var . '=1'; $query = implode( '&', $query ); // Add rule. add_rewrite_rule( $regex, $wp_rewrite->index . '?' . $query, 'top' ); } } /** * Prevent canonical redirect if full-post page is requested. * * @param string $url Canonical URL. * @uses this::is_view_all * @filter redirect_canonical * @return string|false */ public function filter_redirect_canonical( $url ) { if ( $this->is_view_all() ) { $url = false; } return $url; } /** * Modify post variables to display entire post on one page. * * @global $pages, $more * @param WP_Post $post Post object. * @uses this::is_view_all * @action the_post */ public function action_the_post( $post ) { if ( $this->is_view_all() ) { global $pages, $more, $multipage; $post->post_content = str_replace( "\n<!--nextpage-->\n", "\n\n", $post->post_content ); $post->post_content = str_replace( "\n<!--nextpage-->", "\n", $post->post_content ); $post->post_content = str_replace( "<!--nextpage-->\n", "\n", $post->post_content ); $post->post_content = str_replace( '<!--nextpage-->', ' ', $post->post_content ); $pages = array( $post->post_content ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited $more = 1; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited $multipage = 0; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited } } /** * Add wp_link_pages arguments filter if automatic inclusion is chosen for a given post type. * Automatic inclusion can be disabled by passing false through the vapp_display_link filter. * * @global $post * @param array $args wp_link_pages arguments. * @uses this::get_options * @uses apply_filters * @uses add_filter * @filter wp_link_pages * @return array */ public function filter_wp_link_pages_args_early( $args ) { global $post; $options = $this->get_options(); if ( in_array( $post->post_type, $options['wlp_post_types'], true ) && apply_filters( 'vapp_display_link', true, (int) $post->ID, $options, $post ) ) { add_filter( 'wp_link_pages_args', array( $this, 'filter_wp_link_pages_args' ), 999 ); } return $args; } /** * Filter wp_link_pages arguments to append "View all" link to output. * * @global $more * @param array $args wp_link_pages arguments. * @uses this::get_options * @uses this::is_view_all * @uses esc_attr * @uses esc_url * @return array */ public function filter_wp_link_pages_args( $args ) { $options = $this->get_options(); if ( is_array( $options ) ) { extract( $options, EXTR_OVERWRITE ); // Set global $more to false so that wp_link_pages outputs links for all pages when viewing full post page. if ( $this->is_view_all() ) { $GLOBALS['more'] = false; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited } // Process link text, respecting pagelink parameter. $link_text = str_replace( '%', $wlp_text, $args['pagelink'] ); // View all. $link = ' ' . $args['link_before']; if ( $this->is_view_all() ) { $link .= '<span class="' . esc_attr( $wlp_class ) . '">' . $link_text . '</span><!-- .' . esc_attr( $wlp_class ) . ' -->'; } else { $link .= '<a class="' . esc_attr( $wlp_class ) . '" href="' . esc_url( $this->url() ) . '">' . $link_text . '</a><!-- .' . esc_attr( $wlp_class ) . ' -->'; } $link .= $args['link_after'] . ' '; $args['after'] = $link . $args['after']; } return $args; } /** * Filter the content if automatic link inclusion is selected. * * @global $post * @param string $content Post content. * @uses this::get_options * @uses this::is_view_all * @uses esc_attr * @uses esc_url * @uses this::url * @filter the_content * @return string */ public function filter_the_content_auto( $content ) { $options = $this->get_options(); global $post; if ( ! $this->is_view_all() && is_array( $options ) && array_key_exists( 'link', $options ) && true === $options['link'] && in_array( $post->post_type, $options['link_post_types'] ) ) { extract( $options, EXTR_OVERWRITE ); $link = '<p class="vapp_wrapper"><a class="' . esc_attr( $link_class ) . '" href="' . esc_url( $this->url() ) . '">' . esc_html( $link_text ) . '</a></p><!-- .vapp_wrapper -->'; if ( 'above' === $link_position ) { $content = $link . $content; } elseif ( 'below' === $link_position ) { $content = $content . $link; } elseif ( 'both' === $link_position ) { $content = $link . $content . $link; } } return $content; } /** * Generate URL * * @global $post * @global $wp_rewrite * @param int|false $post_id Post ID. * @uses is_singular * @uses in_the_loop * @uses get_permalink * @uses is_home * @uses is_front_page * @uses home_url * @uses is_category * @uses get_category_link * @uses get_query_var * @uses is_tag * @uses get_tag_link * @uses is_tax * @uses get_queried_object * @uses get_term_link * @uses path_join * @uses trailingslashit * @uses add_query_arg * @return string or bool */ public function url( $post_id = false ) { $link = false; // Get link base specific to page type being viewed. if ( is_singular() || in_the_loop() ) { $post_id = intval( $post_id ); if ( ! $post_id ) { global $post; $post_id = $post->ID; } if ( ! $post_id ) { return false; } $link = get_permalink( $post_id ); } elseif ( is_home() || is_front_page() ) { $link = home_url( '/' ); } elseif ( is_category() ) { $link = get_category_link( get_query_var( 'cat' ) ); } elseif ( is_tag() ) { $link = get_tag_link( get_query_var( 'tag_id' ) ); } elseif ( is_tax() ) { $queried_object = get_queried_object(); if ( is_object( $queried_object ) && property_exists( $queried_object, 'taxonomy' ) && property_exists( $queried_object, 'term_id' ) ) { $link = get_term_link( (int) $queried_object->term_id, $queried_object->taxonomy ); } } // If link base is set, build link. if ( false !== $link ) { global $wp_rewrite; if ( $wp_rewrite->using_permalinks() ) { $link = path_join( $link, $this->query_var ); if ( $wp_rewrite->use_trailing_slashes ) { $link = trailingslashit( $link ); } } else { $link = add_query_arg( $this->query_var, 1, $link ); } } return $link; } /** * Add menu item for options page * * @uses __ * @uses add_options_page * @action admin_menu */ public function action_admin_menu() { /* translators: 1: Plugin name. */ add_options_page( sprintf( __( '%s Options', 'view_all_posts_pages' ), "View All Post's Pages" ), "View All Post's Pages", 'manage_options', $this->ns, array( $this, 'admin_options' ) ); } /** * Render options page * * @uses settings_fields * @uses this::get_options * @uses this::post_types_array * @uses __ * @uses _e * @uses checked * @uses esc_attr * @uses submit_button */ public function admin_options() { ?> <div class="wrap"> <h2>View All Post's Pages</h2> <form action="options.php" method="post"> <?php settings_fields( $this->settings_key ); $options = $this->get_options(); $post_types = $this->post_types_array(); ?> <h3> <?php /* translators: 1: WordPress function name. */ printf( wp_kses_post( __( '%s Options', 'view_all_posts_pages' ) ), '<em>wp_link_pages</em>' ); ?> </h3> <p class="description"><?php esc_html_e( 'A "view all" link can be appended to WordPress\' standard page navigation using the options below.', 'view_all_posts_pages' ); ?></p> <table class="form-table"> <tr> <th scope="row"><?php esc_html_e( 'Automatically append link to post\'s page navigation?', 'view_all_posts_pages' ); ?></th> <td> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[wlp]" id="wlp-true" value="1"<?php checked( $options['wlp'], true, true ); ?> /> <label for="wlp-true"><?php esc_html_e( 'Yes', 'view_all_posts_pages' ); ?></label><br /> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[wlp]" id="wlp-false" value="0"<?php checked( $options['wlp'], false, true ); ?> /> <label for="wlp-false"><?php esc_html_e( 'No', 'view_all_posts_pages' ); ?></label> </td> </tr> <tr> <th scope="row"><label for="wlp_text"><?php esc_html_e( 'Link text:', 'view_all_posts_pages' ); ?></label></th> <td> <input type="text" name="<?php echo esc_attr( $this->settings_key ); ?>[wlp_text]" id="wlp_text" value="<?php echo esc_attr( $options['wlp_text'] ); ?>" class="regular-text" /> </td> </tr> <tr> <th scope="row"><label for="wlp_class"><?php esc_html_e( 'Link\'s CSS class(es):', 'view_all_posts_pages' ); ?></label></th> <td> <input type="text" name="<?php echo esc_attr( $this->settings_key ); ?>[wlp_class]" id="wlp_class" value="<?php echo esc_attr( $options['wlp_class'] ); ?>" class="regular-text" /> <p class="description"><?php esc_html_e( 'Be aware that Internet Explorer will only interpret the first two CSS classes.', 'view_all_posts_pages' ); ?></p> </td> </tr> <tr> <th scope="row"><?php esc_html_e( 'Display automatically on:', 'view_all_posts_pages' ); ?></th> <td> <?php foreach ( $post_types as $post_type ) : ?> <input type="checkbox" name="<?php echo esc_attr( $this->settings_key ); ?>[wlp_post_types][]" id="wlp-pt-<?php echo esc_attr( $post_type->name ); ?>" value="<?php echo esc_attr( $post_type->name ); ?>" <?php if ( in_array( $post_type->name, $options['wlp_post_types'], true ) ) { echo ' checked="checked"'; } ?> /> <label for="wlp-pt-<?php echo esc_attr( $post_type->name ); ?>"><?php echo esc_html( $post_type->labels->name ); ?></label><br /> <?php endforeach; ?> </td> </tr> </table> <h3><?php esc_html_e( 'Standalone Link Options', 'view_all_posts_pages' ); ?></h3> <p class="description"><?php esc_html_e( 'In addition to appending the "view all" link to WordPress\' standard navigation, link(s) can be added above and below post content.', 'view_all_posts_pages' ); ?></p> <table class="form-table"> <tr> <th scope="row"><?php esc_html_e( 'Automatically add links based on settings below?', 'view_all_posts_pages' ); ?></th> <td> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[link]" id="link-true" value="1"<?php checked( $options['link'], true, true ); ?> /> <label for="link-true"><?php esc_html_e( 'Yes', 'view_all_posts_pages' ); ?></label><br /> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[link]" id="link-false" value="0"<?php checked( $options['link'], false, true ); ?> /> <label for="link-false"><?php esc_html_e( 'No', 'view_all_posts_pages' ); ?></label> </td> </tr> <tr> <th scope="row"><?php esc_html_e( 'Automatically place link:', 'view_all_posts_pages' ); ?></th> <td> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[link_position]" id="link_position-above" value="above"<?php checked( $options['link_position'], 'above', true ); ?> /> <label for="link_position-above"><?php esc_html_e( 'Above content', 'view_all_posts_pages' ); ?></label><br /> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[link_position]" id="link_position-below" value="below"<?php checked( $options['link_position'], 'below', true ); ?> /> <label for="link_position-below"><?php esc_html_e( 'Below content', 'view_all_posts_pages' ); ?></label><br /> <input type="radio" name="<?php echo esc_attr( $this->settings_key ); ?>[link_position]" id="link_position-both" value="both"<?php checked( $options['link_position'], 'both', true ); ?> /> <label for="link_position-both"><?php esc_html_e( 'Above and below content', 'view_all_posts_pages' ); ?></label> </td> </tr> <tr> <th scope="row"><?php esc_html_e( 'Display automatically on:', 'view_all_posts_pages' ); ?></th> <td> <?php foreach ( $post_types as $post_type ) : ?> <input type="checkbox" name="<?php echo esc_attr( $this->settings_key ); ?>[link_post_types][]" id="link-pt-<?php echo esc_attr( $post_type->name ); ?>" value="<?php echo esc_attr( $post_type->name ); ?>" <?php if ( in_array( $post_type->name, $options['link_post_types'], true ) ) { echo ' checked="checked"'; } ?> /> <label for="link-pt-<?php echo esc_attr( $post_type->name ); ?>"><?php echo esc_html( $post_type->labels->name ); ?></label><br /> <?php endforeach; ?> </td> </tr> <tr> <th scope="row"><label for="link_text"><?php esc_html_e( 'Link text:', 'view_all_posts_pages' ); ?></label></th> <td> <input type="text" name="<?php echo esc_attr( $this->settings_key ); ?>[link_text]" id="link_text" value="<?php echo esc_attr( $options['link_text'] ); ?>" class="regular-text" /> </td> </tr> <tr> <th scope="row"><label for="link_class"><?php esc_html_e( 'Link\'s CSS class(es):', 'view_all_posts_pages' ); ?></label></th> <td> <input type="text" name="<?php echo esc_attr( $this->settings_key ); ?>[link_class]" id="link_class" value="<?php echo esc_attr( $options['link_class'] ); ?>" class="regular-text" /> <p class="description"><?php esc_html_e( 'Be aware that Internet Explorer will only interpret the first two CSS classes.', 'view_all_posts_pages' ); ?></p> </td> </tr> <tr> <th scope="row"><label for="link_priority"><?php esc_html_e( 'Link\'s priority:', 'view_all_posts_pages' ); ?></label></th> <td> <input type="text" name="<?php echo esc_attr( $this->settings_key ); ?>[link_priority]" id="link_priority" class="small-text code" value="<?php echo esc_attr( $options['link_priority'] ); ?>" /> <p class="description"><?php esc_html_e( 'Priority determines when the link is added to a post\'s content. You can use the above setting to modulate the link\'s placement.', 'view_all_posts_pages' ); ?></p> <p class="description"><?php echo wp_kses_post( __( 'The default value is <strong>10</strong>. Lower values mean the link will be added earlier, while higher values will add the link later.', 'view_all_posts_pages' ) ); ?></p> </td> </tr> </table> <?php submit_button(); ?> </form> </div><!-- .wrap --> <?php } /** * Validate options * * @param array $options Plugin options. * @uses this::get_options * @uses this::post_types_array * @uses sanitize_text_field * @uses absint * @return array */ public function admin_options_validate( $options ) { $new_options = array(); if ( is_array( $options ) ) { foreach ( $options as $key => $value ) { switch ( $key ) { case 'wlp': case 'link': $new_options[ $key ] = (bool) $value; break; case 'link_position': $placements = array( 'above', 'below', 'both', ); $new_options[ $key ] = in_array( $value, $placements, true ) ? $value : 'below'; break; case 'wlp_post_types': case 'link_post_types': $post_types = $this->post_types_array(); $new_options[ $key ] = array(); if ( is_array( $value ) && is_array( $post_types ) ) { foreach ( $post_types as $post_type ) { if ( in_array( $post_type->name, $value, true ) ) { $new_options[ $key ][] = $post_type->name; } } } break; case 'wlp_text': case 'wlp_class': case 'link_text': case 'link_class': $value = sanitize_text_field( $value ); if ( ( 'wlp_text' === $key || 'link_text' === $key ) && empty( $value ) ) { $value = 'View all'; } $new_options[ $key ] = $value; break; case 'link_priority': $value = absint( $value ); $new_options[ $key ] = $value; break; default: break; } } } return $new_options; } /** * Return plugin options array parsed with default options * * @uses get_option * @uses wp_parse_args * @return array */ private function get_options() { $options = get_option( $this->settings_key, $this->settings_defaults ); if ( ! is_array( $options ) ) { $options = array(); } if ( ! array_key_exists( 'wlp_post_types', $options ) ) { $options['wlp_post_types'] = array(); } if ( ! array_key_exists( 'link_post_types', $options ) ) { $options['link_post_types'] = array(); } return wp_parse_args( $options, $this->settings_defaults ); } /** * Build array of available post types, excluding all built-in ones except 'post' and 'page'. * * @uses get_post_types * @return array */ private function post_types_array() { $post_types = array(); foreach ( get_post_types( array(), 'objects' ) as $post_type ) { if ( false === $post_type->_builtin || 'post' === $post_type->name || 'page' === $post_type->name ) { $post_types[] = $post_type; } } return $post_types; } /** * Display admin notice regarding rewrite rules flush. * * @uses get_option * @uses apply_filters * @uses _e * @uses __ * @uses admin_url * @uses add_query_arg * @action admin_notices */ public function action_admin_notices_activation() { if ( ! get_option( $this->notice_key ) && apply_filters( 'vapp_display_rewrite_rules_notice', true ) ) : ?> <div id="wpf-rewrite-flush-warning" class="error fade"> <p><strong><?php esc_html_e( 'View All Post\'s Pages', 'view_all_posts_pages' ); ?></strong></p> <p> <?php /* translators: 1: Permalinks settings page URL. */ printf( wp_kses_post( __( 'You must refresh your site\'s permalinks before <em>View All Post\'s Pages</em> is fully activated. To do so, go to <a href="%s">Permalinks</a> and click the <strong><em>Save Changes</em></strong> button at the bottom of the screen.', 'view_all_posts_pages' ) ), esc_url( admin_url( 'options-permalink.php' ) ) ); ?> </p> <p> <?php $query_args = array( $this->notice_key => 1, $this->notice_key . '_nonce' => wp_create_nonce( $this->notice_key ), ); /* translators: 1: URL to dismiss admin notice. */ printf( wp_kses_post( __( 'When finished, click <a href="%s">here</a> to hide this message.', 'view_all_posts_pages' ) ), esc_url( admin_url( add_query_arg( $query_args, 'index.php' ) ) ) ); ?> </p> </div> <?php endif; } } view_all_posts_pages::get_instance(); /** * Alias global variable used to hold instantiated plugin prior to singleton's introduction in version 0.7. */ $GLOBALS['vapp'] = view_all_posts_pages::get_instance(); /** * Shortcut to public function for generating full post view URL * * @param int|false $post_id Post ID. * @uses view_all_posts_pages::get_instance * @return string or bool */ function vapp_get_url( $post_id = false ) { return view_all_posts_pages::get_instance()->url( intval( $post_id ) ); } /** * Output link to full post view. * * @global $post * @param string $link_text Link text. * @param string $class Link class. * @uses vapp_get_url * @uses esc_attr * @uses esc_url * @uses esc_html */ function vapp_the_link( $link_text = 'View All', $class = 'vapp' ) { global $post; $url = vapp_get_url( $post->ID ); if ( $url ) { $link = '<a ' . ( $class ? 'class="' . esc_attr( $class ) . '"' : '' ) . ' href="' . esc_url( $url ) . '">' . esc_html( $link_text ) . '</a>'; echo wp_kses_post( $link ); } } /** * Filter wp_link_pages args. * Function is a shortcut to class' filter. * * @param array $args wp_link_pages args. * @uses view_all_posts_pages::get_instance * @return array */ function vapp_filter_wp_link_pages_args( $args ) { return view_all_posts_pages::get_instance()->filter_wp_link_pages_args( $args ); } if ( ! function_exists( 'is_view_all' ) ) { /** * Conditional tag indicating if full post view was requested. * * @uses view_all_posts_pages::get_instance * @return bool */ function is_view_all() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound return view_all_posts_pages::get_instance()->is_view_all(); } }