Created
April 24, 2018 01:20
-
-
Save stegel/b4eaac0192e673d257e90ef05d32adf4 to your computer and use it in GitHub Desktop.
FacetWP Time Since as Dropdown
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: ASD FacetWP - ASD Time Since | |
Description: "ASD Time Since" facet | |
Version: 1.0 | |
Based on: 1.4.2 | |
Author: AJ Siegel | |
Original Author URI: https://facetwp.com/ | |
Original GitHub URI: facetwp/facetwp-time-since | |
*/ | |
defined( 'ABSPATH' ) or exit; | |
/** | |
* ASD_FacetWP registration hook | |
*/ | |
add_filter( 'facetwp_facet_types', function( $facet_types ) { | |
$facet_types['asd_time_since'] = new ASD_FacetWP_Facet_Time_Since(); | |
return $facet_types; | |
} ); | |
/** | |
* ASD Time Since facet class | |
*/ | |
class ASD_FacetWP_Facet_Time_Since | |
{ | |
function __construct() { | |
$this->label = __( 'ASD Time Since', 'fwp' ); | |
} | |
/** | |
* Parse the multi-line options string | |
*/ | |
function parse_choices( $choices ) { | |
$choices = explode( "\n", $choices ); | |
foreach ( $choices as $key => $choice ) { | |
$temp = array_map( 'trim', explode( '|', $choice ) ); | |
$choices[ $key ] = array( | |
'label' => $temp[0], | |
'format' => $temp[1], | |
'seconds' => strtotime( $temp[1] ), | |
'counter' => 0, | |
); | |
} | |
return $choices; | |
} | |
/** | |
* Is the format in the future? | |
*/ | |
function is_future( $format ) { | |
if ( '+' == substr( $format, 0, 1 ) ) { | |
return true; | |
} | |
elseif ( 'next' == substr( $format, 0, 4 ) ) { | |
return true; | |
} | |
return false; | |
} | |
/** | |
* Load the available choices | |
*/ | |
function load_values( $params ) { | |
global $wpdb; | |
$output = array(); | |
$facet = $params['facet']; | |
$where_clause = $params['where_clause']; | |
$sql = " | |
SELECT f.facet_display_value | |
FROM {$wpdb->prefix}facetwp_index f | |
WHERE f.facet_name = '{$facet['name']}' $where_clause"; | |
$results = $wpdb->get_col( $sql ); | |
// Parse facet choices | |
$choices = $this->parse_choices( $facet['choices'] ); | |
// Loop through the results | |
foreach ( $results as $val ) { | |
$post_time = (int) strtotime( $val ); | |
foreach ( $choices as $key => $choice ) { | |
$choice_time = $choice['seconds']; | |
// next week, etc. | |
if ( $this->is_future( $choice['format'] ) ) { | |
if ( $post_time <= $choice_time && $post_time > time() ) { | |
$choices[ $key ]['counter']++; | |
} | |
} | |
// last week, etc. | |
else { | |
if ( $post_time >= $choice_time && $post_time < time() ) { | |
$choices[ $key ]['counter']++; | |
} | |
} | |
} | |
} | |
// Return an associative array | |
foreach ( $choices as $choice ) { | |
if ( 0 < $choice['counter'] ) { | |
$output[] = array( | |
'facet_display_value' => $choice['label'], | |
'counter' => $choice['counter'], | |
); | |
} | |
} | |
return $output; | |
} | |
/** | |
* Generate the facet HTML | |
*/ | |
function render( $params ) { | |
$output = ''; | |
$facet = $params['facet']; | |
$values = (array) $params['values']; | |
$selected_values = (array) $params['selected_values']; | |
$label_any = empty( $facet['label_any'] ) ? __( 'Any', 'fwp' ) : $facet['label_any']; | |
$label_any = facetwp_i18n( $label_any ); | |
$output .= '<select class="facetwp-dropdown facetwp-type-time_since">'; | |
$output .= '<option value="">' . esc_attr( $label_any ) . '</option>'; | |
foreach ( $values as $row ) { | |
$selected = in_array( $row['facet_value'], $selected_values ) ? ' selected' : ''; | |
$display_value = ''; | |
// Determine whether to show counts | |
$display_value .= esc_attr( $row['facet_display_value'] ); | |
$safe_value = FWP()->helper->safe_value( $display_value ); | |
$show_counts = apply_filters( 'facetwp_facet_dropdown_show_counts', true, array( 'facet' => $facet ) ); | |
if ( $show_counts ) { | |
$display_value .= ' (' . $result['counter'] . ')'; | |
} | |
$output .= '<option value="' . esc_attr( $safe_value ) . '"' . $selected . '>' . $display_value . '</option>'; | |
} | |
$output .= "</select>"; | |
return $output; | |
} | |
/** | |
* Filter the query based on selected values | |
*/ | |
/** | |
* Filter the query based on selected values | |
*/ | |
function filter_posts( $params ) { | |
global $wpdb; | |
$facet = $params['facet']; | |
$selected_values = $params['selected_values']; | |
$selected_values = is_array( $selected_values ) ? $selected_values[0] : $selected_values; | |
$sql = " | |
SELECT DISTINCT post_id FROM {$wpdb->prefix}facetwp_index | |
WHERE facet_name = '{$facet['name']}' AND facet_value IN ('$selected_values')"; | |
return facetwp_sql( $sql, $facet ); | |
} | |
/** | |
* Output any admin scripts | |
*/ | |
function admin_scripts() { | |
?> | |
<script> | |
(function($) { | |
wp.hooks.addAction('facetwp/load/asd_time_since', function($this, obj) { | |
$this.find('.facet-source').val(obj.source); | |
$this.find('.facet-label-any').val(obj.label_any); | |
$this.find('.facet-parent-term').val(obj.parent_term); | |
$this.find('.facet-orderby').val(obj.orderby); | |
$this.find('.facet-hierarchical').val(obj.hierarchical); | |
$this.find('.facet-count').val(obj.count); | |
}); | |
wp.hooks.addFilter('facetwp/save/asd_time_since', function(obj, $this) { | |
obj['source'] = $this.find('.facet-source').val(); | |
obj['label_any'] = $this.find('.facet-label-any').val(); | |
obj['parent_term'] = $this.find('.facet-parent-term').val(); | |
obj['orderby'] = $this.find('.facet-orderby').val(); | |
obj['hierarchical'] = $this.find('.facet-hierarchical').val(); | |
obj['count'] = $this.find('.facet-count').val(); | |
return obj; | |
}); | |
})(jQuery); | |
</script> | |
<?php | |
} | |
/** | |
* Output any front-end scripts | |
*/ | |
function front_scripts() { | |
?> | |
<script> | |
(function($) { | |
wp.hooks.addAction('facetwp/refresh/asd_time_since', function($this, facet_name) { | |
console.log("refresh"); | |
}); | |
wp.hooks.addFilter('facetwp/selections/asd_time_since', function(output, params) { | |
console.log("selections"); | |
var selected_values = []; | |
params.el.find('.facetwp-type-time_since option:selected').each(function(i) { | |
var value = $(this).attr('value'); | |
console.log(value); | |
if (value.length) { | |
selected_values.push({ value: value, label: $(this).text() }); | |
} | |
}); | |
return selected_values; | |
}); | |
$(document).on('change', '.facetwp-dropdown.facetwp-type-time_since', function() { | |
var $this = $(this); | |
console.log("autoload"); | |
FWP.autoload(); | |
}); | |
})(jQuery); | |
</script> | |
<?php | |
} | |
/** | |
* Output admin settings HTML | |
*/ | |
function settings_html() { | |
?> | |
<tr> | |
<td> | |
<?php _e( 'Default label', 'fwp' ); ?>: | |
<div class="facetwp-tooltip"> | |
<span class="icon-question">?</span> | |
<div class="facetwp-tooltip-content"> | |
Customize the first option label (default: "Any") | |
</div> | |
</div> | |
</td> | |
<td> | |
<input type="text" class="facet-label-any" value="<?php _e( 'Any', 'fwp' ); ?>" /> | |
</td> | |
</tr> | |
<tr> | |
<td> | |
<?php _e('Choices', 'fwp'); ?>: | |
<div class="facetwp-tooltip"> | |
<span class="icon-question">?</span> | |
<div class="facetwp-tooltip-content"><?php _e( 'Enter the available choices (one per line)', 'fwp' ); ?></div> | |
</div> | |
</td> | |
<td><textarea class="facet-choices"></textarea></td> | |
</tr> | |
<?php | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment