/** * Filter the Movie Metadata submitted when saving a post to * avoid storing unexpected data to the database. * * The Metabox array makes a distinction between pure metadata * and crew data, so we filter them separately. If the data slug * is valid, the value is escaped and added to the return array. * * @since 1.0 * * @param array $data The Movie Metadata to filter * * @return array The filtered Metadata */ private static function validate_meta($data) { if (!is_array($data) || empty($data) || !isset($data['tmdb_id'])) { return $data; } $data = wpmoly_filter_empty_array($data); $data = wpmoly_filter_undimension_array($data); $supported = WPMOLY_Settings::get_supported_movie_meta(); $keys = array_keys($supported); $movie_tmdb_id = esc_attr($data['tmdb_id']); $movie_post_id = isset($data['post_id']) && '' != $data['post_id'] ? esc_attr($data['post_id']) : null; $movie_poster = isset($data['poster']) && '' != $data['poster'] ? esc_attr($data['poster']) : null; $movie_meta = array(); foreach ($data as $slug => $_meta) { if (in_array($slug, $keys)) { $filter = isset($supported[$slug]['filter']) && function_exists($supported[$slug]['filter']) ? $supported[$slug]['filter'] : 'esc_html'; $args = isset($supported[$slug]['filter_args']) && !is_null($supported[$slug]['filter_args']) ? $supported[$slug]['filter_args'] : null; $movie_meta[$slug] = call_user_func($filter, $_meta, $args); } } $_data = array_merge(array('tmdb_id' => $movie_tmdb_id, 'post_id' => $movie_post_id, 'poster' => $movie_poster), $movie_meta); return $_data; }
/** * Render Allocine styled Headbox 'Details' Tab. * * @since 2.1.4 * * @return string Headbox Tab HTML content */ private function render_details_tab() { $id = get_the_ID(); $overview = self::get_movie_meta($id, 'overview'); $tagline = self::get_movie_meta($id, 'tagline'); $details = wpmoly_get_movie_details(); $default_fields = WPMOLY_Settings::get_supported_movie_details(); foreach ($details as $slug => $detail) { if (!is_array($detail)) { $detail = array($detail); } if (isset($default_fields[$slug]['panel']) && 'custom' == $default_fields[$slug]['panel']) { unset($details[$slug]); } else { foreach ($detail as $i => $d) { if (!empty($d)) { if (isset($default_fields[$slug]['options'])) { $value = $default_fields[$slug]['options'][$d]; } else { $value = $d; } if ('rating' == $slug) { $d = apply_filters("wpmoly_movie_meta_link", array('key' => 'rating', 'value' => array_search($value, $default_fields[$slug]['options']), 'type' => 'detail', 'text' => $value)); } else { $d = apply_filters("wpmoly_movie_meta_link", array('key' => $slug, 'value' => $value, 'meta' => 'detail', 'text' => $value)); } $detail[$i] = apply_filters("wpmoly_format_movie_field", $d); } } $detail = implode(', ', $detail); if (empty($detail)) { $detail = apply_filters("wpmoly_format_movie_field", ''); } $title = ''; if (isset($default_fields[$slug])) { $title = __($default_fields[$slug]['title'], 'wpmovielibrary'); } $details[$slug] = array('slug' => $slug, 'title' => $title, 'value' => $detail); } } $metas = wpmoly_get_movie_meta(); $metas = wpmoly_filter_undimension_array($metas); $default_fields = WPMOLY_Settings::get_supported_movie_meta(); if (!empty($metas)) { unset($metas['title'], $metas['cast'], $metas['overview'], $metas['tagline']); foreach ($metas as $slug => $field) { if (isset($default_fields[$slug])) { // Custom filter if available if (has_filter("wpmoly_format_movie_{$slug}")) { $field = apply_filters("wpmoly_format_movie_{$slug}", $field); } // Filter empty field $field = apply_filters("wpmoly_format_movie_field", $field); $metas[$slug] = array('slug' => $slug, 'title' => __($default_fields[$slug]['title'], 'wpmovielibrary'), 'value' => $field); } else { unset($metas[$slug]); } } } $attributes = compact('id', 'overview', 'tagline', 'details', 'metas'); $content = self::render_template('movies/headbox-allocine/tabs/details.php', $attributes, $require = 'always'); return $content; }
/** * Generate current movie's metadata list. * * @since 1.0 * * @return null|string The current movie's metadata list */ public static function movie_metadata() { if ('nowhere' == wpmoly_o('show-meta') || 'posts_only' == wpmoly_o('show-meta') && !is_singular()) { return null; } $metadata = wpmoly_get_movie_meta(); $metadata = wpmoly_filter_undimension_array($metadata); $fields = wpmoly_o('sort-meta'); $default_fields = WPMOLY_Settings::get_supported_movie_meta(); if ('' == $metadata || empty($fields) || !isset($fields['used'])) { return null; } $fields = $fields['used']; if (isset($fields['placebo'])) { unset($fields['placebo']); } $items = array(); foreach ($fields as $slug => $field) { $_field = $metadata[$slug]; // Custom filter if available if (has_filter("wpmoly_format_movie_{$slug}")) { $_field = apply_filters("wpmoly_format_movie_{$slug}", $_field); } // Filter empty field $_field = apply_filters("wpmoly_format_movie_field", $_field); $fields[$slug] = $_field; $items[] = array('slug' => $slug, 'title' => __($default_fields[$slug]['title'], 'wpmovielibrary'), 'value' => $_field); } $html = WPMovieLibrary::render_template('movies/movie-metadata.php', array('items' => $items), $require = 'always'); return $html; }
/** * Modern headbox meta tab content callback. * * @since 2.0 * * @return string Tab content HTML markup */ public function get_wpmoly_headbox_meta_tab() { // TODO: better filtering/formatting $metadata = wpmoly_get_movie_meta(); $metadata = wpmoly_filter_undimension_array($metadata); $fields = wpmoly_o('sort-meta'); $default_fields = WPMOLY_Settings::get_supported_movie_meta(); if ('' == $metadata || empty($fields) || !isset($fields['used'])) { return null; } $fields = $fields['used']; if (isset($fields['placebo'])) { unset($fields['placebo']); } unset($fields['cast'], $fields['overview'], $fields['genres']); $items = array(); foreach ($fields as $slug => $field) { $_field = $metadata[$slug]; // Custom filter if available if (has_filter("wpmoly_format_movie_{$slug}")) { $_field = apply_filters("wpmoly_format_movie_{$slug}", $_field); } // Filter empty field $_field = apply_filters("wpmoly_format_movie_field", $_field); $fields[$slug] = $_field; $items[] = array('slug' => $slug, 'title' => __($default_fields[$slug]['title'], 'wpmovielibrary'), 'value' => $_field); } $attributes = array('meta' => $items); $content = WPMovieLibrary::render_template('movies/headbox/tabs/meta.php', $attributes, $require = 'always'); return $content; }
/** * Prepare movies for Movies and Movie shortcodes. * * @since 1.1 * * @param object WP_Query object * @param acrray Shortcode attributes * * @return array Usable data for Shortcodes */ private static function prepare_movies($query, $atts) { if (!$query->have_posts()) { return array(); } extract($atts); $movies = array(); $default_fields = WPMOLY_Settings::get_supported_movie_meta(); while ($query->have_posts()) { $query->the_post(); $movies[$query->current_post] = array('id' => get_the_ID(), 'title' => get_the_title(), 'url' => get_permalink(), 'poster' => null, 'meta' => null, 'details' => null); if (!is_null($poster) && has_post_thumbnail(get_the_ID())) { $movies[$query->current_post]['poster'] = get_the_post_thumbnail(get_the_ID(), $poster); } /* * Meta are passed to the template as an array of values and titles * This gives more freedom to adapt the template */ if (!is_null($meta)) { if (!is_array($meta)) { $meta = array($meta); } $_meta = wpmoly_get_movie_meta(get_the_ID(), 'data'); $_meta = wpmoly_filter_undimension_array($_meta); $metadata = array(); foreach ($_meta as $slug => $m) { if (in_array($slug, $meta)) { $title = __($default_fields[$slug]['title'], 'wpmovielibrary'); $value = $_meta[$slug]; if (has_filter("wpmoly_format_movie_{$slug}")) { $value = apply_filters("wpmoly_format_movie_{$slug}", $value); } $value = apply_filters('wpmoly_format_movie_field', $value); $metadata[array_search($slug, $meta)] = array('title' => $title, 'value' => $value); } } ksort($metadata); $movies[$query->current_post]['meta'] = $metadata; } /* * Details are passed to the template as a string * This is simpler because formatting is already * done via filters */ if (!is_null($details)) { $movies[$query->current_post]['details'] = ''; if (!is_array($details)) { $details = array($details); } foreach ($details as $detail) { $value = call_user_func("wpmoly_get_movie_{$detail}", get_the_ID()); $movies[$query->current_post]['details'] .= apply_filters("wpmoly_format_movie_{$detail}", $value); } } } wp_reset_postdata(); return $movies; }
/** * Filter an array to remove any sub-array, reducing multidimensionnal * arrays. * * @since 1.0 * * @param array $array Array to check * * @return array Reduced array */ function wpmoly_filter_undimension_array($array) { if (!is_array($array) || empty($array)) { return $array; } $_array = array(); foreach ($array as $key => $row) { if (is_array($row)) { $_array = array_merge($_array, wpmoly_filter_undimension_array($row)); } else { $_array[$key] = $row; } } return $_array; }