diff --git a/includes/class-newspack.php b/includes/class-newspack.php index 26aab9a957..47d50e65af 100644 --- a/includes/class-newspack.php +++ b/includes/class-newspack.php @@ -235,6 +235,9 @@ private function includes() { // Filter by authors in the Posts page. include_once NEWSPACK_ABSPATH . 'includes/author-filter/class-author-filter.php'; + // Display tags as labels. + include_once NEWSPACK_ABSPATH . 'includes/tag-labels/class-tag-labels.php'; + // Load the general Newspack UI front-end styles. include_once NEWSPACK_ABSPATH . 'includes/class-newspack-ui.php'; include_once NEWSPACK_ABSPATH . 'includes/class-newspack-ui-icons.php'; diff --git a/includes/tag-labels/class-tag-labels.php b/includes/tag-labels/class-tag-labels.php new file mode 100644 index 0000000000..68417bf626 --- /dev/null +++ b/includes/tag-labels/class-tag-labels.php @@ -0,0 +1,205 @@ +term_id ) { + return false; + } + return ! empty( get_term_meta( $term->term_id, self::TAG_LABEL_META_KEY, true ) ); + } + + /** + * Given a term, return the flag (text) of its label and + * the link to the term archive. + * + * Will return null if label isn't enabled for the term. + * + * @param WP_Term $term Term to check. + * + * @return array|null As ['flag' => FLAG_NAME, 'link' => TERM_LINK]. + */ + public static function get_tag_label_for_term( $term ) { + if ( ! $term || ! $term->term_id || ! self::is_tag_label( $term ) ) { + return null; + } + + // A little fancy in case someone wants to give a tag a + // falsy label flag. Empty string still gets default value. + $term_label_flag = get_term_meta( $term->term_id, self::TAG_LABEL_FLAG_META_KEY, true ); + if ( ! isset( $term_label_flag ) || '' === $term_label_flag ) { + $term_label_flag = $term->name; + } + + $term_label_link = get_term_link( $term->term_id ); + + return [ + 'flag' => $term_label_flag, + 'link' => $term_label_link, + ]; + } + + /** + * Given a post ID, grab array of tag labels (if any) for it. + * + * @param int $post_id Post ID. + * + * @return array Elements as ['flag' => FLAG_NAME, 'link' => TERM_LINK]. + */ + public static function get_labels_for_post( $post_id ) { + $post_terms = get_the_terms( $post_id, 'post_tag' ); + + if ( ! $post_terms ) { + return []; + } + + return array_filter( + array_map( + function( $term ) { + return self::get_tag_label_for_term( $term ); + }, + $post_terms + ) + ); + } + + /** + * Initialize hooks. + */ + public static function init() { + add_action( 'post_tag_term_edit_form_top', array( __CLASS__, 'enqueue_scripts' ) ); + + add_action( 'post_tag_edit_form_fields', [ __CLASS__, 'edit_term' ] ); + add_action( 'edited_post_tag', [ __CLASS__, 'save_term' ] ); + } + + /** + * Enqueues js script + * + * @return void + */ + public static function enqueue_scripts() { + wp_enqueue_script( + 'newspack_tag_labels', + Newspack::plugin_url() . '/dist/other-scripts/tag-labels.js', + [ 'jquery' ], + NEWSPACK_PLUGIN_VERSION, + true + ); + } + + /** + * Add term edit fields. + * + * Toggle to determine if the term is a label. + * Also, override for flag (text used on label). + * + * @param WP_Term $term The current WP_Term object. + */ + public static function edit_term( $term ) { + $checkbox_id = self::TAG_LABEL_META_KEY; + $is_label = self::is_tag_label( $term ); + + $label = self::get_tag_label_for_term( $term ); + $label_flag = $label ? $label['flag'] : $term->name; + + $input_label_flag = ( $term->name === $label_flag ) ? '' : $label_flag; + ?> +
+ +
+