| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652 | <?php/** * Comment template functions * * These functions are meant to live inside of the WordPress loop. * * @package WordPress * @subpackage Template *//** * Retrieve the author of the current comment. * * If the comment has an empty comment_author field, then 'Anonymous' person is * assumed. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to retrieve the author. *                                   Default current comment. * @return string The comment author */function get_comment_author( $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	if ( empty( $comment->comment_author ) ) {		$user = $comment->user_id ? get_userdata( $comment->user_id ) : false;		if ( $user ) {			$author = $user->display_name;		} else {			$author = __( 'Anonymous' );		}	} else {		$author = $comment->comment_author;	}	/**	 * Filters the returned comment author name.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.	 *	 * @param string     $author     The comment author's username.	 * @param int        $comment_ID The comment ID.	 * @param WP_Comment $comment    The comment object.	 */	return apply_filters( 'get_comment_author', $author, $comment->comment_ID, $comment );}/** * Displays the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author. *                                   Default current comment. */function comment_author( $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	$author  = get_comment_author( $comment );	/**	 * Filters the comment author's name for display.	 *	 * @since 1.2.0	 * @since 4.1.0 The `$comment_ID` parameter was added.	 *	 * @param string $author     The comment author's username.	 * @param int    $comment_ID The comment ID.	 */	echo apply_filters( 'comment_author', $author, $comment->comment_ID );}/** * Retrieve the email of the author of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's email. *                                   Default current comment. * @return string The current comment author's email */function get_comment_author_email( $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	/**	 * Filters the comment author's returned email address.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.	 *	 * @param string     $comment_author_email The comment author's email address.	 * @param int        $comment_ID           The comment ID.	 * @param WP_Comment $comment              The comment object.	 */	return apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment );}/** * Display the email of the author of the current global $comment. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. Most assume that * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's email. *                                   Default current comment. */function comment_author_email( $comment_ID = 0 ) {	$comment      = get_comment( $comment_ID );	$author_email = get_comment_author_email( $comment );	/**	 * Filters the comment author's email for display.	 *	 * @since 1.2.0	 * @since 4.1.0 The `$comment_ID` parameter was added.	 *	 * @param string $author_email The comment author's email address.	 * @param int    $comment_ID   The comment ID.	 */	echo apply_filters( 'author_email', $author_email, $comment->comment_ID );}/** * Display the html email link to the author of the current comment. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. Most assume that * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 0.71 * @since 4.6.0 Added the `$comment` parameter. * * @param string         $linktext Optional. Text to display instead of the comment author's email address. *                                 Default empty. * @param string         $before   Optional. Text or HTML to display before the email link. Default empty. * @param string         $after    Optional. Text or HTML to display after the email link. Default empty. * @param int|WP_Comment $comment  Optional. Comment ID or WP_Comment object. Default is the current comment. */function comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) {	$link = get_comment_author_email_link( $linktext, $before, $after, $comment );	if ( $link ) {		echo $link;	}}/** * Return the html email link to the author of the current comment. * * Care should be taken to protect the email address and assure that email * harvesters do not capture your commenter's email address. Most assume that * their email address will not appear in raw form on the site. Doing so will * enable anyone, including those that people don't want to get the email * address and use it for their own means good and bad. * * @since 2.7.0 * @since 4.6.0 Added the `$comment` parameter. * * @param string         $linktext Optional. Text to display instead of the comment author's email address. *                                 Default empty. * @param string         $before   Optional. Text or HTML to display before the email link. Default empty. * @param string         $after    Optional. Text or HTML to display after the email link. Default empty. * @param int|WP_Comment $comment  Optional. Comment ID or WP_Comment object. Default is the current comment. * @return string HTML markup for the comment author email link. By default, the email address is obfuscated *                via the {@see 'comment_email'} filter with antispambot(). */function get_comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) {	$comment = get_comment( $comment );	/**	 * Filters the comment author's email for display.	 *	 * Care should be taken to protect the email address and assure that email	 * harvesters do not capture your commenter's email address.	 *	 * @since 1.2.0	 * @since 4.1.0 The `$comment` parameter was added.	 *	 * @param string     $comment_author_email The comment author's email address.	 * @param WP_Comment $comment              The comment object.	 */	$email = apply_filters( 'comment_email', $comment->comment_author_email, $comment );	if ( ( ! empty( $email ) ) && ( $email != '@' ) ) {		$display = ( $linktext != '' ) ? $linktext : $email;		$return  = $before;		$return .= sprintf( '<a href="%1$s">%2$s</a>', esc_url( 'mailto:' . $email ), esc_html( $display ) );		$return .= $after;		return $return;	} else {		return '';	}}/** * Retrieve the HTML link to the URL of the author of the current comment. * * Both get_comment_author_url() and get_comment_author() rely on get_comment(), * which falls back to the global comment variable if the $comment_ID argument is empty. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's link. *                                   Default current comment. * @return string The comment author name or HTML link for author's URL. */function get_comment_author_link( $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	$url     = get_comment_author_url( $comment );	$author  = get_comment_author( $comment );	if ( empty( $url ) || 'http://' == $url ) {		$return = $author;	} else {		$return = "<a href='$url' rel='external nofollow ugc' class='url'>$author</a>";	}	/**	 * Filters the comment author's link for display.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$author` and `$comment_ID` parameters were added.	 *	 * @param string $return     The HTML-formatted comment author link.	 *                           Empty for an invalid URL.	 * @param string $author     The comment author's username.	 * @param int    $comment_ID The comment ID.	 */	return apply_filters( 'get_comment_author_link', $return, $author, $comment->comment_ID );}/** * Display the html link to the url of the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's link. *                                   Default current comment. */function comment_author_link( $comment_ID = 0 ) {	echo get_comment_author_link( $comment_ID );}/** * Retrieve the IP address of the author of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's IP address. *                                   Default current comment. * @return string Comment author's IP address. */function get_comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid	$comment = get_comment( $comment_ID );	/**	 * Filters the comment author's returned IP address.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.	 *	 * @param string     $comment_author_IP The comment author's IP address.	 * @param int        $comment_ID        The comment ID.	 * @param WP_Comment $comment           The comment object.	 */	return apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase}/** * Display the IP address of the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's IP address. *                                   Default current comment. */function comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid	echo esc_html( get_comment_author_IP( $comment_ID ) );}/** * Retrieve the url of the author of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's URL. *                                   Default current comment. * @return string Comment author URL. */function get_comment_author_url( $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	$url     = '';	$id      = 0;	if ( ! empty( $comment ) ) {		$author_url = ( 'http://' == $comment->comment_author_url ) ? '' : $comment->comment_author_url;		$url        = esc_url( $author_url, array( 'http', 'https' ) );		$id         = $comment->comment_ID;	}	/**	 * Filters the comment author's URL.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.	 *	 * @param string     $url        The comment author's URL.	 * @param int        $comment_ID The comment ID.	 * @param WP_Comment $comment    The comment object.	 */	return apply_filters( 'get_comment_author_url', $url, $id, $comment );}/** * Display the url of the author of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's URL. *                                   Default current comment. */function comment_author_url( $comment_ID = 0 ) {	$comment    = get_comment( $comment_ID );	$author_url = get_comment_author_url( $comment );	/**	 * Filters the comment author's URL for display.	 *	 * @since 1.2.0	 * @since 4.1.0 The `$comment_ID` parameter was added.	 *	 * @param string $author_url The comment author's URL.	 * @param int    $comment_ID The comment ID.	 */	echo apply_filters( 'comment_url', $author_url, $comment->comment_ID );}/** * Retrieves the HTML link of the url of the author of the current comment. * * $linktext parameter is only used if the URL does not exist for the comment * author. If the URL does exist then the URL will be used and the $linktext * will be ignored. * * Encapsulate the HTML link between the $before and $after. So it will appear * in the order of $before, link, and finally $after. * * @since 1.5.0 * @since 4.6.0 Added the `$comment` parameter. * * @param string         $linktext Optional. The text to display instead of the comment *                                 author's email address. Default empty. * @param string         $before   Optional. The text or HTML to display before the email link. *                                 Default empty. * @param string         $after    Optional. The text or HTML to display after the email link. *                                 Default empty. * @param int|WP_Comment $comment  Optional. Comment ID or WP_Comment object. *                                 Default is the current comment. * @return string The HTML link between the $before and $after parameters. */function get_comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) {	$url     = get_comment_author_url( $comment );	$display = ( $linktext != '' ) ? $linktext : $url;	$display = str_replace( 'http://www.', '', $display );	$display = str_replace( 'http://', '', $display );	if ( '/' == substr( $display, -1 ) ) {		$display = substr( $display, 0, -1 );	}	$return = "$before<a href='$url' rel='external'>$display</a>$after";	/**	 * Filters the comment author's returned URL link.	 *	 * @since 1.5.0	 *	 * @param string $return The HTML-formatted comment author URL link.	 */	return apply_filters( 'get_comment_author_url_link', $return );}/** * Displays the HTML link of the url of the author of the current comment. * * @since 0.71 * @since 4.6.0 Added the `$comment` parameter. * * @param string         $linktext Optional. Text to display instead of the comment author's *                                 email address. Default empty. * @param string         $before   Optional. Text or HTML to display before the email link. *                                 Default empty. * @param string         $after    Optional. Text or HTML to display after the email link. *                                 Default empty. * @param int|WP_Comment $comment  Optional. Comment ID or WP_Comment object. *                                 Default is the current comment. */function comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) {	echo get_comment_author_url_link( $linktext, $before, $after, $comment );}/** * Generates semantic classes for each comment element. * * @since 2.7.0 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. * * @param string|array   $class    Optional. One or more classes to add to the class list. *                                 Default empty. * @param int|WP_Comment $comment  Comment ID or WP_Comment object. Default current comment. * @param int|WP_Post    $post_id  Post ID or WP_Post object. Default current post. * @param bool           $echo     Optional. Whether to echo or return the output. *                                 Default true. * @return string If `$echo` is false, the class will be returned. Void otherwise. */function comment_class( $class = '', $comment = null, $post_id = null, $echo = true ) {	// Separates classes with a single space, collates classes for comment DIV	$class = 'class="' . join( ' ', get_comment_class( $class, $comment, $post_id ) ) . '"';	if ( $echo ) {		echo $class;	} else {		return $class;	}}/** * Returns the classes for the comment div as an array. * * @since 2.7.0 * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object. * * @global int $comment_alt * @global int $comment_depth * @global int $comment_thread_alt * * @param string|array   $class      Optional. One or more classes to add to the class list. Default empty. * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. Default current comment. * @param int|WP_Post    $post_id    Post ID or WP_Post object. Default current post. * @return array An array of classes. */function get_comment_class( $class = '', $comment_id = null, $post_id = null ) {	global $comment_alt, $comment_depth, $comment_thread_alt;	$classes = array();	$comment = get_comment( $comment_id );	if ( ! $comment ) {		return $classes;	}	// Get the comment type (comment, trackback),	$classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type;	// Add classes for comment authors that are registered users.	$user = $comment->user_id ? get_userdata( $comment->user_id ) : false;	if ( $user ) {		$classes[] = 'byuser';		$classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );		// For comment authors who are the author of the post		$post = get_post( $post_id );		if ( $post ) {			if ( $comment->user_id === $post->post_author ) {				$classes[] = 'bypostauthor';			}		}	}	if ( empty( $comment_alt ) ) {		$comment_alt = 0;	}	if ( empty( $comment_depth ) ) {		$comment_depth = 1;	}	if ( empty( $comment_thread_alt ) ) {		$comment_thread_alt = 0;	}	if ( $comment_alt % 2 ) {		$classes[] = 'odd';		$classes[] = 'alt';	} else {		$classes[] = 'even';	}	$comment_alt++;	// Alt for top-level comments	if ( 1 == $comment_depth ) {		if ( $comment_thread_alt % 2 ) {			$classes[] = 'thread-odd';			$classes[] = 'thread-alt';		} else {			$classes[] = 'thread-even';		}		$comment_thread_alt++;	}	$classes[] = "depth-$comment_depth";	if ( ! empty( $class ) ) {		if ( ! is_array( $class ) ) {			$class = preg_split( '#\s+#', $class );		}		$classes = array_merge( $classes, $class );	}	$classes = array_map( 'esc_attr', $classes );	/**	 * Filters the returned CSS classes for the current comment.	 *	 * @since 2.7.0	 *	 * @param string[]    $classes    An array of comment classes.	 * @param string      $class      A comma-separated list of additional classes added to the list.	 * @param int         $comment_id The comment id.	 * @param WP_Comment  $comment    The comment object.	 * @param int|WP_Post $post_id    The post ID or WP_Post object.	 */	return apply_filters( 'comment_class', $classes, $class, $comment->comment_ID, $comment, $post_id );}/** * Retrieve the comment date of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param string          $d          Optional. The format of the date. Default user's setting. * @param int|WP_Comment  $comment_ID WP_Comment or ID of the comment for which to get the date. *                                    Default current comment. * @return string The comment's date. */function get_comment_date( $d = '', $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	if ( '' == $d ) {		$date = mysql2date( get_option( 'date_format' ), $comment->comment_date );	} else {		$date = mysql2date( $d, $comment->comment_date );	}	/**	 * Filters the returned comment date.	 *	 * @since 1.5.0	 *	 * @param string|int $date    Formatted date string or Unix timestamp.	 * @param string     $d       The format of the date.	 * @param WP_Comment $comment The comment object.	 */	return apply_filters( 'get_comment_date', $date, $d, $comment );}/** * Display the comment date of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param string         $d          Optional. The format of the date. Default user's settings. * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the date. *                                   Default current comment. */function comment_date( $d = '', $comment_ID = 0 ) {	echo get_comment_date( $d, $comment_ID );}/** * Retrieves the excerpt of the given comment. * * Returns a maximum of 20 words with an ellipsis appended if necessary. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID  WP_Comment or ID of the comment for which to get the excerpt. *                                    Default current comment. * @return string The possibly truncated comment excerpt. */function get_comment_excerpt( $comment_ID = 0 ) {	$comment      = get_comment( $comment_ID );	$comment_text = strip_tags( str_replace( array( "\n", "\r" ), ' ', $comment->comment_content ) );	/* translators: Maximum number of words used in a comment excerpt. */	$comment_excerpt_length = intval( _x( '20', 'comment_excerpt_length' ) );	/**	 * Filters the maximum number of words used in the comment excerpt.	 *	 * @since 4.4.0	 *	 * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt.	 */	$comment_excerpt_length = apply_filters( 'comment_excerpt_length', $comment_excerpt_length );	$excerpt = wp_trim_words( $comment_text, $comment_excerpt_length, '…' );	/**	 * Filters the retrieved comment excerpt.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.	 *	 * @param string     $excerpt    The comment excerpt text.	 * @param int        $comment_ID The comment ID.	 * @param WP_Comment $comment    The comment object.	 */	return apply_filters( 'get_comment_excerpt', $excerpt, $comment->comment_ID, $comment );}/** * Display the excerpt of the current comment. * * @since 1.2.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID  WP_Comment or ID of the comment for which to print the excerpt. *                                    Default current comment. */function comment_excerpt( $comment_ID = 0 ) {	$comment         = get_comment( $comment_ID );	$comment_excerpt = get_comment_excerpt( $comment );	/**	 * Filters the comment excerpt for display.	 *	 * @since 1.2.0	 * @since 4.1.0 The `$comment_ID` parameter was added.	 *	 * @param string $comment_excerpt The comment excerpt text.	 * @param int    $comment_ID      The comment ID.	 */	echo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID );}/** * Retrieve the comment id of the current comment. * * @since 1.5.0 * * @return int The comment ID. */function get_comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid	$comment = get_comment();	/**	 * Filters the returned comment ID.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` parameter was added.	 *	 * @param int        $comment_ID The current comment ID.	 * @param WP_Comment $comment    The comment object.	 */	return apply_filters( 'get_comment_ID', $comment->comment_ID, $comment );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase}/** * Display the comment id of the current comment. * * @since 0.71 */function comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid	echo get_comment_ID();}/** * Retrieve the link to a given comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. Added `$cpage` argument. * * @see get_page_of_comment() * * @global WP_Rewrite $wp_rewrite      WordPress rewrite component. * @global bool       $in_comment_loop * * @param WP_Comment|int|null $comment Comment to retrieve. Default current comment. * @param array               $args { *     An array of optional arguments to override the defaults. * *     @type string     $type      Passed to get_page_of_comment(). *     @type int        $page      Current page of comments, for calculating comment pagination. *     @type int        $per_page  Per-page value for comment pagination. *     @type int        $max_depth Passed to get_page_of_comment(). *     @type int|string $cpage     Value to use for the comment's "comment-page" or "cpage" value. *                                 If provided, this value overrides any value calculated from `$page` *                                 and `$per_page`. * } * @return string The permalink to the given comment. */function get_comment_link( $comment = null, $args = array() ) {	global $wp_rewrite, $in_comment_loop;	$comment = get_comment( $comment );	// Back-compat.	if ( ! is_array( $args ) ) {		$args = array( 'page' => $args );	}	$defaults = array(		'type'      => 'all',		'page'      => '',		'per_page'  => '',		'max_depth' => '',		'cpage'     => null,	);	$args     = wp_parse_args( $args, $defaults );	$link = get_permalink( $comment->comment_post_ID );	// The 'cpage' param takes precedence.	if ( ! is_null( $args['cpage'] ) ) {		$cpage = $args['cpage'];		// No 'cpage' is provided, so we calculate one.	} else {		if ( '' === $args['per_page'] && get_option( 'page_comments' ) ) {			$args['per_page'] = get_option( 'comments_per_page' );		}		if ( empty( $args['per_page'] ) ) {			$args['per_page'] = 0;			$args['page']     = 0;		}		$cpage = $args['page'];		if ( '' == $cpage ) {			if ( ! empty( $in_comment_loop ) ) {				$cpage = get_query_var( 'cpage' );			} else {				// Requires a database hit, so we only do it when we can't figure out from context.				$cpage = get_page_of_comment( $comment->comment_ID, $args );			}		}		/*		 * If the default page displays the oldest comments, the permalinks for comments on the default page		 * do not need a 'cpage' query var.		 */		if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) {			$cpage = '';		}	}	if ( $cpage && get_option( 'page_comments' ) ) {		if ( $wp_rewrite->using_permalinks() ) {			if ( $cpage ) {				$link = trailingslashit( $link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage;			}			$link = user_trailingslashit( $link, 'comment' );		} elseif ( $cpage ) {			$link = add_query_arg( 'cpage', $cpage, $link );		}	}	if ( $wp_rewrite->using_permalinks() ) {		$link = user_trailingslashit( $link, 'comment' );	}	$link = $link . '#comment-' . $comment->comment_ID;	/**	 * Filters the returned single comment permalink.	 *	 * @since 2.8.0	 * @since 4.4.0 Added the `$cpage` parameter.	 *	 * @see get_page_of_comment()	 *	 * @param string     $link    The comment permalink with '#comment-$id' appended.	 * @param WP_Comment $comment The current comment object.	 * @param array      $args    An array of arguments to override the defaults.	 * @param int        $cpage   The calculated 'cpage' value.	 */	return apply_filters( 'get_comment_link', $link, $comment, $args, $cpage );}/** * Retrieves the link to the current post comments. * * @since 1.5.0 * * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. * @return string The link to the comments. */function get_comments_link( $post_id = 0 ) {	$hash          = get_comments_number( $post_id ) ? '#comments' : '#respond';	$comments_link = get_permalink( $post_id ) . $hash;	/**	 * Filters the returned post comments permalink.	 *	 * @since 3.6.0	 *	 * @param string      $comments_link Post comments permalink with '#comments' appended.	 * @param int|WP_Post $post_id       Post ID or WP_Post object.	 */	return apply_filters( 'get_comments_link', $comments_link, $post_id );}/** * Display the link to the current post comments. * * @since 0.71 * * @param string $deprecated   Not Used. * @param string $deprecated_2 Not Used. */function comments_link( $deprecated = '', $deprecated_2 = '' ) {	if ( ! empty( $deprecated ) ) {		_deprecated_argument( __FUNCTION__, '0.72' );	}	if ( ! empty( $deprecated_2 ) ) {		_deprecated_argument( __FUNCTION__, '1.3.0' );	}	echo esc_url( get_comments_link() );}/** * Retrieves the amount of comments a post has. * * @since 1.5.0 * * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is the global `$post`. * @return string|int If the post exists, a numeric string representing the number of comments *                    the post has, otherwise 0. */function get_comments_number( $post_id = 0 ) {	$post = get_post( $post_id );	if ( ! $post ) {		$count = 0;	} else {		$count   = $post->comment_count;		$post_id = $post->ID;	}	/**	 * Filters the returned comment count for a post.	 *	 * @since 1.5.0	 *	 * @param string|int $count   A string representing the number of comments a post has, otherwise 0.	 * @param int        $post_id Post ID.	 */	return apply_filters( 'get_comments_number', $count, $post_id );}/** * Display the language string for the number of comments the current post has. * * @since 0.71 * * @param string $zero       Optional. Text for no comments. Default false. * @param string $one        Optional. Text for one comment. Default false. * @param string $more       Optional. Text for more than one comment. Default false. * @param string $deprecated Not used. */function comments_number( $zero = false, $one = false, $more = false, $deprecated = '' ) {	if ( ! empty( $deprecated ) ) {		_deprecated_argument( __FUNCTION__, '1.3.0' );	}	echo get_comments_number_text( $zero, $one, $more );}/** * Display the language string for the number of comments the current post has. * * @since 4.0.0 * * @param string $zero Optional. Text for no comments. Default false. * @param string $one  Optional. Text for one comment. Default false. * @param string $more Optional. Text for more than one comment. Default false. */function get_comments_number_text( $zero = false, $one = false, $more = false ) {	$number = get_comments_number();	if ( $number > 1 ) {		if ( false === $more ) {			/* translators: %s: Number of comments. */			$output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) );		} else {			// % Comments			/*			 * translators: If comment number in your language requires declension,			 * translate this to 'on'. Do not translate into your own language.			 */			if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) {				$text = preg_replace( '#<span class="screen-reader-text">.+?</span>#', '', $more );				$text = preg_replace( '/&.+?;/', '', $text ); // Kill entities				$text = trim( strip_tags( $text ), '% ' );				// Replace '% Comments' with a proper plural form				if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) {					/* translators: %s: Number of comments. */					$new_text = _n( '%s Comment', '%s Comments', $number );					$new_text = trim( sprintf( $new_text, '' ) );					$more = str_replace( $text, $new_text, $more );					if ( false === strpos( $more, '%' ) ) {						$more = '% ' . $more;					}				}			}			$output = str_replace( '%', number_format_i18n( $number ), $more );		}	} elseif ( $number == 0 ) {		$output = ( false === $zero ) ? __( 'No Comments' ) : $zero;	} else { // must be one		$output = ( false === $one ) ? __( '1 Comment' ) : $one;	}	/**	 * Filters the comments count for display.	 *	 * @since 1.5.0	 *	 * @see _n()	 *	 * @param string $output A translatable string formatted based on whether the count	 *                       is equal to 0, 1, or 1+.	 * @param int    $number The number of post comments.	 */	return apply_filters( 'comments_number', $output, $number );}/** * Retrieve the text of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @see Walker_Comment::comment() * * @param int|WP_Comment  $comment_ID WP_Comment or ID of the comment for which to get the text. *                                    Default current comment. * @param array           $args       Optional. An array of arguments. Default empty. * @return string The comment content. */function get_comment_text( $comment_ID = 0, $args = array() ) {	$comment = get_comment( $comment_ID );	/**	 * Filters the text of a comment.	 *	 * @since 1.5.0	 *	 * @see Walker_Comment::comment()	 *	 * @param string     $comment_content Text of the comment.	 * @param WP_Comment $comment         The comment object.	 * @param array      $args            An array of arguments.	 */	return apply_filters( 'get_comment_text', $comment->comment_content, $comment, $args );}/** * Display the text of the current comment. * * @since 0.71 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @see Walker_Comment::comment() * * @param int|WP_Comment  $comment_ID WP_Comment or ID of the comment for which to print the text. *                                    Default current comment. * @param array           $args       Optional. An array of arguments. Default empty array. Default empty. */function comment_text( $comment_ID = 0, $args = array() ) {	$comment = get_comment( $comment_ID );	$comment_text = get_comment_text( $comment, $args );	/**	 * Filters the text of a comment to be displayed.	 *	 * @since 1.2.0	 *	 * @see Walker_Comment::comment()	 *	 * @param string          $comment_text Text of the current comment.	 * @param WP_Comment|null $comment      The comment object.	 * @param array           $args         An array of arguments.	 */	echo apply_filters( 'comment_text', $comment_text, $comment, $args );}/** * Retrieve the comment time of the current comment. * * @since 1.5.0 * * @param string $d         Optional. The format of the time. Default user's settings. * @param bool   $gmt       Optional. Whether to use the GMT date. Default false. * @param bool   $translate Optional. Whether to translate the time (for use in feeds). *                          Default true. * @return string The formatted time. */function get_comment_time( $d = '', $gmt = false, $translate = true ) {	$comment = get_comment();	$comment_date = $gmt ? $comment->comment_date_gmt : $comment->comment_date;	if ( '' == $d ) {		$date = mysql2date( get_option( 'time_format' ), $comment_date, $translate );	} else {		$date = mysql2date( $d, $comment_date, $translate );	}	/**	 * Filters the returned comment time.	 *	 * @since 1.5.0	 *	 * @param string|int $date      The comment time, formatted as a date string or Unix timestamp.	 * @param string     $d         Date format.	 * @param bool       $gmt       Whether the GMT date is in use.	 * @param bool       $translate Whether the time is translated.	 * @param WP_Comment $comment   The comment object.	 */	return apply_filters( 'get_comment_time', $date, $d, $gmt, $translate, $comment );}/** * Display the comment time of the current comment. * * @since 0.71 * * @param string $d Optional. The format of the time. Default user's settings. */function comment_time( $d = '' ) {	echo get_comment_time( $d );}/** * Retrieve the comment type of the current comment. * * @since 1.5.0 * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. * * @param int|WP_Comment $comment_ID Optional. WP_Comment or ID of the comment for which to get the type. *                                   Default current comment. * @return string The comment type. */function get_comment_type( $comment_ID = 0 ) {	$comment = get_comment( $comment_ID );	if ( '' == $comment->comment_type ) {		$comment->comment_type = 'comment';	}	/**	 * Filters the returned comment type.	 *	 * @since 1.5.0	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.	 *	 * @param string     $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'.	 * @param int        $comment_ID   The comment ID.	 * @param WP_Comment $comment      The comment object.	 */	return apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment );}/** * Display the comment type of the current comment. * * @since 0.71 * * @param string $commenttxt   Optional. String to display for comment type. Default false. * @param string $trackbacktxt Optional. String to display for trackback type. Default false. * @param string $pingbacktxt  Optional. String to display for pingback type. Default false. */function comment_type( $commenttxt = false, $trackbacktxt = false, $pingbacktxt = false ) {	if ( false === $commenttxt ) {		$commenttxt = _x( 'Comment', 'noun' );	}	if ( false === $trackbacktxt ) {		$trackbacktxt = __( 'Trackback' );	}	if ( false === $pingbacktxt ) {		$pingbacktxt = __( 'Pingback' );	}	$type = get_comment_type();	switch ( $type ) {		case 'trackback':			echo $trackbacktxt;			break;		case 'pingback':			echo $pingbacktxt;			break;		default:			echo $commenttxt;	}}/** * Retrieve The current post's trackback URL. * * There is a check to see if permalink's have been enabled and if so, will * retrieve the pretty path. If permalinks weren't enabled, the ID of the * current post is used and appended to the correct page to go to. * * @since 1.5.0 * * @return string The trackback URL after being filtered. */function get_trackback_url() {	if ( '' != get_option( 'permalink_structure' ) ) {		$tb_url = trailingslashit( get_permalink() ) . user_trailingslashit( 'trackback', 'single_trackback' );	} else {		$tb_url = get_option( 'siteurl' ) . '/wp-trackback.php?p=' . get_the_ID();	}	/**	 * Filters the returned trackback URL.	 *	 * @since 2.2.0	 *	 * @param string $tb_url The trackback URL.	 */	return apply_filters( 'trackback_url', $tb_url );}/** * Display the current post's trackback URL. * * @since 0.71 * * @param bool $deprecated_echo Not used. * @return void|string Should only be used to echo the trackback URL, use get_trackback_url() *                     for the result instead. */function trackback_url( $deprecated_echo = true ) {	if ( true !== $deprecated_echo ) {		_deprecated_argument(			__FUNCTION__,			'2.5.0',			sprintf(				/* translators: %s: get_trackback_url() */				__( 'Use %s instead if you do not want the value echoed.' ),				'<code>get_trackback_url()</code>'			)		);	}	if ( $deprecated_echo ) {		echo get_trackback_url();	} else {		return get_trackback_url();	}}/** * Generate and display the RDF for the trackback information of current post. * * Deprecated in 3.0.0, and restored in 3.0.1. * * @since 0.71 * * @param int $deprecated Not used (Was $timezone = 0). */function trackback_rdf( $deprecated = '' ) {	if ( ! empty( $deprecated ) ) {		_deprecated_argument( __FUNCTION__, '2.5.0' );	}	if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) {		return;	}	echo '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"			xmlns:dc="http://purl.org/dc/elements/1.1/"			xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">		<rdf:Description rdf:about="';	the_permalink();	echo '"' . "\n";	echo '    dc:identifier="';	the_permalink();	echo '"' . "\n";	echo '    dc:title="' . str_replace( '--', '--', wptexturize( strip_tags( get_the_title() ) ) ) . '"' . "\n";	echo '    trackback:ping="' . get_trackback_url() . '"' . " />\n";	echo '</rdf:RDF>';}/** * Determines whether the current post is open for comments. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. * @return bool True if the comments are open. */function comments_open( $post_id = null ) {	$_post = get_post( $post_id );	$post_id = $_post ? $_post->ID : 0;	$open    = ( 'open' == $_post->comment_status );	/**	 * Filters whether the current post is open for comments.	 *	 * @since 2.5.0	 *	 * @param bool $open    Whether the current post is open for comments.	 * @param int  $post_id The post ID.	 */	return apply_filters( 'comments_open', $open, $post_id );}/** * Determines whether the current post is open for pings. * * For more information on this and similar theme functions, check out * the {@link https://developer.wordpress.org/themes/basics/conditional-tags/ * Conditional Tags} article in the Theme Developer Handbook. * * @since 1.5.0 * * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. * @return bool True if pings are accepted */function pings_open( $post_id = null ) {	$_post = get_post( $post_id );	$post_id = $_post ? $_post->ID : 0;	$open    = ( 'open' == $_post->ping_status );	/**	 * Filters whether the current post is open for pings.	 *	 * @since 2.5.0	 *	 * @param bool $open    Whether the current post is open for pings.	 * @param int  $post_id The post ID.	 */	return apply_filters( 'pings_open', $open, $post_id );}/** * Display form token for unfiltered comments. * * Will only display nonce token if the current user has permissions for * unfiltered html. Won't display the token for other users. * * The function was backported to 2.0.10 and was added to versions 2.1.3 and * above. Does not exist in versions prior to 2.0.10 in the 2.0 branch and in * the 2.1 branch, prior to 2.1.3. Technically added in 2.2.0. * * Backported to 2.0.10. * * @since 2.1.3 */function wp_comment_form_unfiltered_html_nonce() {	$post    = get_post();	$post_id = $post ? $post->ID : 0;	if ( current_user_can( 'unfiltered_html' ) ) {		wp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false );		echo "<script>(function(){if(window===window.parent){document.getElementById('_wp_unfiltered_html_comment_disabled').name='_wp_unfiltered_html_comment';}})();</script>\n";	}}/** * Load the comment template specified in $file. * * Will not display the comments template if not on single post or page, or if * the post does not have comments. * * Uses the WordPress database object to query for the comments. The comments * are passed through the {@see 'comments_array'} filter hook with the list of comments * and the post ID respectively. * * The `$file` path is passed through a filter hook called {@see 'comments_template'}, * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path * first and if it fails it will require the default comment template from the * default theme. If either does not exist, then the WordPress process will be * halted. It is advised for that reason, that the default theme is not deleted. * * Will not try to get the comments if the post has none. * * @since 1.5.0 * * @global WP_Query   $wp_query         WordPress Query object. * @global WP_Post    $post             Global post object. * @global wpdb       $wpdb             WordPress database abstraction object. * @global int        $id * @global WP_Comment $comment          Global comment object. * @global string     $user_login * @global int        $user_ID * @global string     $user_identity * @global bool       $overridden_cpage * @global bool       $withcomments * * @param string $file              Optional. The file to load. Default '/comments.php'. * @param bool   $separate_comments Optional. Whether to separate the comments by comment type. *                                  Default false. */function comments_template( $file = '/comments.php', $separate_comments = false ) {	global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity, $overridden_cpage;	if ( ! ( is_single() || is_page() || $withcomments ) || empty( $post ) ) {		return;	}	if ( empty( $file ) ) {		$file = '/comments.php';	}	$req = get_option( 'require_name_email' );	/*	 * Comment author information fetched from the comment cookies.	 */	$commenter = wp_get_current_commenter();	/*	 * The name of the current comment author escaped for use in attributes.	 * Escaped by sanitize_comment_cookies().	 */	$comment_author = $commenter['comment_author'];	/*	 * The email address of the current comment author escaped for use in attributes.	 * Escaped by sanitize_comment_cookies().	 */	$comment_author_email = $commenter['comment_author_email'];	/*	 * The url of the current comment author escaped for use in attributes.	 */	$comment_author_url = esc_url( $commenter['comment_author_url'] );	$comment_args = array(		'orderby'                   => 'comment_date_gmt',		'order'                     => 'ASC',		'status'                    => 'approve',		'post_id'                   => $post->ID,		'no_found_rows'             => false,		'update_comment_meta_cache' => false, // We lazy-load comment meta for performance.	);	if ( get_option( 'thread_comments' ) ) {		$comment_args['hierarchical'] = 'threaded';	} else {		$comment_args['hierarchical'] = false;	}	if ( $user_ID ) {		$comment_args['include_unapproved'] = array( $user_ID );	} else {		$unapproved_email = wp_get_unapproved_comment_author_email();		if ( $unapproved_email ) {			$comment_args['include_unapproved'] = array( $unapproved_email );		}	}	$per_page = 0;	if ( get_option( 'page_comments' ) ) {		$per_page = (int) get_query_var( 'comments_per_page' );		if ( 0 === $per_page ) {			$per_page = (int) get_option( 'comments_per_page' );		}		$comment_args['number'] = $per_page;		$page                   = (int) get_query_var( 'cpage' );		if ( $page ) {			$comment_args['offset'] = ( $page - 1 ) * $per_page;		} elseif ( 'oldest' === get_option( 'default_comments_page' ) ) {			$comment_args['offset'] = 0;		} else {			// If fetching the first page of 'newest', we need a top-level comment count.			$top_level_query = new WP_Comment_Query();			$top_level_args  = array(				'count'   => true,				'orderby' => false,				'post_id' => $post->ID,				'status'  => 'approve',			);			if ( $comment_args['hierarchical'] ) {				$top_level_args['parent'] = 0;			}			if ( isset( $comment_args['include_unapproved'] ) ) {				$top_level_args['include_unapproved'] = $comment_args['include_unapproved'];			}			$top_level_count = $top_level_query->query( $top_level_args );			$comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page;		}	}	/**	 * Filters the arguments used to query comments in comments_template().	 *	 * @since 4.5.0	 *	 * @see WP_Comment_Query::__construct()	 *	 * @param array $comment_args {	 *     Array of WP_Comment_Query arguments.	 *	 *     @type string|array $orderby                   Field(s) to order by.	 *     @type string       $order                     Order of results. Accepts 'ASC' or 'DESC'.	 *     @type string       $status                    Comment status.	 *     @type array        $include_unapproved        Array of IDs or email addresses whose unapproved comments	 *                                                   will be included in results.	 *     @type int          $post_id                   ID of the post.	 *     @type bool         $no_found_rows             Whether to refrain from querying for found rows.	 *     @type bool         $update_comment_meta_cache Whether to prime cache for comment meta.	 *     @type bool|string  $hierarchical              Whether to query for comments hierarchically.	 *     @type int          $offset                    Comment offset.	 *     @type int          $number                    Number of comments to fetch.	 * }	 */	$comment_args  = apply_filters( 'comments_template_query_args', $comment_args );	$comment_query = new WP_Comment_Query( $comment_args );	$_comments     = $comment_query->comments;	// Trees must be flattened before they're passed to the walker.	if ( $comment_args['hierarchical'] ) {		$comments_flat = array();		foreach ( $_comments as $_comment ) {			$comments_flat[]  = $_comment;			$comment_children = $_comment->get_children(				array(					'format'  => 'flat',					'status'  => $comment_args['status'],					'orderby' => $comment_args['orderby'],				)			);			foreach ( $comment_children as $comment_child ) {				$comments_flat[] = $comment_child;			}		}	} else {		$comments_flat = $_comments;	}	/**	 * Filters the comments array.	 *	 * @since 2.1.0	 *	 * @param array $comments Array of comments supplied to the comments template.	 * @param int   $post_ID  Post ID.	 */	$wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID );	$comments                        = &$wp_query->comments;	$wp_query->comment_count         = count( $wp_query->comments );	$wp_query->max_num_comment_pages = $comment_query->max_num_pages;	if ( $separate_comments ) {		$wp_query->comments_by_type = separate_comments( $comments );		$comments_by_type           = &$wp_query->comments_by_type;	} else {		$wp_query->comments_by_type = array();	}	$overridden_cpage = false;	if ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) {		set_query_var( 'cpage', 'newest' == get_option( 'default_comments_page' ) ? get_comment_pages_count() : 1 );		$overridden_cpage = true;	}	if ( ! defined( 'COMMENTS_TEMPLATE' ) ) {		define( 'COMMENTS_TEMPLATE', true );	}	$theme_template = STYLESHEETPATH . $file;	/**	 * Filters the path to the theme template file used for the comments template.	 *	 * @since 1.5.1	 *	 * @param string $theme_template The path to the theme template file.	 */	$include = apply_filters( 'comments_template', $theme_template );	if ( file_exists( $include ) ) {		require( $include );	} elseif ( file_exists( TEMPLATEPATH . $file ) ) {		require( TEMPLATEPATH . $file );	} else { // Backward compat code will be removed in a future release		require( ABSPATH . WPINC . '/theme-compat/comments.php' );	}}/** * Displays the link to the comments for the current post ID. * * @since 0.71 * * @param false|string $zero      Optional. String to display when no comments. Default false. * @param false|string $one       Optional. String to display when only one comment is available. Default false. * @param false|string $more      Optional. String to display when there are more than one comment. Default false. * @param string       $css_class Optional. CSS class to use for comments. Default empty. * @param false|string $none      Optional. String to display when comments have been turned off. Default false. */function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) {	$id     = get_the_ID();	$title  = get_the_title();	$number = get_comments_number( $id );	if ( false === $zero ) {		/* translators: %s: Post title. */		$zero = sprintf( __( 'No Comments<span class="screen-reader-text"> on %s</span>' ), $title );	}	if ( false === $one ) {		/* translators: %s: Post title. */		$one = sprintf( __( '1 Comment<span class="screen-reader-text"> on %s</span>' ), $title );	}	if ( false === $more ) {		/* translators: 1: Number of comments, 2: Post title. */		$more = _n( '%1$s Comment<span class="screen-reader-text"> on %2$s</span>', '%1$s Comments<span class="screen-reader-text"> on %2$s</span>', $number );		$more = sprintf( $more, number_format_i18n( $number ), $title );	}	if ( false === $none ) {		/* translators: %s: Post title. */		$none = sprintf( __( 'Comments Off<span class="screen-reader-text"> on %s</span>' ), $title );	}	if ( 0 == $number && ! comments_open() && ! pings_open() ) {		echo '<span' . ( ( ! empty( $css_class ) ) ? ' class="' . esc_attr( $css_class ) . '"' : '' ) . '>' . $none . '</span>';		return;	}	if ( post_password_required() ) {		_e( 'Enter your password to view comments.' );		return;	}	echo '<a href="';	if ( 0 == $number ) {		$respond_link = get_permalink() . '#respond';		/**		 * Filters the respond link when a post has no comments.		 *		 * @since 4.4.0		 *		 * @param string $respond_link The default response link.		 * @param integer $id The post ID.		 */		echo apply_filters( 'respond_link', $respond_link, $id );	} else {		comments_link();	}	echo '"';	if ( ! empty( $css_class ) ) {		echo ' class="' . $css_class . '" ';	}	$attributes = '';	/**	 * Filters the comments link attributes for display.	 *	 * @since 2.5.0	 *	 * @param string $attributes The comments link attributes. Default empty.	 */	echo apply_filters( 'comments_popup_link_attributes', $attributes );	echo '>';	comments_number( $zero, $one, $more );	echo '</a>';}/** * Retrieve HTML content for reply to comment link. * * @since 2.7.0 * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. * * @param array $args { *     Optional. Override default arguments. * *     @type string $add_below  The first part of the selector used to identify the comment to respond below. *                              The resulting value is passed as the first parameter to addComment.moveForm(), *                              concatenated as $add_below-$comment->comment_ID. Default 'comment'. *     @type string $respond_id The selector identifying the responding comment. Passed as the third parameter *                              to addComment.moveForm(), and appended to the link URL as a hash value. *                              Default 'respond'. *     @type string $reply_text The text of the Reply link. Default 'Reply'. *     @type string $login_text The text of the link to reply if logged out. Default 'Log in to Reply'. *     @type int    $max_depth  The max depth of the comment tree. Default 0. *     @type int    $depth      The depth of the new comment. Must be greater than 0 and less than the value *                              of the 'thread_comments_depth' option set in Settings > Discussion. Default 0. *     @type string $before     The text or HTML to add before the reply link. Default empty. *     @type string $after      The text or HTML to add after the reply link. Default empty. * } * @param int|WP_Comment $comment Comment being replied to. Default current comment. * @param int|WP_Post    $post    Post ID or WP_Post object the comment is going to be displayed on. *                                Default current post. * @return string|false|null Link to show comment form, if successful. False, if comments are closed. */function get_comment_reply_link( $args = array(), $comment = null, $post = null ) {	$defaults = array(		'add_below'     => 'comment',		'respond_id'    => 'respond',		'reply_text'    => __( 'Reply' ),		/* translators: Comment reply button text. %s: Comment author name. */		'reply_to_text' => __( 'Reply to %s' ),		'login_text'    => __( 'Log in to Reply' ),		'max_depth'     => 0,		'depth'         => 0,		'before'        => '',		'after'         => '',	);	$args = wp_parse_args( $args, $defaults );	if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) {		return;	}	$comment = get_comment( $comment );	if ( empty( $comment ) ) {		return;	}	if ( empty( $post ) ) {		$post = $comment->comment_post_ID;	}	$post = get_post( $post );	if ( ! comments_open( $post->ID ) ) {		return false;	}	/**	 * Filters the comment reply link arguments.	 *	 * @since 4.1.0	 *	 * @param array      $args    Comment reply link arguments. See get_comment_reply_link()	 *                            for more information on accepted arguments.	 * @param WP_Comment $comment The object of the comment being replied to.	 * @param WP_Post    $post    The WP_Post object.	 */	$args = apply_filters( 'comment_reply_link_args', $args, $comment, $post );	if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) {		$link = sprintf(			'<a rel="nofollow" class="comment-reply-login" href="%s">%s</a>',			esc_url( wp_login_url( get_permalink() ) ),			$args['login_text']		);	} else {		$data_attributes = array(			'commentid'      => $comment->comment_ID,			'postid'         => $post->ID,			'belowelement'   => $args['add_below'] . '-' . $comment->comment_ID,			'respondelement' => $args['respond_id'],		);		$data_attribute_string = '';		foreach ( $data_attributes as $name => $value ) {			$data_attribute_string .= " data-${name}=\"" . esc_attr( $value ) . '"';		}		$data_attribute_string = trim( $data_attribute_string );		$link = sprintf(			"<a rel='nofollow' class='comment-reply-link' href='%s' %s aria-label='%s'>%s</a>",			esc_url(				add_query_arg(					array(						'replytocom'      => $comment->comment_ID,						'unapproved'      => false,						'moderation-hash' => false,					),					get_permalink( $post->ID )				)			) . '#' . $args['respond_id'],			$data_attribute_string,			esc_attr( sprintf( $args['reply_to_text'], $comment->comment_author ) ),			$args['reply_text']		);	}	/**	 * Filters the comment reply link.	 *	 * @since 2.7.0	 *	 * @param string  $link    The HTML markup for the comment reply link.	 * @param array   $args    An array of arguments overriding the defaults.	 * @param object  $comment The object of the comment being replied.	 * @param WP_Post $post    The WP_Post object.	 */	return apply_filters( 'comment_reply_link', $args['before'] . $link . $args['after'], $args, $comment, $post );}/** * Displays the HTML content for reply to comment link. * * @since 2.7.0 * * @see get_comment_reply_link() * * @param array       $args    Optional. Override default options. * @param int         $comment Comment being replied to. Default current comment. * @param int|WP_Post $post    Post ID or WP_Post object the comment is going to be displayed on. *                             Default current post. */function comment_reply_link( $args = array(), $comment = null, $post = null ) {	echo get_comment_reply_link( $args, $comment, $post );}/** * Retrieve HTML content for reply to post link. * * @since 2.7.0 * * @param array $args { *     Optional. Override default arguments. * *     @type string $add_below  The first part of the selector used to identify the comment to respond below. *                              The resulting value is passed as the first parameter to addComment.moveForm(), *                              concatenated as $add_below-$comment->comment_ID. Default is 'post'. *     @type string $respond_id The selector identifying the responding comment. Passed as the third parameter *                              to addComment.moveForm(), and appended to the link URL as a hash value. *                              Default 'respond'. *     @type string $reply_text Text of the Reply link. Default is 'Leave a Comment'. *     @type string $login_text Text of the link to reply if logged out. Default is 'Log in to leave a Comment'. *     @type string $before     Text or HTML to add before the reply link. Default empty. *     @type string $after      Text or HTML to add after the reply link. Default empty. * } * @param int|WP_Post $post    Optional. Post ID or WP_Post object the comment is going to be displayed on. *                             Default current post. * @return string|false|null Link to show comment form, if successful. False, if comments are closed. */function get_post_reply_link( $args = array(), $post = null ) {	$defaults = array(		'add_below'  => 'post',		'respond_id' => 'respond',		'reply_text' => __( 'Leave a Comment' ),		'login_text' => __( 'Log in to leave a Comment' ),		'before'     => '',		'after'      => '',	);	$args = wp_parse_args( $args, $defaults );	$post = get_post( $post );	if ( ! comments_open( $post->ID ) ) {		return false;	}	if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) {		$link = sprintf(			'<a rel="nofollow" class="comment-reply-login" href="%s">%s</a>',			wp_login_url( get_permalink() ),			$args['login_text']		);	} else {		$onclick = sprintf(			'return addComment.moveForm( "%1$s-%2$s", "0", "%3$s", "%2$s" )',			$args['add_below'],			$post->ID,			$args['respond_id']		);		$link = sprintf(			"<a rel='nofollow' class='comment-reply-link' href='%s' onclick='%s'>%s</a>",			get_permalink( $post->ID ) . '#' . $args['respond_id'],			$onclick,			$args['reply_text']		);	}	$formatted_link = $args['before'] . $link . $args['after'];	/**	 * Filters the formatted post comments link HTML.	 *	 * @since 2.7.0	 *	 * @param string      $formatted The HTML-formatted post comments link.	 * @param int|WP_Post $post      The post ID or WP_Post object.	 */	return apply_filters( 'post_comments_link', $formatted_link, $post );}/** * Displays the HTML content for reply to post link. * * @since 2.7.0 * * @see get_post_reply_link() * * @param array       $args Optional. Override default options, * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. *                          Default current post. */function post_reply_link( $args = array(), $post = null ) {	echo get_post_reply_link( $args, $post );}/** * Retrieve HTML content for cancel comment reply link. * * @since 2.7.0 * * @param string $text Optional. Text to display for cancel reply link. Default empty. * @return string */function get_cancel_comment_reply_link( $text = '' ) {	if ( empty( $text ) ) {		$text = __( 'Click here to cancel reply.' );	}	$style = isset( $_GET['replytocom'] ) ? '' : ' style="display:none;"';	$link  = esc_html( remove_query_arg( array( 'replytocom', 'unapproved', 'moderation-hash' ) ) ) . '#respond';	$formatted_link = '<a rel="nofollow" id="cancel-comment-reply-link" href="' . $link . '"' . $style . '>' . $text . '</a>';	/**	 * Filters the cancel comment reply link HTML.	 *	 * @since 2.7.0	 *	 * @param string $formatted_link The HTML-formatted cancel comment reply link.	 * @param string $link           Cancel comment reply link URL.	 * @param string $text           Cancel comment reply link text.	 */	return apply_filters( 'cancel_comment_reply_link', $formatted_link, $link, $text );}/** * Display HTML content for cancel comment reply link. * * @since 2.7.0 * * @param string $text Optional. Text to display for cancel reply link. Default empty. */function cancel_comment_reply_link( $text = '' ) {	echo get_cancel_comment_reply_link( $text );}/** * Retrieve hidden input HTML for replying to comments. * * @since 3.0.0 * * @param int $id Optional. Post ID. Default current post ID. * @return string Hidden input HTML for replying to comments */function get_comment_id_fields( $id = 0 ) {	if ( empty( $id ) ) {		$id = get_the_ID();	}	$replytoid = isset( $_GET['replytocom'] ) ? (int) $_GET['replytocom'] : 0;	$result    = "<input type='hidden' name='comment_post_ID' value='$id' id='comment_post_ID' />\n";	$result   .= "<input type='hidden' name='comment_parent' id='comment_parent' value='$replytoid' />\n";	/**	 * Filters the returned comment id fields.	 *	 * @since 3.0.0	 *	 * @param string $result    The HTML-formatted hidden id field comment elements.	 * @param int    $id        The post ID.	 * @param int    $replytoid The id of the comment being replied to.	 */	return apply_filters( 'comment_id_fields', $result, $id, $replytoid );}/** * Output hidden input HTML for replying to comments. * * @since 2.7.0 * * @param int $id Optional. Post ID. Default current post ID. */function comment_id_fields( $id = 0 ) {	echo get_comment_id_fields( $id );}/** * Display text based on comment reply status. * * Only affects users with JavaScript disabled. * * @internal The $comment global must be present to allow template tags access to the current *           comment. See https://core.trac.wordpress.org/changeset/36512. * * @since 2.7.0 * * @global WP_Comment $comment Global comment object. * * @param string $noreplytext  Optional. Text to display when not replying to a comment. *                             Default false. * @param string $replytext    Optional. Text to display when replying to a comment. *                             Default false. Accepts "%s" for the author of the comment *                             being replied to. * @param string $linktoparent Optional. Boolean to control making the author's name a link *                             to their comment. Default true. */function comment_form_title( $noreplytext = false, $replytext = false, $linktoparent = true ) {	global $comment;	if ( false === $noreplytext ) {		$noreplytext = __( 'Leave a Reply' );	}	if ( false === $replytext ) {		/* translators: %s: Author of the comment being replied to. */		$replytext = __( 'Leave a Reply to %s' );	}	$replytoid = isset( $_GET['replytocom'] ) ? (int) $_GET['replytocom'] : 0;	if ( 0 == $replytoid ) {		echo $noreplytext;	} else {		// Sets the global so that template tags can be used in the comment form.		$comment = get_comment( $replytoid );		$author  = ( $linktoparent ) ? '<a href="#comment-' . get_comment_ID() . '">' . get_comment_author( $comment ) . '</a>' : get_comment_author( $comment );		printf( $replytext, $author );	}}/** * List comments. * * Used in the comments.php template to list comments for a particular post. * * @since 2.7.0 * * @see WP_Query->comments * * @global WP_Query $wp_query           WordPress Query object. * @global int      $comment_alt * @global int      $comment_depth * @global int      $comment_thread_alt * @global bool     $overridden_cpage * @global bool     $in_comment_loop * * @param string|array $args { *     Optional. Formatting options. * *     @type object $walker            Instance of a Walker class to list comments. Default null. *     @type int    $max_depth         The maximum comments depth. Default empty. *     @type string $style             The style of list ordering. Default 'ul'. Accepts 'ul', 'ol'. *     @type string $callback          Callback function to use. Default null. *     @type string $end-callback      Callback function to use at the end. Default null. *     @type string $type              Type of comments to list. *                                     Default 'all'. Accepts 'all', 'comment', 'pingback', 'trackback', 'pings'. *     @type int    $page              Page ID to list comments for. Default empty. *     @type int    $per_page          Number of comments to list per page. Default empty. *     @type int    $avatar_size       Height and width dimensions of the avatar size. Default 32. *     @type bool   $reverse_top_level Ordering of the listed comments. If true, will display newest comments first. *     @type bool   $reverse_children  Whether to reverse child comments in the list. Default null. *     @type string $format            How to format the comments list. *                                     Default 'html5' if the theme supports it. Accepts 'html5', 'xhtml'. *     @type bool   $short_ping        Whether to output short pings. Default false. *     @type bool   $echo              Whether to echo the output or return it. Default true. * } * @param array $comments Optional. Array of WP_Comment objects. */function wp_list_comments( $args = array(), $comments = null ) {	global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop;	$in_comment_loop = true;	$comment_alt        = 0;	$comment_thread_alt = 0;	$comment_depth      = 1;	$defaults = array(		'walker'            => null,		'max_depth'         => '',		'style'             => 'ul',		'callback'          => null,		'end-callback'      => null,		'type'              => 'all',		'page'              => '',		'per_page'          => '',		'avatar_size'       => 32,		'reverse_top_level' => null,		'reverse_children'  => '',		'format'            => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml',		'short_ping'        => false,		'echo'              => true,	);	$parsed_args = wp_parse_args( $args, $defaults );	/**	 * Filters the arguments used in retrieving the comment list.	 *	 * @since 4.0.0	 *	 * @see wp_list_comments()	 *	 * @param array $parsed_args An array of arguments for displaying comments.	 */	$parsed_args = apply_filters( 'wp_list_comments_args', $parsed_args );	// Figure out what comments we'll be looping through ($_comments)	if ( null !== $comments ) {		$comments = (array) $comments;		if ( empty( $comments ) ) {			return;		}		if ( 'all' != $parsed_args['type'] ) {			$comments_by_type = separate_comments( $comments );			if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) {				return;			}			$_comments = $comments_by_type[ $parsed_args['type'] ];		} else {			$_comments = $comments;		}	} else {		/*		 * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query,		 * perform a separate comment query and allow Walker_Comment to paginate.		 */		if ( $parsed_args['page'] || $parsed_args['per_page'] ) {			$current_cpage = get_query_var( 'cpage' );			if ( ! $current_cpage ) {				$current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages;			}			$current_per_page = get_query_var( 'comments_per_page' );			if ( $parsed_args['page'] != $current_cpage || $parsed_args['per_page'] != $current_per_page ) {				$comment_args = array(					'post_id' => get_the_ID(),					'orderby' => 'comment_date_gmt',					'order'   => 'ASC',					'status'  => 'approve',				);				if ( is_user_logged_in() ) {					$comment_args['include_unapproved'] = get_current_user_id();				} else {					$unapproved_email = wp_get_unapproved_comment_author_email();					if ( $unapproved_email ) {						$comment_args['include_unapproved'] = array( $unapproved_email );					}				}				$comments = get_comments( $comment_args );				if ( 'all' != $parsed_args['type'] ) {					$comments_by_type = separate_comments( $comments );					if ( empty( $comments_by_type[ $parsed_args['type'] ] ) ) {						return;					}					$_comments = $comments_by_type[ $parsed_args['type'] ];				} else {					$_comments = $comments;				}			}			// Otherwise, fall back on the comments from `$wp_query->comments`.		} else {			if ( empty( $wp_query->comments ) ) {				return;			}			if ( 'all' != $parsed_args['type'] ) {				if ( empty( $wp_query->comments_by_type ) ) {					$wp_query->comments_by_type = separate_comments( $wp_query->comments );				}				if ( empty( $wp_query->comments_by_type[ $parsed_args['type'] ] ) ) {					return;				}				$_comments = $wp_query->comments_by_type[ $parsed_args['type'] ];			} else {				$_comments = $wp_query->comments;			}			if ( $wp_query->max_num_comment_pages ) {				$default_comments_page = get_option( 'default_comments_page' );				$cpage                 = get_query_var( 'cpage' );				if ( 'newest' === $default_comments_page ) {					$parsed_args['cpage'] = $cpage;					/*					* When first page shows oldest comments, post permalink is the same as					* the comment permalink.					*/				} elseif ( $cpage == 1 ) {					$parsed_args['cpage'] = '';				} else {					$parsed_args['cpage'] = $cpage;				}				$parsed_args['page']     = 0;				$parsed_args['per_page'] = 0;			}		}	}	if ( '' === $parsed_args['per_page'] && get_option( 'page_comments' ) ) {		$parsed_args['per_page'] = get_query_var( 'comments_per_page' );	}	if ( empty( $parsed_args['per_page'] ) ) {		$parsed_args['per_page'] = 0;		$parsed_args['page']     = 0;	}	if ( '' === $parsed_args['max_depth'] ) {		if ( get_option( 'thread_comments' ) ) {			$parsed_args['max_depth'] = get_option( 'thread_comments_depth' );		} else {			$parsed_args['max_depth'] = -1;		}	}	if ( '' === $parsed_args['page'] ) {		if ( empty( $overridden_cpage ) ) {			$parsed_args['page'] = get_query_var( 'cpage' );		} else {			$threaded            = ( -1 != $parsed_args['max_depth'] );			$parsed_args['page'] = ( 'newest' == get_option( 'default_comments_page' ) ) ? get_comment_pages_count( $_comments, $parsed_args['per_page'], $threaded ) : 1;			set_query_var( 'cpage', $parsed_args['page'] );		}	}	// Validation check	$parsed_args['page'] = intval( $parsed_args['page'] );	if ( 0 == $parsed_args['page'] && 0 != $parsed_args['per_page'] ) {		$parsed_args['page'] = 1;	}	if ( null === $parsed_args['reverse_top_level'] ) {		$parsed_args['reverse_top_level'] = ( 'desc' == get_option( 'comment_order' ) );	}	wp_queue_comments_for_comment_meta_lazyload( $_comments );	if ( empty( $parsed_args['walker'] ) ) {		$walker = new Walker_Comment;	} else {		$walker = $parsed_args['walker'];	}	$output = $walker->paged_walk( $_comments, $parsed_args['max_depth'], $parsed_args['page'], $parsed_args['per_page'], $parsed_args );	$in_comment_loop = false;	if ( $parsed_args['echo'] ) {		echo $output;	} else {		return $output;	}}/** * Outputs a complete commenting form for use within a template. * * Most strings and form fields may be controlled through the $args array passed * into the function, while you may also choose to use the {@see 'comment_form_default_fields'} * filter to modify the array of default fields if you'd just like to add a new * one or remove a single field. All fields are also individually passed through * a filter of the {@see 'comment_form_field_$name'} where $name is the key used * in the array of fields. * * @since 3.0.0 * @since 4.1.0 Introduced the 'class_submit' argument. * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments. * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after', *              'cancel_reply_before', and 'cancel_reply_after' arguments. * @since 4.5.0 The 'author', 'email', and 'url' form fields are limited to 245, 100, *              and 200 characters, respectively. * @since 4.6.0 Introduced the 'action' argument. * @since 4.9.6 Introduced the 'cookies' default comment field. * * @param array       $args { *     Optional. Default arguments and form fields to override. * *     @type array $fields { *         Default comment fields, filterable by default via the {@see 'comment_form_default_fields'} hook. * *         @type string $author  Comment author field HTML. *         @type string $email   Comment author email field HTML. *         @type string $url     Comment author URL field HTML. *         @type string $cookies Comment cookie opt-in field HTML. *     } *     @type string $comment_field        The comment textarea field HTML. *     @type string $must_log_in          HTML element for a 'must be logged in to comment' message. *     @type string $logged_in_as         HTML element for a 'logged in as [user]' message. *     @type string $comment_notes_before HTML element for a message displayed before the comment fields *                                        if the user is not logged in. *                                        Default 'Your email address will not be published.'. *     @type string $comment_notes_after  HTML element for a message displayed after the textarea field. *     @type string $action               The comment form element action attribute. Default '/wp-comments-post.php'. *     @type string $id_form              The comment form element id attribute. Default 'commentform'. *     @type string $id_submit            The comment submit element id attribute. Default 'submit'. *     @type string $class_form           The comment form element class attribute. Default 'comment-form'. *     @type string $class_submit         The comment submit element class attribute. Default 'submit'. *     @type string $name_submit          The comment submit element name attribute. Default 'submit'. *     @type string $title_reply          The translatable 'reply' button label. Default 'Leave a Reply'. *     @type string $title_reply_to       The translatable 'reply-to' button label. Default 'Leave a Reply to %s', *                                        where %s is the author of the comment being replied to. *     @type string $title_reply_before   HTML displayed before the comment form title. *                                        Default: '<h3 id="reply-title" class="comment-reply-title">'. *     @type string $title_reply_after    HTML displayed after the comment form title. *                                        Default: '</h3>'. *     @type string $cancel_reply_before  HTML displayed before the cancel reply link. *     @type string $cancel_reply_after   HTML displayed after the cancel reply link. *     @type string $cancel_reply_link    The translatable 'cancel reply' button label. Default 'Cancel reply'. *     @type string $label_submit         The translatable 'submit' button label. Default 'Post a comment'. *     @type string $submit_button        HTML format for the Submit button. *                                        Default: '<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />'. *     @type string $submit_field         HTML format for the markup surrounding the Submit button and comment hidden *                                        fields. Default: '<p class="form-submit">%1$s %2$s</p>', where %1$s is the *                                        submit button markup and %2$s is the comment hidden fields. *     @type string $format               The comment form format. Default 'xhtml'. Accepts 'xhtml', 'html5'. * } * @param int|WP_Post $post_id Post ID or WP_Post object to generate the form for. Default current post. */function comment_form( $args = array(), $post_id = null ) {	if ( null === $post_id ) {		$post_id = get_the_ID();	}	// Exit the function when comments for the post are closed.	if ( ! comments_open( $post_id ) ) {		/**		 * Fires after the comment form if comments are closed.		 *		 * @since 3.0.0		 */		do_action( 'comment_form_comments_closed' );		return;	}	$commenter     = wp_get_current_commenter();	$user          = wp_get_current_user();	$user_identity = $user->exists() ? $user->display_name : '';	$args = wp_parse_args( $args );	if ( ! isset( $args['format'] ) ) {		$args['format'] = current_theme_supports( 'html5', 'comment-form' ) ? 'html5' : 'xhtml';	}	$req      = get_option( 'require_name_email' );	$html_req = ( $req ? " required='required'" : '' );	$html5    = 'html5' === $args['format'];	$fields = array(		'author' => sprintf(			'<p class="comment-form-author">%s %s</p>',			sprintf(				'<label for="author">%s%s</label>',				__( 'Name' ),				( $req ? ' <span class="required">*</span>' : '' )			),			sprintf(				'<input id="author" name="author" type="text" value="%s" size="30" maxlength="245"%s />',				esc_attr( $commenter['comment_author'] ),				$html_req			)		),		'email'  => sprintf(			'<p class="comment-form-email">%s %s</p>',			sprintf(				'<label for="email">%s%s</label>',				__( 'Email' ),				( $req ? ' <span class="required">*</span>' : '' )			),			sprintf(				'<input id="email" name="email" %s value="%s" size="30" maxlength="100" aria-describedby="email-notes"%s />',				( $html5 ? 'type="email"' : 'type="text"' ),				esc_attr( $commenter['comment_author_email'] ),				$html_req			)		),		'url'    => sprintf(			'<p class="comment-form-url">%s %s</p>',			sprintf(				'<label for="url">%s</label>',				__( 'Website' )			),			sprintf(				'<input id="url" name="url" %s value="%s" size="30" maxlength="200" />',				( $html5 ? 'type="url"' : 'type="text"' ),				esc_attr( $commenter['comment_author_url'] )			)		),	);	if ( has_action( 'set_comment_cookies', 'wp_set_comment_cookies' ) && get_option( 'show_comments_cookies_opt_in' ) ) {		$consent = empty( $commenter['comment_author_email'] ) ? '' : ' checked="checked"';		$fields['cookies'] = sprintf(			'<p class="comment-form-cookies-consent">%s %s</p>',			sprintf(				'<input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"%s />',				$consent			),			sprintf(				'<label for="wp-comment-cookies-consent">%s</label>',				__( 'Save my name, email, and website in this browser for the next time I comment.' )			)		);		// Ensure that the passed fields include cookies consent.		if ( isset( $args['fields'] ) && ! isset( $args['fields']['cookies'] ) ) {			$args['fields']['cookies'] = $fields['cookies'];		}	}	$required_text = sprintf(		/* translators: %s: Asterisk symbol (*). */		' ' . __( 'Required fields are marked %s' ),		'<span class="required">*</span>'	);	/**	 * Filters the default comment form fields.	 *	 * @since 3.0.0	 *	 * @param string[] $fields Array of the default comment fields.	 */	$fields = apply_filters( 'comment_form_default_fields', $fields );	$defaults = array(		'fields'               => $fields,		'comment_field'        => sprintf(			'<p class="comment-form-comment">%s %s</p>',			sprintf(				'<label for="comment">%s</label>',				_x( 'Comment', 'noun' )			),			'<textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea>'		),		'must_log_in'          => sprintf(			'<p class="must-log-in">%s</p>',			sprintf(				/* translators: %s: Login URL. */				__( 'You must be <a href="%s">logged in</a> to post a comment.' ),				/** This filter is documented in wp-includes/link-template.php */				wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) )			)		),		'logged_in_as'         => sprintf(			'<p class="logged-in-as">%s</p>',			sprintf(				/* translators: 1: Edit user link, 2: Accessibility text, 3: User name, 4: Logout URL. */				__( '<a href="%1$s" aria-label="%2$s">Logged in as %3$s</a>. <a href="%4$s">Log out?</a>' ),				get_edit_user_link(),				/* translators: %s: User name. */				esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity ) ),				$user_identity,				/** This filter is documented in wp-includes/link-template.php */				wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ), $post_id ) )			)		),		'comment_notes_before' => sprintf(			'<p class="comment-notes">%s%s</p>',			sprintf(				'<span id="email-notes">%s</span>',				__( 'Your email address will not be published.' )			),			( $req ? $required_text : '' )		),		'comment_notes_after'  => '',		'action'               => site_url( '/wp-comments-post.php' ),		'id_form'              => 'commentform',		'id_submit'            => 'submit',		'class_form'           => 'comment-form',		'class_submit'         => 'submit',		'name_submit'          => 'submit',		'title_reply'          => __( 'Leave a Reply' ),		/* translators: %s: Author of the comment being replied to. */		'title_reply_to'       => __( 'Leave a Reply to %s' ),		'title_reply_before'   => '<h3 id="reply-title" class="comment-reply-title">',		'title_reply_after'    => '</h3>',		'cancel_reply_before'  => ' <small>',		'cancel_reply_after'   => '</small>',		'cancel_reply_link'    => __( 'Cancel reply' ),		'label_submit'         => __( 'Post Comment' ),		'submit_button'        => '<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />',		'submit_field'         => '<p class="form-submit">%1$s %2$s</p>',		'format'               => 'xhtml',	);	/**	 * Filters the comment form default arguments.	 *	 * Use {@see 'comment_form_default_fields'} to filter the comment fields.	 *	 * @since 3.0.0	 *	 * @param array $defaults The default comment form arguments.	 */	$args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) );	// Ensure that the filtered args contain all required default values.	$args = array_merge( $defaults, $args );	// Remove aria-describedby from the email field if there's no associated description.	if ( false === strpos( $args['comment_notes_before'], 'id="email-notes"' ) ) {		$args['fields']['email'] = str_replace(			' aria-describedby="email-notes"',			'',			$args['fields']['email']		);	}	/**	 * Fires before the comment form.	 *	 * @since 3.0.0	 */	do_action( 'comment_form_before' );	?>	<div id="respond" class="comment-respond">		<?php		echo $args['title_reply_before'];		comment_form_title( $args['title_reply'], $args['title_reply_to'] );		echo $args['cancel_reply_before'];		cancel_comment_reply_link( $args['cancel_reply_link'] );		echo $args['cancel_reply_after'];		echo $args['title_reply_after'];		if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) :			echo $args['must_log_in'];			/**			 * Fires after the HTML-formatted 'must log in after' message in the comment form.			 *			 * @since 3.0.0			 */			do_action( 'comment_form_must_log_in_after' );		else :			printf(				'<form action="%s" method="post" id="%s" class="%s"%s>',				esc_url( $args['action'] ),				esc_attr( $args['id_form'] ),				esc_attr( $args['class_form'] ),				( $html5 ? ' novalidate' : '' )			);			/**			 * Fires at the top of the comment form, inside the form tag.			 *			 * @since 3.0.0			 */			do_action( 'comment_form_top' );			if ( is_user_logged_in() ) :				/**				 * Filters the 'logged in' message for the comment form for display.				 *				 * @since 3.0.0				 *				 * @param string $args_logged_in The logged-in-as HTML-formatted message.				 * @param array  $commenter      An array containing the comment author's				 *                               username, email, and URL.				 * @param string $user_identity  If the commenter is a registered user,				 *                               the display name, blank otherwise.				 */				echo apply_filters( 'comment_form_logged_in', $args['logged_in_as'], $commenter, $user_identity );				/**				 * Fires after the is_user_logged_in() check in the comment form.				 *				 * @since 3.0.0				 *				 * @param array  $commenter     An array containing the comment author's				 *                              username, email, and URL.				 * @param string $user_identity If the commenter is a registered user,				 *                              the display name, blank otherwise.				 */				do_action( 'comment_form_logged_in_after', $commenter, $user_identity );			else :				echo $args['comment_notes_before'];			endif;			// Prepare an array of all fields, including the textarea.			$comment_fields = array( 'comment' => $args['comment_field'] ) + (array) $args['fields'];			/**			 * Filters the comment form fields, including the textarea.			 *			 * @since 4.4.0			 *			 * @param array $comment_fields The comment fields.			 */			$comment_fields = apply_filters( 'comment_form_fields', $comment_fields );			// Get an array of field names, excluding the textarea			$comment_field_keys = array_diff( array_keys( $comment_fields ), array( 'comment' ) );			// Get the first and the last field name, excluding the textarea			$first_field = reset( $comment_field_keys );			$last_field  = end( $comment_field_keys );			foreach ( $comment_fields as $name => $field ) {				if ( 'comment' === $name ) {					/**					 * Filters the content of the comment textarea field for display.					 *					 * @since 3.0.0					 *					 * @param string $args_comment_field The content of the comment textarea field.					 */					echo apply_filters( 'comment_form_field_comment', $field );					echo $args['comment_notes_after'];				} elseif ( ! is_user_logged_in() ) {					if ( $first_field === $name ) {						/**						 * Fires before the comment fields in the comment form, excluding the textarea.						 *						 * @since 3.0.0						 */						do_action( 'comment_form_before_fields' );					}					/**					 * Filters a comment form field for display.					 *					 * The dynamic portion of the filter hook, `$name`, refers to the name					 * of the comment form field. Such as 'author', 'email', or 'url'.					 *					 * @since 3.0.0					 *					 * @param string $field The HTML-formatted output of the comment form field.					 */					echo apply_filters( "comment_form_field_{$name}", $field ) . "\n";					if ( $last_field === $name ) {						/**						 * Fires after the comment fields in the comment form, excluding the textarea.						 *						 * @since 3.0.0						 */						do_action( 'comment_form_after_fields' );					}				}			}			$submit_button = sprintf(				$args['submit_button'],				esc_attr( $args['name_submit'] ),				esc_attr( $args['id_submit'] ),				esc_attr( $args['class_submit'] ),				esc_attr( $args['label_submit'] )			);			/**			 * Filters the submit button for the comment form to display.			 *			 * @since 4.2.0			 *			 * @param string $submit_button HTML markup for the submit button.			 * @param array  $args          Arguments passed to comment_form().			 */			$submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args );			$submit_field = sprintf(				$args['submit_field'],				$submit_button,				get_comment_id_fields( $post_id )			);			/**			 * Filters the submit field for the comment form to display.			 *			 * The submit field includes the submit button, hidden fields for the			 * comment form, and any wrapper markup.			 *			 * @since 4.2.0			 *			 * @param string $submit_field HTML markup for the submit field.			 * @param array  $args         Arguments passed to comment_form().			 */			echo apply_filters( 'comment_form_submit_field', $submit_field, $args );			/**			 * Fires at the bottom of the comment form, inside the closing </form> tag.			 *			 * @since 1.5.0			 *			 * @param int $post_id The post ID.			 */			do_action( 'comment_form', $post_id );			echo '</form>';		endif;		?>	</div><!-- #respond -->	<?php	/**	 * Fires after the comment form.	 *	 * @since 3.0.0	 */	do_action( 'comment_form_after' );}
 |