HEX
Server:
System: Linux aac286ea486c 5.14.0-687.15.1.el9_8.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Jun 11 08:51:45 EDT 2026 x86_64
User: root (0)
PHP: 8.2.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,disk_free_space,diskfreespace
Upload Files
File: /dom877180/wp-content/plugins/gravityview/includes/fields/class-gravityview-field-other-entries.php
<?php
/**
 * @file class-gravityview-field-other-entries.php
 * @package GravityView
 * @subpackage includes\fields
 * @since 1.7.2
 */

/**
 * A field that displays other entries by the entry_creator for the same View in a list format
 *
 * @since 1.7.2
 */
class GravityView_Field_Other_Entries extends GravityView_Field {

	var $name = 'other_entries';

	var $is_searchable = false;

	var $contexts = array( 'multiple', 'single' );

	var $group = 'gravityview';

	var $icon = 'dashicons-admin-page';

	private $context;

	public function __construct() {
		$this->label = esc_html__( 'Other Entries', 'gk-gravityview' );
		$this->description = esc_html__('Display other entries created by the entry creator.', 'gk-gravityview');
		parent::__construct();
	}

	/**
	 * @inheritDoc
	 * @since 1.7.2
	 */
	public function field_options( $field_options, $template_id, $field_id, $context, $input_type, $form_id ) {

		if( 'edit' === $context ) {
			return $field_options;
		}

		// No "Link to single entry"; all the items will be links to entries!
		unset( $field_options['show_as_link'] );

		$new_options = array();

		$new_options['link_format'] = array(
			'type'  => 'text',
			'label' => __( 'Entry link text (required)', 'gk-gravityview' ),
			'value' => __('Entry #{entry_id}', 'gk-gravityview'),
			'merge_tags' => 'force',
			'group' => 'field',
		);

		$new_options['after_link'] = array(
			'type'  => 'textarea',
			'label' => __( 'Text or HTML to display after the link (optional)', 'gk-gravityview' ),
			'desc'  => __('This content will be displayed below each entry link.', 'gk-gravityview'),
			'value' => '',
			'merge_tags' => 'force',
			'class' => 'widefat code',
			'group' => 'field',
		);

		$new_options['page_size'] = array(
			'type'  => 'number',
			'label' => __( 'Entries to Display', 'gk-gravityview' ),
			'desc'  => __( 'What is the maximum number of entries that should be shown?', 'gk-gravityview' ) . ' ' . sprintf( _x( 'Set to %s for no maximum.', '%s replaced with a formatted 0', 'gk-gravityview' ), '<code>0</code>' ),
			'value' => '10',
			'merge_tags' => false,
			'min'   => 0,
			'group' => 'field',
		);

		$new_options['no_entries_hide'] = array(
			'type'  => 'checkbox',
			'label' => __( 'Hide if no entries', 'gk-gravityview' ),
			'desc'  => __( 'Don\'t display this field if the entry creator has no other entries', 'gk-gravityview' ),
			'value' => false,
			'group' => 'visibility',
		);

		$new_options['no_entries_text'] = array(
			'type'  => 'text',
			'label' => __( 'No Entries Text', 'gk-gravityview' ),
			'desc'  => __( 'The text that is shown if the entry creator has no other entries (and "Hide if no entries" is disabled).', 'gk-gravityview' ),
			'value' => __( 'This user has no other entries.', 'gk-gravityview' ),
			'class' => 'widefat',
			'requires' => 'no_entries_hide',
			'group' => 'visibility',
		);

		return $new_options + $field_options;
	}

	/**
	 * Retrieve the other entries based on the current View and entry.
	 *
	 * @param \GV\Template_Context $context The context that contains the View and the Entry.
	 *
	 * @return \GV\Entry[] The entries.
	 */
	public function get_entries( $context ) {
		add_action( 'gravityview/view/query', array( $this, 'gf_query_filter' ), 10, 3 );
		add_filter( 'gravityview_fe_search_criteria', array( $this, 'filter_entries' ), 10, 3 );

		// Exclude widiget modifiers altogether
		global $wp_filter;
		$filters = array(
			'gravityview_fe_search_criteria',
			'gravityview_search_criteria',
			'gravityview/view/query',
		);
		$removed = $remove = array();
		foreach ( $filters as $filter ) {
			foreach ( $wp_filter[ $filter ] as $priority => $callbacks ) {
				foreach ( $callbacks as $id => $callback ) {
					if ( ! is_array( $callback['function'] ) ) {
						continue;
					}
					if ( $callback['function'][0] instanceof \GV\Widget ) {
						$remove[] = array( $filter, $priority, $id );
					}
				}
			}
		}

		foreach ( $remove as $r ) {
			list( $filter, $priority, $id ) = $r;
			$removed[] = array( $filter, $priority, $id, $wp_filter[ $filter ]->callbacks[ $priority ][ $id ] );
			unset( $wp_filter[ $filter ]->callbacks[ $priority ][ $id ] );
		}

		$this->context = $context;

		$entries = $context->view->get_entries()->all();

		foreach ( $removed as $r ) {
			list( $filter, $priority, $id, $function ) = $r;
			$wp_filter[ $filter ]->callbacks[ $priority ][ $id ] = $function;
		}

		remove_action( 'gravityview/view/query', array( $this, 'gf_query_filter' ) );
		remove_filter( 'gravityview_fe_search_criteria', array( $this, 'filter_entries' ) );

		$this->context = null;

		return $entries;
	}

	public function filter_entries( $search_criteria, $form_id = null, $args = array(), $force_search_criteria = false ) {
		$context = $this->context;

		$created_by = $context->entry['created_by'];

		/** Filter entries by approved and created_by. */
		$search_criteria['field_filters'][] = array(
			'key' => 'created_by',
			'value' => $created_by,
			'operator' => 'is'
		);

		/**
		 * @filter `gravityview/field/other_entries/criteria` Modify the search parameters before the entries are fetched.
		 *
		 * @since 1.11
		 *
		 * @param array $criteria Gravity Forms search criteria array, as used by GVCommon::get_entries()
		 * @param array $view_settings Associative array of settings with plugin defaults used if not set by the View
		 * @param int $form_id The Gravity Forms ID
		 * @since 2.0
		 * @param \GV\Template_Context $gravityview The context
		 */
		$criteria = apply_filters( 'gravityview/field/other_entries/criteria', $search_criteria, $context->view->settings->as_atts(), $context->view->form->ID, $context );

		/** Force mode all and filter out our own entry. */
		$search_criteria['field_filters']['mode'] = 'all';
		$search_criteria['field_filters'][] = array(
			'key' => 'id',
			'value' => $context->entry->ID,
			'operator' => 'isnot'
		);

		$search_criteria['paging']['page_size'] = $context->field->page_size ? : 10;

		return $search_criteria;
	}

	public function gf_query_filter( &$query, $view, $request ) {
		// @todo One day, we can implement in GF_Query as well...
		// this would allow us to keep on using nested conditionals and not force 'all'
	}
}

new GravityView_Field_Other_Entries;