WordPress.org

Make WordPress Core

Opened 7 years ago

Last modified 2 years ago

#4916 assigned defect (bug)

comment_type function doesn't return the comment type string

Reported by: hudatoriq Owned by:
Milestone: Future Release Priority: normal
Severity: normal Version: 2.3
Component: Comments Keywords: comment needs-patch i18n
Focuses: Cc:

Description

The comment_type function in comment-template.php only echoes string that explain the comment type. Sometimes we need the string to be returned instead of echoed, e.g. for i18n purposes.

Attachments (1)

comment-template.diff (980 bytes) - added by hudatoriq 7 years ago.

Download all attachments as: .zip

Change History (13)

comment:1 westi7 years ago

  • Milestone 2.4 (next) deleted
  • Resolution set to invalid
  • Status changed from new to closed

Then use get_comment_type in general all simple WordPress template tags come in two forms:

  1. One which echo's - e.g. the_title
  2. One which returns - e.g. get_the_title

Marking as INVALID as get_comment_type provides what you need.

http://trac.wordpress.org/browser/trunk/wp-includes/comment-template.php#L201

hudatoriq7 years ago

comment:2 hudatoriq7 years ago

  • Resolution invalid deleted
  • Status changed from closed to reopened

Yes, there is get_comment_type() function. But it's rather different. get_comment_type() only checks and returns the string code of the type: 'trackback', 'pingback', and 'comment'. Whereas comment_type() receives the labels of each string code thus selecting which labels will be displayed on the page.

The function the_title() also has 'echo' parameter although there is already get_the_title() function

http://trac.wordpress.org/browser/trunk/wp-includes/post-template.php#L19

comment:3 westi7 years ago

  • Keywords reporter-feedback added

Can you provide an example of what you are trying to do?

Do we need to add a filter to the output of comment_type to allow you to translate the generated text?

Maybe something like this:

function comment_type($commenttxt = 'Comment', $trackbacktxt = 'Trackback', $pingbacktxt = 'Pingback') {
	$type = get_comment_type();
	switch( $type ) {
		case 'trackback' :
			$output = $trackbacktxt;
			break;
		case 'pingback' :
			$output = $pingbacktxt;
			break;
		default :
			$output = $commenttxt;
	}
	echo apply_filters('comment_type',$output);
}

comment:4 Nazgul7 years ago

  • Milestone set to 2.3

comment:5 hudatoriq7 years ago

I was internationalizing a wordpress template when I met this problem.

Usage example on WP template:

For a unilanguage theme, we can simply write it like this:

<?php comment_type('Comment', 'Trackback', 'Pingback'); ?> by <?php comment_author_link(); ?> on <?php comment_date(); ?>

The problem is, I can't get it internationalized, 'cause in this case, I need the comment_type to returning the output instead of echoing it.
If my proposal is approved, this is how the code above will look like after it gets internationalized

<?php printf(__('%1$s by %2$s on %3$s', 'themedomain'), comment_type(__('Comment', 'themedomain'), __('Trackback', 'themedomain'), __('Pingback', 'themedomain'), false), get_comment_author_link(), get_comment_date()); ?>

Adding a filter is a good idea too. But isn't a good solution for a template.
The purpose of the file comment-template.php is to help people develop their WP template, isn't it? The combination of both solution (filter & new parameter) maybe?

comment:6 follow-up: hudatoriq7 years ago

  • Owner changed from hudatoriq to westi
  • Status changed from reopened to new

Hi, westi.

So.. where are we going to?

comment:7 in reply to: ↑ 6 westi7 years ago

  • Milestone changed from 2.3 to 2.4 (next)
  • Status changed from new to assigned

Replying to hudatoriq:

So.. where are we going to?

I had a chat on irc the other day with nbachiyski:

08:24 < nikolayb> looking at it
08:24 < westi|wah> I wonder wether the code in comment_type should be in get_comment_type so that you can call that with the translatable strings
08:26 < nikolayb> I think that all echoing template functions should only do echo get_<the-function>
08:28 < nikolayb> I guess get_comment_type is used for other things also
08:28 < westi|wah> yeah i'm thinking that would make more sense..
08:28 < nikolayb> in other contexts I mean
08:28 < nikolayb> so we can
08:28 < nikolayb> so we can't easily change it
08:28 < westi|wah> all get_comment_type does though is give you $comment->comment_type at present
08:29 < westi|wah> changing it could cause issues though
08:29 < nikolayb> don't spam plugins use it?
08:29 < westi|wah> possibly - i would hope they didn't though as it is really a template tag
08:29 < nikolayb> we can add another function in the middle: get_comment_type_text or something
08:29 < nikolayb> and comment_type would echo its value
08:31 < westi|wah> that sounds sensible

Moving this to 2.4 as it needs more work to resolve.

comment:8 hudatoriq7 years ago

Yeah, the inconsistency of what xxxx() function does to get_xxxx() should be fixed. There are other functions carrying the same problem. It'll be a hard work 'coz will break some plugins compatibility. But I hope you guys can do it earlier than 2.4.

comment:9 Denis-de-Bernardy5 years ago

  • Component changed from General to Comments

comment:10 westi5 years ago

  • Keywords needs-patch added; reporter-feedback removed
  • Milestone changed from 2.9 to Future Release

Needs a new patch and a good I18N solution.

Moving to future for now.

comment:11 westi2 years ago

  • Keywords i18n added
  • Owner westi deleted
  • Status changed from accepted to assigned

Removing ownership, tagging as i18n, would love to see a proposal to address this and improve the translation support here.

comment:12 kobenland2 years ago

Is a core solution even necessary?

I would have thought Themes hook into the 'get_comment_type' filter and provide their own translation, like this:

<?php
function theme_slug_get_comment_type( $type ) {
    $comment_types = array(
        'comment' => _x( 'Comment', 'noun', 'theme-slug' ),
        'trackback' =>  __( 'Trackback', 'theme-slug' ),
        'ping' => __( 'Pingback', 'theme-slug' );
    );
    return $comment_types[$type];
}
add_filter( 'get_comment_type', 'theme_slug_get_comment_type' );

No?

Last edited 2 years ago by kobenland (previous) (diff)
Note: See TracTickets for help on using tickets.