* @since 3.0.0
*/
namespace Beyondwords\Wordpress\Component\Posts\Column;
use Beyondwords\Wordpress\Component\Post\PostMetaUtils;
use Beyondwords\Wordpress\Component\Settings\SettingsUtils;
use Beyondwords\Wordpress\Core\CoreUtils;
/**
* Column setup
*
* @since 3.0.0
*/
class Column
{
public const OUTPUT_YES = ' ';
public const OUTPUT_NO = '—';
public const OUTPUT_DISABLED = ' Disabled';
public const OUTPUT_ERROR_PREFIX = ' ';
/**
* Init.
*
* @since 4.0.0
* @since 4.5.0 Make BeyondWords column sortable via the pre_get_posts query.
*/
public function init()
{
add_action('wp_loaded', function () {
$postTypes = SettingsUtils::getCompatiblePostTypes();
if (is_array($postTypes)) {
foreach ($postTypes as $postType) {
add_filter("manage_{$postType}_posts_columns", array($this, 'renderColumnsHead'));
add_action("manage_{$postType}_posts_custom_column", array($this, 'renderColumnsContent'), 10, 2);
add_filter("manage_edit-{$postType}_sortable_columns", array($this, 'makeColumnSortable'));
}
}
});
if (CoreUtils::isEditScreen()) {
add_action('pre_get_posts', array($this, 'setSortQuery'));
}
}
/**
* Add a custom column with player status.
*
* @since 3.0.0
*
* @param array $columns Array of
headers
*
* @return array
**/
public function renderColumnsHead($columns)
{
return array_merge($columns, array(
'beyondwords' => __('BeyondWords', 'speechkit'),
));
}
/**
* Render ✗|✓ in Posts list, under the BeyondWords column.
*
* @since 3.0.0
*
* @param string $columnName Column name
* @param int $postId Post ID
*
* @return void
**/
public function renderColumnsContent($columnName, $postId)
{
if ($columnName !== 'beyondwords') {
return;
}
$postTypes = SettingsUtils::getCompatiblePostTypes();
if (empty($postTypes)) {
return;
}
$errorMessage = PostMetaUtils::getErrorMessage($postId);
$contentId = PostMetaUtils::getContentId($postId);
$disabled = PostMetaUtils::getDisabled($postId);
$allowedTags = array(
'span' => array(
'class' => array(),
),
);
if (! empty($errorMessage)) {
echo wp_kses(self::OUTPUT_ERROR_PREFIX . $errorMessage, $allowedTags);
} elseif (empty($contentId)) {
echo wp_kses(self::OUTPUT_NO, $allowedTags);
} else {
echo wp_kses(self::OUTPUT_YES, $allowedTags);
}
if (! empty($disabled)) {
echo wp_kses(self::OUTPUT_DISABLED, $allowedTags);
}
}
/**
* Make the BeyondWords column sortable.
*
* @since 4.5.1
*
* @param array $sortableColumns An array of sortable columns.
*
* @return array The adjusted array of sortable columns.
**/
public function makeColumnSortable($sortableColumns)
{
// Make column 'beyondwords' sortable
$sortableColumns['beyondwords'] = 'beyondwords';
return $sortableColumns;
}
/**
* Set the query to sort by BeyondWords fields.
*
* @since 4.5.1
*
* @param WP_Query $query WordPress query.
*
* @return $query WP_Query
*/
public function setSortQuery($query)
{
$orderBy = $query->get('orderby');
if ($orderBy === 'beyondwords' && $query->is_main_query()) {
$query->set('meta_query', $this->getSortQueryArgs());
$query->set('orderby', 'meta_value_num date');
}
return $query;
}
/**
* Get the sort search query args.
*
* @since 4.5.1
*
* @param array $sortableColumns An array of sortable columns.
*
* @return array
*/
public function getSortQueryArgs()
{
return [
'relation' => 'OR',
[
'key' => 'beyondwords_generate_audio',
'compare' => 'NOT EXISTS',
],
[
'key' => 'beyondwords_generate_audio',
'compare' => 'EXISTS',
],
];
}
}
|