esc_html__( 'Snippet', 'header-footer-code-manager' ),
'plural' => esc_html__( 'Snippets', 'header-footer-code-manager' ),
'ajax' => false,
)
);
}
/**
* Retrieve snippets data from the database
*
* @param int $per_page
* @param int $page_number
*
* @return mixed
*/
public static function get_snippets( $per_page = 20, $page_number = 1, $customvar = 'all' )
{
global $wpdb;
$table_name = "{$wpdb->prefix}hfcm_scripts";
$page_number = absint( $page_number );
$per_page = absint( $per_page );
$customvar = sanitize_text_field( $customvar );
$orderby = 'script_id';
$order = 'ASC';
if ( !empty( $_GET['orderby'] ) ) {
$orderby = sanitize_sql_orderby( $_GET['orderby'] );
if ( empty( $orderby ) || !in_array( $orderby, array( 'script_id', 'name', 'location' ) ) ) {
$orderby = 'script_id';
}
}
if ( !empty( $_GET['order'] ) ) {
$order = strtolower( sanitize_sql_orderby( $_GET['order'] ) );
if ( empty( $order ) || !in_array( $order, array( 'desc', 'asc' ) ) ) {
$order = 'ASC';
}
}
$sql = "SELECT * FROM `{$table_name}` WHERE 1";
$placeholder_args = array();
if ( in_array( $customvar, array( 'inactive', 'active' ) ) ) {
$sql .= " AND status = '%s'";
$placeholder_args[] = $customvar;
}
if ( !empty( $_POST['snippet_type'] ) ) {
if ( check_admin_referer( 'bulk-snippets' ) ) {
$snippet_type = addslashes( sanitize_text_field( $_POST['snippet_type'] ) );
if ( in_array( $snippet_type, array( 'html', 'css', 'js' ) ) ) {
$sql .= " AND snippet_type = %s";
$placeholder_args[] = $snippet_type;
}
}
}
if ( !empty( $_POST['s'] ) ) {
if ( check_admin_referer( 'bulk-snippets' ) ) {
$search_query = addslashes( sanitize_text_field( $_POST['s'] ) );
$sql .= " AND name LIKE %s";
$placeholder_args[] = '%' . $search_query . '%';
}
}
$sql .= ' ORDER BY %s %s LIMIT %d OFFSET %d';
$placeholder_args[] = $orderby;
$placeholder_args[] = $order;
$placeholder_args[] = $per_page;
$placeholder_args[] = ($page_number - 1) * $per_page;
if ( !empty( $placeholder_args ) ) {
$sql = $wpdb->prepare( $sql, $placeholder_args );
}
$result = $wpdb->get_results(
$sql, 'ARRAY_A'
);
return $result;
}
/**
* Delete a snipppet record.
*
* @param int $id snippet ID
*/
public static function delete_snippet( $id )
{
$id = (int) $id;
if ( empty( $id ) ) {
return;
}
global $wpdb;
$table_name = "{$wpdb->prefix}hfcm_scripts";
$wpdb->delete(
$table_name, array( 'script_id' => $id ), array( '%d' )
);
}
/**
* Activate a snipppet record.
*
* @param int $id snippet ID
*/
public static function activate_snippet( $id )
{
$id = (int) $id;
if ( empty( $id ) ) {
return;
}
global $wpdb;
$table_name = "{$wpdb->prefix}hfcm_scripts";
$wpdb->update(
$table_name, array(
'status' => 'active',
), array( 'script_id' => $id ), array( '%s' ), array( '%d' )
);
}
/**
* Deactivate a snipppet record.
*
* @param int $id snippet ID
*/
public static function deactivate_snippet( $id )
{
$id = (int) $id;
if ( empty( $id ) ) {
return;
}
global $wpdb;
$table_name = "{$wpdb->prefix}hfcm_scripts";
$wpdb->update(
$table_name, array(
'status' => 'inactive',
), array( 'script_id' => $id ), array( '%s' ), array( '%d' )
);
}
/**
* Returns the count of records in the database.
*
* @return null|string
*/
public static function record_count( $customvar = 'all' )
{
global $wpdb;
$table_name = "{$wpdb->prefix}hfcm_scripts";
$sql = "SELECT COUNT(*) FROM `{$table_name}`";
$placeholder_args = [];
$customvar = sanitize_text_field( $customvar );
if ( in_array( $customvar, array( 'inactive', 'active' ) ) ) {
$sql .= " WHERE status = %s";
$placeholder_args[] = $customvar;
}
if ( !empty( $placeholder_args ) ) {
$sql = $wpdb->prepare( $sql, $placeholder_args );
}
return $wpdb->get_var( $sql );
}
/**
* Text displayed when no snippet data is available
*/
public function no_items()
{
esc_html_e( 'No Snippets available.', 'header-footer-code-manager' );
}
/**
* Render a column when no column specific method exist.
*
* @param array $item
* @param string $column_name
*
* @return mixed
*/
public function column_default( $item, $column_name )
{
switch ( $column_name ) {
case 'name':
return esc_html( $item[ $column_name ] );
case 'display_on':
$nnr_hfcm_display_array = array(
'All' => esc_html__( 'Site Wide', 'header-footer-code-manager' ),
's_posts' => esc_html__( 'Specific Posts', 'header-footer-code-manager' ),
's_pages' => esc_html__( 'Specific Pages', 'header-footer-code-manager' ),
's_categories' => esc_html__( 'Specific Categories', 'header-footer-code-manager' ),
's_custom_posts' => esc_html__( 'Specific Custom Post Types', 'header-footer-code-manager' ),
's_tags' => esc_html__( 'Specific Tags', 'header-footer-code-manager' ),
's_is_home' => esc_html__( 'Home Page', 'header-footer-code-manager' ),
's_is_search' => esc_html__( 'Search Page', 'header-footer-code-manager' ),
's_is_archive' => esc_html__( 'Archive Page', 'header-footer-code-manager' ),
'latest_posts' => esc_html__( 'Latest Posts', 'header-footer-code-manager' ),
'manual' => esc_html__( 'Shortcode Only', 'header-footer-code-manager' ),
);
if ( 's_posts' === $item[ $column_name ] ) {
$empty = 1;
$s_posts = json_decode( $item['s_posts'] );
foreach ( $s_posts as $id ) {
$id = absint( $id );
if ( 'publish' === get_post_status( $id ) ) {
$empty = 0;
break;
}
}
if ( $empty ) {
return '' . esc_html__( 'No post selected', 'header-footer-code-manager' ) . '';
}
}
return esc_html( $nnr_hfcm_display_array[ $item[ $column_name ] ] );
case 'location':
if ( !$item[ $column_name ] ) {
return esc_html__( 'N/A', 'header-footer-code-manager' );
}
$nnr_hfcm_locations = array(
'header' => esc_html__( 'Header', 'header-footer-code-manager' ),
'before_content' => esc_html__( 'Before Content', 'header-footer-code-manager' ),
'after_content' => esc_html__( 'After Content', 'header-footer-code-manager' ),
'footer' => esc_html__( 'Footer', 'header-footer-code-manager' ),
);
return esc_html( $nnr_hfcm_locations[ $item[ $column_name ] ] );
case 'device_type':
if ( 'both' === $item[ $column_name ] ) {
return esc_html__( 'Show on All Devices', 'header-footer-code-manager' );
} elseif ( 'mobile' === $item[ $column_name ] ) {
return esc_html__( 'Only Mobile Devices', 'header-footer-code-manager' );
} elseif ( 'desktop' === $item[ $column_name ] ) {
return esc_html__( 'Only Desktop', 'header-footer-code-manager' );
} else {
return esc_html( $item[ $column_name ] );
}
case 'snippet_type':
$snippet_types = array(
'html' => esc_html__( 'HTML', 'header-footer-code-manager' ),
'css' => esc_html__( 'CSS', 'header-footer-code-manager' ),
'js' => esc_html__( 'Javascript', 'header-footer-code-manager' )
);
return esc_html( $snippet_types[ $item[ $column_name ] ] );
case 'status':
if ( 'inactive' === $item[ $column_name ] ) {
return '
';
} elseif ( 'active' === $item[ $column_name ] ) {
return '
';
} else {
return esc_html( $item[ $column_name ] );
}
case 'script_id':
return esc_html( $item[ $column_name ] );
case 'shortcode':
return '[hfcm id="' . absint( $item['script_id'] ) . '"]';
default:
return print_r( $item, true ); // Show the whole array for troubleshooting purposes
}
}
/**
* Render the bulk edit checkbox
*
* @param array $item
*
* @return string
*/
function column_cb( $item )
{
return sprintf(
'', $item['script_id']
);
}
/**
* Method for name column
*
* @param array $item an array of DB data
*
* @return string
*/
function column_name( $item )
{
$delete_nonce = wp_create_nonce( 'hfcm_delete_snippet' );
$edit_nonce = wp_create_nonce( 'hfcm_edit_snippet' );
$title = '' . esc_html( $item['name'] ) . '';
$nnr_current_screen = get_current_screen();
if ( !empty( $nnr_current_screen->parent_base ) ) {
$page = $nnr_current_screen->parent_base;
} else {
$page = sanitize_text_field( $_GET['page'] );
}
$actions = array(
'edit' => sprintf( '' . esc_html__( 'Edit', 'header-footer-code-manager' ) . '', esc_attr( 'hfcm-update' ), 'edit', absint( $item['script_id'] ), $edit_nonce ),
'copy' => sprintf( '' . esc_html__( 'Copy Shortcode', 'header-footer-code-manager' ) . '', absint( $item['script_id'] ), absint( $item['script_id'] ) ),
'delete' => sprintf( '' . esc_html__( 'Delete', 'header-footer-code-manager' ) . '', $page, 'delete', absint( $item['script_id'] ), $delete_nonce ),
);
return $title . $this->row_actions( $actions );
}
/**
* Associative array of columns
*
* @return array
*/
function get_columns()
{
$columns = array(
'cb' => '',
'script_id' => esc_html__( 'ID', 'header-footer-code-manager' ),
'status' => esc_html__( 'Status', 'header-footer-code-manager' ),
'name' => esc_html__( 'Snippet Name', 'header-footer-code-manager' ),
'display_on' => esc_html__( 'Display On', 'header-footer-code-manager' ),
'location' => esc_html__( 'Location', 'header-footer-code-manager' ),
'snippet_type' => esc_html__( 'Snippet Type', 'header-footer-code-manager' ),
'device_type' => esc_html__( 'Devices', 'header-footer-code-manager' ),
'shortcode' => esc_html__( 'Shortcode', 'header-footer-code-manager' ),
);
return $columns;
}
/**
* Columns to make sortable.
*
* @return array
*/
public function get_sortable_columns()
{
return array(
'name' => array( 'name', true ),
'location' => array( 'location', true ),
'script_id' => array( 'script_id', false ),
);
}
/**
* Returns an associative array containing the bulk action
*
* @return array
*/
public function get_bulk_actions()
{
return array(
'bulk-activate' => esc_html__( 'Activate', 'header-footer-code-manager' ),
'bulk-deactivate' => esc_html__( 'Deactivate', 'header-footer-code-manager' ),
'bulk-delete' => esc_html__( 'Remove', 'header-footer-code-manager' ),
);
}
/**
* Add filters and extra actions above and below the table
*
* @param string $which Are the actions displayed on the table top or bottom
*/
public function extra_tablenav( $which )
{
if ( 'top' === $which ) {
$query = isset( $_POST['snippet_type'] ) ? sanitize_text_field( $_POST['snippet_type'] ) : '';
$snippet_type = array(
'html' => esc_html__( 'HTML', 'header-footer-code-manager' ),
'css' => esc_html__( 'CSS', 'header-footer-code-manager' ),
'js' => esc_html__( 'Javascript', 'header-footer-code-manager' )
);
echo '';
echo '';
submit_button( __( 'Filter', 'header-footer-code-manager' ), 'button', 'filter_action', false );
echo '
';
}
echo '';
echo '
';
}
/**
* Handles data query and filter, sorting, and pagination.
*/
public function prepare_items()
{
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
// Retrieve $customvar for use in query to get items.
$customvar = 'all';
if ( !empty( $_GET['customvar'] ) ) {
$customvar = sanitize_text_field( $_GET['customvar'] );
if ( empty( $customvar ) || !in_array( $customvar, [ 'inactive', 'active', 'all' ] ) ) {
$customvar = 'all';
}
}
$this->_column_headers = array( $columns, $hidden, $sortable );
/**
* Process bulk action
*/
$this->process_bulk_action();
$this->views();
$per_page = $this->get_items_per_page( 'snippets_per_page', 20 );
$current_page = $this->get_pagenum();
$total_items = self::record_count();
$this->set_pagination_args(
array(
'total_items' => $total_items,
'per_page' => $per_page,
)
);
$this->items = self::get_snippets( $per_page, $current_page, $customvar );
}
public function get_views()
{
$views = array();
$current = 'all';
if ( !empty( $_GET['customvar'] ) ) {
$current = sanitize_text_field( $_GET['customvar'] );
}
//All link
$class = 'all' === $current ? 'current' : '';
$all_url = remove_query_arg( 'customvar' );
$views['all'] = '' . esc_html__( 'All', 'header-footer-code-manager' ) . ' (' . esc_html__( $this->record_count() ) . ')';
//Foo link
$foo_url = add_query_arg( 'customvar', 'active' );
$class = ('active' === $current ? 'current' : '');
$views['active'] = '' . esc_html__( 'Active', 'header-footer-code-manager' ) . ' (' . esc_html__( $this->record_count( 'active' ) ) . ')';
//Bar link
$bar_url = add_query_arg( 'customvar', 'inactive' );
$class = ('inactive' === $current ? 'current' : '');
$views['inactive'] = '' . esc_html__( 'Inactive', 'header-footer-code-manager' ) . ' (' . esc_html__( $this->record_count( 'inactive' ) ) . ')';
return $views;
}
public function process_bulk_action()
{
//Detect when a bulk action is being triggered...
if ( 'delete' === $this->current_action() ) {
if(!empty($_REQUEST['_wpnonce'])) {
// In our file that handles the request, verify the nonce.
$nonce = sanitize_text_field( $_REQUEST['_wpnonce'] );
if ( !wp_verify_nonce( $nonce, 'hfcm_delete_snippet' ) ) {
die( 'Go get a life script kiddies' );
} else {
if ( !empty( $_GET['snippet'] ) ) {
$snippet_id = absint( $_GET['snippet'] );
if ( !empty( $snippet_id ) ) {
self::delete_snippet( $snippet_id );
}
}
NNR_HFCM::hfcm_redirect( admin_url( 'admin.php?page=hfcm-list' ) );
return;
}
}
}
// If the delete bulk action is triggered
if ( (isset( $_POST['action'] ) && 'bulk-delete' === $_POST['action'])
|| (isset( $_POST['action2'] ) && 'bulk-delete' === $_POST['action2'])
) {
if ( check_admin_referer( 'bulk-snippets' ) ) {
$bulk_snippets = $_POST['snippets'];
// loop over the array of record IDs and delete them
foreach ( $bulk_snippets as $id ) {
$id = absint( $id );
if ( !empty( $id ) && is_int( $id ) ) {
self::delete_snippet( $id );
}
}
NNR_HFCM::hfcm_redirect( admin_url( 'admin.php?page=hfcm-list' ) );
return;
}
} elseif ( (isset( $_POST['action'] ) && 'bulk-activate' === $_POST['action'])
|| (isset( $_POST['action2'] ) && 'bulk-activate' === $_POST['action2'])
) {
if ( check_admin_referer( 'bulk-snippets' ) ) {
$bulk_snippets = $_POST['snippets'];
// loop over the array of record IDs and activate them
foreach ( $bulk_snippets as $id ) {
$id = absint( $id );
if ( !empty( $id ) && is_int( $id ) ) {
self::activate_snippet( $id );
}
}
NNR_HFCM::hfcm_redirect( admin_url( 'admin.php?page=hfcm-list' ) );
return;
}
} elseif ( (isset( $_POST['action'] ) && 'bulk-deactivate' === $_POST['action'])
|| (isset( $_POST['action2'] ) && 'bulk-deactivate' === $_POST['action2'])
) {
if ( check_admin_referer( 'bulk-snippets' ) ) {
$bulk_snippets = $_POST['snippets'];
// loop over the array of record IDs and deactivate them
foreach ( $bulk_snippets as $id ) {
$id = absint( $id );
if ( !empty( $id ) && is_int( $id ) ) {
self::deactivate_snippet( $id );
}
}
NNR_HFCM::hfcm_redirect( admin_url( 'admin.php?page=hfcm-list' ) );
return;
}
}
}
/**
* Displays the search box.
*
* @param string $text The 'submit' button label.
* @param string $input_id ID attribute value for the search input field.
* @since 3.1.0
*/
public function search_box( $text, $input_id )
{
if ( empty( $_REQUEST['s'] ) && !$this->has_items() ) {
return;
}
$input_id = $input_id . '-search-input';
?>
'search-submit' ) ); ?>