octicon-file-text"> css-selection.js 77628cf8bf first comm 3 lat temu css-shapes.js 77628cf8bf first comm 3 lat temu css-snappoints.js 77628cf8bf first comm 3 lat temu css-sticky.js 77628cf8bf first comm 3 lat temu css-subgrid.js 77628cf8bf first comm 3 lat temu css-supports-api.js 77628cf8bf first comm 3 lat temu css-table.js 77628cf8bf first comm 3 lat temu css-text-align-last.js 77628cf8bf first comm 3 lat temu css-text-box-trim.js 77628cf8bf first comm 3 lat temu css-text-indent.js 77628cf8bf first comm 3 lat temu css-text-justify.js 77628cf8bf first comm 3 lat temu css-text-orientation.js 77628cf8bf first comm 3 lat temu css-text-spacing.js 77628cf8bf first comm 3 lat temu css-textshadow.js 77628cf8bf first comm 3 lat temu css-touch-action.js 77628cf8bf first comm 3 lat temu css-transitions.js 77628cf8bf first comm 3 lat temu css-unicode-bidi.js 77628cf8bf first comm 3 lat temu css-unset-value.js 77628cf8bf first comm 3 lat temu css-variables.js 77628cf8bf first comm 3 lat temu css-when-else.js 77628cf8bf first comm 3 lat temu css-widows-orphans.js 77628cf8bf first comm 3 lat temu css-width-stretch.js 77628cf8bf first comm 3 lat temu css-writing-mode.js 77628cf8bf first comm 3 lat temu css-zoom.js 77628cf8bf first comm 3 lat temu css3-attr.js 77628cf8bf first comm 3 lat temu css3-boxsizing.js 77628cf8bf first comm 3 lat temu css3-colors.js 77628cf8bf first comm 3 lat temu css3-cursors-grab.js 77628cf8bf first comm 3 lat temu css3-cursors-newer.js 77628cf8bf first comm 3 lat temu css3-cursors.js 77628cf8bf first comm 3 lat temu css3-tabsize.js 77628cf8bf first comm 3 lat temu currentcolor.js 77628cf8bf first comm 3 lat temu custom-elements.js 77628cf8bf first comm 3 lat temu custom-elementsv1.js 77628cf8bf first comm 3 lat temu customevent.js 77628cf8bf first comm 3 lat temu datalist.js 77628cf8bf first comm 3 lat temu dataset.js 77628cf8bf first comm 3 lat temu datauri.js 77628cf8bf first comm 3 lat temu date-tolocaledatestring.js 77628cf8bf first comm 3 lat temu declarative-shadow-dom.js 77628cf8bf first comm 3 lat temu decorators.js 77628cf8bf first comm 3 lat temu details.js 77628cf8bf first comm 3 lat temu deviceorientation.js 77628cf8bf first comm 3 lat temu devicepixelratio.js 77628cf8bf first comm 3 lat temu dialog.js 77628cf8bf first comm 3 lat temu dispatchevent.js 77628cf8bf first comm 3 lat temu dnssec.js 77628cf8bf first comm 3 lat temu do-not-track.js 77628cf8bf first comm 3 lat temu document-currentscript.js 77628cf8bf first comm 3 lat temu document-evaluate-xpath.js 77628cf8bf first comm 3 lat temu document-execcommand.js 77628cf8bf first comm 3 lat temu document-policy.js 77628cf8bf first comm 3 lat temu document-scrollingelement.js 77628cf8bf first comm 3 lat temu documenthead.js 77628cf8bf first comm 3 lat temu dom-manip-convenience.js 77628cf8bf first comm 3 lat temu dom-range.js 77628cf8bf first comm 3 lat temu domcontentloaded.js 77628cf8bf first comm 3 lat temu dommatrix.js 77628cf8bf first comm 3 lat temu download.js 77628cf8bf first comm 3 lat temu dragndrop.js 77628cf8bf first comm 3 lat temu element-closest.js 77628cf8bf first comm 3 lat temu element-from-point.js 77628cf8bf first comm 3 lat temu element-scroll-methods.js 77628cf8bf first comm 3 lat temu eme.js 77628cf8bf first comm 3 lat temu eot.js 77628cf8bf first comm 3 lat temu es5.js 77628cf8bf first comm 3 lat temu es6-class.js 77628cf8bf first comm 3 lat temu es6-generators.js 77628cf8bf first comm 3 lat temu es6-module-dynamic-import.js 77628cf8bf first comm 3 lat temu es6-module.js 77628cf8bf first comm 3 lat temu es6-number.js 77628cf8bf first comm 3 lat temu es6-string-includes.js 77628cf8bf first comm 3 lat temu es6.js 77628cf8bf first comm 3 lat temu eventsource.js 77628cf8bf first comm 3 lat temu extended-system-fonts.js 77628cf8bf first comm 3 lat temu feature-policy.js 77628cf8bf first comm 3 lat temu fetch.js 77628cf8bf first comm 3 lat temu fieldset-disabled.js 77628cf8bf first comm 3 lat temu fileapi.js 77628cf8bf first comm 3 lat temu filereader.js 77628cf8bf first comm 3 lat temu filereadersync.js 77628cf8bf first comm 3 lat temu filesystem.js 77628cf8bf first comm 3 lat temu flac.js 77628cf8bf first comm 3 lat temu flexbox-gap.js 77628cf8bf first comm 3 lat temu flexbox.js 77628cf8bf first comm 3 lat temu flow-root.js 77628cf8bf first comm 3 lat temu focusin-focusout-events.js 77628cf8bf first comm 3 lat temu font-family-system-ui.js 77628cf8bf first comm 3 lat temu font-feature.js 77628cf8bf first comm 3 lat temu font-kerning.js 77628cf8bf first comm 3 lat temu font-loading.js 77628cf8bf first comm 3 lat temu font-size-adjust.js 77628cf8bf first comm 3 lat temu font-smooth.js 77628cf8bf first comm 3 lat temu font-unicode-range.js 77628cf8bf first comm 3 lat temu font-variant-alternates.js 77628cf8bf first comm 3 lat temu font-variant-numeric.js 77628cf8bf first comm 3 lat temu fontface.js 77628cf8bf first comm 3 lat temu form-attribute.js 77628cf8bf first comm 3 lat temu form-submit-attributes.js 77628cf8bf first comm 3 lat temu form-validation.js 77628cf8bf first comm 3 lat temu forms.js 77628cf8bf first comm 3 lat temu fullscreen.js 77628cf8bf first comm 3 lat temu gamepad.js 77628cf8bf first comm 3 lat temu geolocation.js 77628cf8bf first comm 3 lat temu getboundingclientrect.js 77628cf8bf first comm 3 lat temu getcomputedstyle.js 77628cf8bf first comm 3 lat temu getelementsbyclassname.js 77628cf8bf first comm 3 lat temu getrandomvalues.js 77628cf8bf first comm 3 lat temu gyroscope.js 77628cf8bf first comm 3 lat temu hardwareconcurrency.js 77628cf8bf first comm 3 lat temu hashchange.js 77628cf8bf first comm 3 lat temu heif.js 77628cf8bf first comm 3 lat temu hevc.js 77628cf8bf first comm 3 lat temu hidden.js 77628cf8bf first comm 3 lat temu high-resolution-time.js 77628cf8bf first comm 3 lat temu history.js 77628cf8bf first comm 3 lat temu html-media-capture.js 77628cf8bf first comm 3 lat temu html5semantic.js 77628cf8bf first comm 3 lat temu http-live-streaming.js 77628cf8bf first comm 3 lat temu http2.js 77628cf8bf first comm 3 lat temu http3.js 77628cf8bf first comm 3 lat temu iframe-sandbox.js 77628cf8bf first comm 3 lat temu iframe-seamless.js 77628cf8bf first comm 3 lat temu iframe-srcdoc.js 77628cf8bf first comm 3 lat temu imagecapture.js 77628cf8bf first comm 3 lat temu ime.js 77628cf8bf first comm 3 lat temu img-naturalwidth-naturalheight.js 77628cf8bf first comm 3 lat temu import-maps.js 77628cf8bf first comm 3 lat temu imports.js 77628cf8bf first comm 3 lat temu indeterminate-checkbox.js 77628cf8bf first comm 3 lat temu indexeddb.js 77628cf8bf first comm 3 lat temu indexeddb2.js 77628cf8bf first comm 3 lat temu inline-block.js 77628cf8bf first comm 3 lat temu innertext.js 77628cf8bf first comm 3 lat temu input-autocomplete-onoff.js 77628cf8bf first comm 3 lat temu input-color.js 77628cf8bf first comm 3 lat temu input-datetime.js 77628cf8bf first comm 3 lat temu input-email-tel-url.js 77628cf8bf first comm 3 lat temu input-event.js 77628cf8bf first comm 3 lat temu input-file-accept.js 77628cf8bf first comm 3 lat temu input-file-directory.js 77628cf8bf first comm 3 lat temu input-file-multiple.js 77628cf8bf first comm 3 lat temu input-inputmode.js 77628cf8bf first comm 3 lat temu input-minlength.js 77628cf8bf first comm 3 lat temu input-number.js 77628cf8bf first comm 3 lat temu input-pattern.js 77628cf8bf first comm 3 lat temu input-placeholder.js 77628cf8bf first comm 3 lat temu input-range.js 77628cf8bf first comm 3 lat temu input-search.js 77628cf8bf first comm 3 lat temu input-selection.js 77628cf8bf first comm 3 lat temu insert-adjacent.js 77628cf8bf first comm 3 lat temu insertadjacenthtml.js 77628cf8bf first comm 3 lat temu internationalization.js 77628cf8bf first comm 3 lat temu intersectionobserver-v2.js 77628cf8bf first comm 3 lat temu intersectionobserver.js 77628cf8bf first comm 3 lat temu intl-pluralrules.js 77628cf8bf first comm 3 lat temu intrinsic-width.js 77628cf8bf first comm 3 lat temu jpeg2000.js 77628cf8bf first comm 3 lat temu jpegxl.js 77628cf8bf first comm 3 lat temu jpegxr.js 77628cf8bf first comm 3 lat temu js-regexp-lookbehind.js 77628cf8bf first comm 3 lat temu json.js 77628cf8bf first comm 3 lat temu justify-content-space-evenly.js 77628cf8bf first comm 3 lat temu kerning-pairs-ligatures.js 77628cf8bf first comm 3 lat temu keyboardevent-charcode.js 77628cf8bf first comm 3 lat temu keyboardevent-code.js 77628cf8bf first comm 3 lat temu keyboardevent-getmodifierstate.js 77628cf8bf first comm 3 lat temu keyboardevent-key.js 77628cf8bf first comm 3 lat temu keyboardevent-location.js 77628cf8bf first comm 3 lat temu keyboardevent-which.js 77628cf8bf first comm 3 lat temu lazyload.js 77628cf8bf first comm 3 lat temu let.js 77628cf8bf first comm 3 lat temu link-icon-png.js 77628cf8bf first comm 3 lat temu link-icon-svg.js 77628cf8bf first comm 3 lat temu link-rel-dns-prefetch.js 77628cf8bf first comm 3 lat temu link-rel-modulepreload.js 77628cf8bf first comm 3 lat temu link-rel-preconnect.js 77628cf8bf first comm 3 lat temu link-rel-prefetch.js 77628cf8bf first comm 3 lat temu link-rel-preload.js 77628cf8bf first comm 3 lat temu link-rel-prerender.js 77628cf8bf first comm 3 lat temu loading-lazy-attr.js 77628cf8bf first comm 3 lat temu localecompare.js 77628cf8bf first comm 3 lat temu magnetometer.js 77628cf8bf first comm 3 lat temu matchesselector.js 77628cf8bf first comm 3 lat temu matchmedia.js 77628cf8bf first comm 3 lat temu mathml.js 77628cf8bf first comm 3 lat temu maxlength.js 77628cf8bf first comm 3 lat temu mdn-css-unicode-bidi-isolate-override.js 77628cf8bf first comm 3 lat temu mdn-css-unicode-bidi-isolate.js 77628cf8bf first comm 3 lat temu mdn-css-unicode-bidi-plaintext.js 77628cf8bf first comm 3 lat temu mdn-text-decoration-color.js 77628cf8bf first comm 3 lat temu mdn-text-decoration-line.js 77628cf8bf first comm 3 lat temu mdn-text-decoration-shorthand.js 77628cf8bf first comm 3 lat temu mdn-text-decoration-style.js 77628cf8bf first comm 3 lat temu media-fragments.js 77628cf8bf first comm 3 lat temu mediacapture-fromelement.js 77628cf8bf first comm 3 lat temu mediarecorder.js 77628cf8bf first comm 3 lat temu mediasource.js 77628cf8bf first comm 3 lat temu menu.js 77628cf8bf first comm 3 lat temu meta-theme-color.js 77628cf8bf first comm 3 lat temu meter.js 77628cf8bf first comm 3 lat temu midi.js 77628cf8bf first comm 3 lat temu minmaxwh.js 77628cf8bf first comm 3 lat temu mp3.js 77628cf8bf first comm 3 lat temu mpeg-dash.js 77628cf8bf first comm 3 lat temu mpeg4.js 77628cf8bf first comm 3 lat temu multibackgrounds.js 77628cf8bf first comm 3 lat temu multicolumn.js 77628cf8bf first comm 3 lat temu mutation-events.js 77628cf8bf first comm 3 lat temu mutationobserver.js 77628cf8bf first comm 3 lat temu namevalue-storage.js 77628cf8bf first comm 3 lat temu native-filesystem-api.js 77628cf8bf first comm 3 lat temu nav-timing.js 77628cf8bf first comm 3 lat temu netinfo.js 77628cf8bf first comm 3 lat temu notifications.js 77628cf8bf first comm 3 lat temu object-entries.js 77628cf8bf first comm 3 lat temu object-fit.js 77628cf8bf first comm 3 lat temu object-observe.js 77628cf8bf first comm 3 lat temu object-values.js 77628cf8bf first comm 3 lat temu objectrtc.js 77628cf8bf first comm 3 lat temu offline-apps.js 77628cf8bf first comm 3 lat temu offscreencanvas.js 77628cf8bf first comm 3 lat temu ogg-vorbis.js 77628cf8bf first comm 3 lat temu ogv.js 77628cf8bf first comm 3 lat temu ol-reversed.js 77628cf8bf first comm 3 lat temu once-event-listener.js 77628cf8bf first comm 3 lat temu online-status.js 77628cf8bf first comm 3 lat temu opus.js 77628cf8bf first comm 3 lat temu orientation-sensor.js 77628cf8bf first comm 3 lat temu outline.js 77628cf8bf first comm 3 lat temu pad-start-end.js 77628cf8bf first comm 3 lat temu page-transition-events.js 77628cf8bf first comm 3 lat temu pagevisibility.js 77628cf8bf first comm 3 lat temu passive-event-listener.js 77628cf8bf first comm 3 lat temu passwordrules.js 77628cf8bf first comm 3 lat temu path2d.js 77628cf8bf first comm 3 lat temu payment-request.js 77628cf8bf first comm 3 lat temu pdf-viewer.js 77628cf8bf first comm 3 lat temu permissions-api.js 77628cf8bf first comm 3 lat temu permissions-policy.js 77628cf8bf first comm 3 lat temu picture-in-picture.js 77628cf8bf first comm 3 lat temu picture.js 77628cf8bf first comm 3 lat temu ping.js 77628cf8bf first comm 3 lat temu png-alpha.js 77628cf8bf first comm 3 lat temu pointer-events.js 77628cf8bf first comm 3 lat temu pointer.js 77628cf8bf first comm 3 lat temu pointerlock.js 77628cf8bf first comm 3 lat temu portals.js 77628cf8bf first comm 3 lat temu prefers-color-scheme.js 77628cf8bf first comm 3 lat temu prefers-reduced-motion.js 77628cf8bf first comm 3 lat temu progress.js 77628cf8bf first comm 3 lat temu promise-finally.js 77628cf8bf first comm 3 lat temu promises.js 77628cf8bf first comm 3 lat temu proximity.js 77628cf8bf first comm 3 lat temu proxy.js 77628cf8bf first comm 3 lat temu publickeypinning.js 77628cf8bf first comm 3 lat temu push-api.js 77628cf8bf first comm 3 lat temu queryselector.js 77628cf8bf first comm 3 lat temu readonly-attr.js 77628cf8bf first comm 3 lat temu referrer-policy.js 77628cf8bf first comm 3 lat temu registerprotocolhandler.js 77628cf8bf first comm 3 lat temu rel-noopener.js 77628cf8bf first comm 3 lat temu rel-noreferrer.js 77628cf8bf first comm 3 lat temu rellist.js 77628cf8bf first comm 3 lat temu rem.js 77628cf8bf first comm 3 lat temu requestanimationframe.js 77628cf8bf first comm 3 lat temu requestidlecallback.js 77628cf8bf first comm 3 lat temu resizeobserver.js 77628cf8bf first comm 3 lat temu resource-timing.js 77628cf8bf first comm 3 lat temu rest-parameters.js 77628cf8bf first comm 3 lat temu rtcpeerconnection.js 77628cf8bf first comm 3 lat temu ruby.js 77628cf8bf first comm 3 lat temu run-in.js 77628cf8bf first comm 3 lat temu same-site-cookie-attribute.js 77628cf8bf first comm 3 lat temu screen-orientation.js 77628cf8bf first comm 3 lat temu script-async.js 77628cf8bf first comm 3 lat temu script-defer.js 77628cf8bf first comm 3 lat temu scrollintoview.js 77628cf8bf first comm 3 lat temu scrollintoviewifneeded.js 77628cf8bf first comm 3 lat temu sdch.js 77628cf8bf first comm 3 lat temu selection-api.js 77628cf8bf first comm 3 lat temu server-timing.js 77628cf8bf first comm 3 lat temu serviceworkers.js 77628cf8bf first comm 3 lat temu setimmediate.js 77628cf8bf first comm 3 lat temu shadowdom.js 77628cf8bf first comm 3 lat temu shadowdomv1.js 77628cf8bf first comm 3 lat temu sharedarraybuffer.js 77628cf8bf first comm 3 lat temu sharedworkers.js 77628cf8bf first comm 3 lat temu sni.js 77628cf8bf first comm 3 lat temu spdy.js 77628cf8bf first comm 3 lat temu speech-recognition.js 77628cf8bf first comm 3 lat temu speech-synthesis.js 77628cf8bf first comm 3 lat temu spellcheck-attribute.js 77628cf8bf first comm 3 lat temu sql-storage.js 77628cf8bf first comm 3 lat temu srcset.js 77628cf8bf first comm 3 lat temu stream.js 77628cf8bf first comm 3 lat temu streams.js 77628cf8bf first comm 3 lat temu stricttransportsecurity.js 77628cf8bf first comm 3 lat temu style-scoped.js 77628cf8bf first comm 3 lat temu subresource-bundling.js 77628cf8bf first comm 3 lat temu subresource-integrity.js 77628cf8bf first comm 3 lat temu svg-css.js 77628cf8bf first comm 3 lat temu svg-filters.js 77628cf8bf first comm 3 lat temu svg-fonts.js 77628cf8bf first comm 3 lat temu svg-fragment.js 77628cf8bf first comm 3 lat temu svg-html.js 77628cf8bf first comm 3 lat temu svg-html5.js 77628cf8bf first comm 3 lat temu svg-img.js 77628cf8bf first comm 3 lat temu svg-smil.js 77628cf8bf first comm 3 lat temu svg.js 77628cf8bf first comm 3 lat temu sxg.js 77628cf8bf first comm 3 lat temu tabindex-attr.js 77628cf8bf first comm 3 lat temu template-literals.js 77628cf8bf first comm 3 lat temu template.js 77628cf8bf first comm 3 lat temu temporal.js 77628cf8bf first comm 3 lat temu testfeat.js 77628cf8bf first comm 3 lat temu text-decoration.js 77628cf8bf first comm 3 lat temu text-emphasis.js 77628cf8bf first comm 3 lat temu text-overflow.js 77628cf8bf first comm 3 lat temu text-size-adjust.js 77628cf8bf first comm 3 lat temu text-stroke.js 77628cf8bf first comm 3 lat temu textcontent.js 77628cf8bf first comm 3 lat temu textencoder.js 77628cf8bf first comm 3 lat temu tls1-1.js 77628cf8bf first comm 3 lat temu tls1-2.js 77628cf8bf first comm 3 lat temu tls1-3.js 77628cf8bf first comm 3 lat temu touch.js 77628cf8bf first comm 3 lat temu transforms2d.js 77628cf8bf first comm 3 lat temu transforms3d.js 77628cf8bf first comm 3 lat temu trusted-types.js 77628cf8bf first comm 3 lat temu ttf.js 77628cf8bf first comm 3 lat temu typedarrays.js 77628cf8bf first comm 3 lat temu u2f.js 77628cf8bf first comm 3 lat temu unhandledrejection.js 77628cf8bf first comm 3 lat temu upgradeinsecurerequests.js 77628cf8bf first comm 3 lat temu url-scroll-to-text-fragment.js 77628cf8bf first comm 3 lat temu url.js 77628cf8bf first comm 3 lat temu urlsearchparams.js 77628cf8bf first comm 3 lat temu use-strict.js 77628cf8bf first comm 3 lat temu user-select-none.js 77628cf8bf first comm 3 lat temu user-timing.js 77628cf8bf first comm 3 lat temu variable-fonts.js 77628cf8bf first comm 3 lat temu vector-effect.js 77628cf8bf first comm 3 lat temu vibration.js 77628cf8bf first comm 3 lat temu video.js 77628cf8bf first comm 3 lat temu videotracks.js 77628cf8bf first comm 3 lat temu viewport-unit-variants.js 77628cf8bf first comm 3 lat temu viewport-units.js 77628cf8bf first comm 3 lat temu wai-aria.js 77628cf8bf first comm 3 lat temu wake-lock.js 77628cf8bf first comm 3 lat temu wasm.js 77628cf8bf first comm 3 lat temu wav.js 77628cf8bf first comm 3 lat temu wbr-element.js 77628cf8bf first comm 3 lat temu web-animation.js 77628cf8bf first comm 3 lat temu web-app-manifest.js 77628cf8bf first comm 3 lat temu web-bluetooth.js 77628cf8bf first comm 3 lat temu web-serial.js 77628cf8bf first comm 3 lat temu web-share.js 77628cf8bf first comm 3 lat temu webauthn.js 77628cf8bf first comm 3 lat temu webcodecs.js 77628cf8bf first comm 3 lat temu webgl.js 77628cf8bf first comm 3 lat temu webgl2.js 77628cf8bf first comm 3 lat temu webgpu.js 77628cf8bf first comm 3 lat temu webhid.js 77628cf8bf first comm 3 lat temu webkit-user-drag.js 77628cf8bf first comm 3 lat temu webm.js 77628cf8bf first comm 3 lat temu webnfc.js 77628cf8bf first comm 3 lat temu webp.js 77628cf8bf first comm 3 lat temu websockets.js 77628cf8bf first comm 3 lat temu webtransport.js 77628cf8bf first comm 3 lat temu webusb.js 77628cf8bf first comm 3 lat temu webvr.js 77628cf8bf first comm 3 lat temu webvtt.js 77628cf8bf first comm 3 lat temu webworkers.js 77628cf8bf first comm 3 lat temu webxr.js 77628cf8bf first comm 3 lat temu will-change.js 77628cf8bf first comm 3 lat temu woff.js 77628cf8bf first comm 3 lat temu woff2.js 77628cf8bf first comm 3 lat temu word-break.js 77628cf8bf first comm 3 lat temu wordwrap.js 77628cf8bf first comm 3 lat temu x-doc-messaging.js 77628cf8bf first comm 3 lat temu x-frame-options.js 77628cf8bf first comm 3 lat temu xhr2.js 77628cf8bf first comm 3 lat temu xhtml.js 77628cf8bf first comm 3 lat temu xhtmlsmil.js 77628cf8bf first comm 3 lat temu xml-serializer.js 77628cf8bf first comm 3 lat temu tum/whitesports - Gogs: Simplico Git Service

Нет описания

edit-comments.php 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <?php
  2. /**
  3. * Edit Comments Administration Screen.
  4. *
  5. * @package WordPress
  6. * @subpackage Administration
  7. */
  8. /** WordPress Administration Bootstrap */
  9. require_once __DIR__ . '/admin.php';
  10. if ( ! current_user_can( 'edit_posts' ) ) {
  11. wp_die(
  12. '<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
  13. '<p>' . __( 'Sorry, you are not allowed to edit comments.' ) . '</p>',
  14. 403
  15. );
  16. }
  17. $wp_list_table = _get_list_table( 'WP_Comments_List_Table' );
  18. $pagenum = $wp_list_table->get_pagenum();
  19. $doaction = $wp_list_table->current_action();
  20. if ( $doaction ) {
  21. check_admin_referer( 'bulk-comments' );
  22. if ( 'delete_all' === $doaction && ! empty( $_REQUEST['pagegen_timestamp'] ) ) {
  23. $comment_status = wp_unslash( $_REQUEST['comment_status'] );
  24. $delete_time = wp_unslash( $_REQUEST['pagegen_timestamp'] );
  25. $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = %s AND %s > comment_date_gmt", $comment_status, $delete_time ) );
  26. $doaction = 'delete';
  27. } elseif ( isset( $_REQUEST['delete_comments'] ) ) {
  28. $comment_ids = $_REQUEST['delete_comments'];
  29. $doaction = $_REQUEST['action'];
  30. } elseif ( isset( $_REQUEST['ids'] ) ) {
  31. $comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) );
  32. } elseif ( wp_get_referer() ) {
  33. wp_safe_redirect( wp_get_referer() );
  34. exit;
  35. }
  36. $approved = 0;
  37. $unapproved = 0;
  38. $spammed = 0;
  39. $unspammed = 0;
  40. $trashed = 0;
  41. $untrashed = 0;
  42. $deleted = 0;
  43. $redirect_to = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'spammed', 'unspammed', 'approved', 'unapproved', 'ids' ), wp_get_referer() );
  44. $redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to );
  45. wp_defer_comment_counting( true );
  46. foreach ( $comment_ids as $comment_id ) { // Check the permissions on each.
  47. if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
  48. continue;
  49. }
  50. switch ( $doaction ) {
  51. case 'approve':
  52. wp_set_comment_status( $comment_id, 'approve' );
  53. $approved++;
  54. break;
  55. case 'unapprove':
  56. wp_set_comment_status( $comment_id, 'hold' );
  57. $unapproved++;
  58. break;
  59. case 'spam':
  60. wp_spam_comment( $comment_id );
  61. $spammed++;
  62. break;
  63. case 'unspam':
  64. wp_unspam_comment( $comment_id );
  65. $unspammed++;
  66. break;
  67. case 'trash':
  68. wp_trash_comment( $comment_id );
  69. $trashed++;
  70. break;
  71. case 'untrash':
  72. wp_untrash_comment( $comment_id );
  73. $untrashed++;
  74. break;
  75. case 'delete':
  76. wp_delete_comment( $comment_id );
  77. $deleted++;
  78. break;
  79. }
  80. }
  81. if ( ! in_array( $doaction, array( 'approve', 'unapprove', 'spam', 'unspam', 'trash', 'delete' ), true ) ) {
  82. $screen = get_current_screen()->id;
  83. /** This action is documented in wp-admin/edit.php */
  84. $redirect_to = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $doaction, $comment_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
  85. }
  86. wp_defer_comment_counting( false );
  87. if ( $approved ) {
  88. $redirect_to = add_query_arg( 'approved', $approved, $redirect_to );
  89. }
  90. if ( $unapproved ) {
  91. $redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to );
  92. }
  93. if ( $spammed ) {
  94. $redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to );
  95. }
  96. if ( $unspammed ) {
  97. $redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to );
  98. }
  99. if ( $trashed ) {
  100. $redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to );
  101. }
  102. if ( $untrashed ) {
  103. $redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to );
  104. }
  105. if ( $deleted ) {
  106. $redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to );
  107. }
  108. if ( $trashed || $spammed ) {
  109. $redirect_to = add_query_arg( 'ids', implode( ',', $comment_ids ), $redirect_to );
  110. }
  111. wp_safe_redirect( $redirect_to );
  112. exit;
  113. } elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
  114. wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
  115. exit;
  116. }
  117. $wp_list_table->prepare_items();
  118. wp_enqueue_script( 'admin-comments' );
  119. enqueue_comment_hotkeys_js();
  120. if ( $post_id ) {
  121. $comments_count = wp_count_comments( $post_id );
  122. $draft_or_post_title = wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' );
  123. if ( $comments_count->moderated > 0 ) {
  124. $title = sprintf(
  125. /* translators: 1: Comments count, 2: Post title. */
  126. __( 'Comments (%1$s) on &#8220;%2$s&#8221;' ),
  127. number_format_i18n( $comments_count->moderated ),
  128. $draft_or_post_title
  129. );
  130. } else {
  131. $title = sprintf(
  132. /* translators: %s: Post title. */
  133. __( 'Comments on &#8220;%s&#8221;' ),
  134. $draft_or_post_title
  135. );
  136. }
  137. } else {
  138. $comments_count = wp_count_comments();
  139. if ( $comments_count->moderated > 0 ) {
  140. $title = sprintf(
  141. /* translators: %s: Comments count. */
  142. __( 'Comments (%s)' ),
  143. number_format_i18n( $comments_count->moderated )
  144. );
  145. } else {
  146. $title = __( 'Comments' );
  147. }
  148. }
  149. add_screen_option( 'per_page' );
  150. get_current_screen()->add_help_tab(
  151. array(
  152. 'id' => 'overview',
  153. 'title' => __( 'Overview' ),
  154. 'content' =>
  155. '<p>' . __( 'You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions.' ) . '</p>',
  156. )
  157. );
  158. get_current_screen()->add_help_tab(
  159. array(
  160. 'id' => 'moderating-comments',
  161. 'title' => __( 'Moderating Comments' ),
  162. 'content' =>
  163. '<p>' . __( 'A red bar on the left means the comment is waiting for you to moderate it.' ) . '</p>' .
  164. '<p>' . __( 'In the <strong>Author</strong> column, in addition to the author&#8217;s name, email address, and blog URL, the commenter&#8217;s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '</p>' .
  165. '<p>' . __( 'In the <strong>Comment</strong> column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '</p>' .
  166. '<p>' . __( 'In the <strong>In response to</strong> column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post.' ) . '</p>' .
  167. '<p>' . __( 'In the <strong>Submitted on</strong> column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site.' ) . '</p>' .
  168. '<p>' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more.' ) . '</p>',
  169. )
  170. );
  171. get_current_screen()->set_help_sidebar(
  172. '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
  173. '<p>' . __( '<a href="https://wordpress.org/support/article/comments-screen/">Documentation on Comments</a>' ) . '</p>' .
  174. '<p>' . __( '<a href="https://wordpress.org/support/article/comment-spam/">Documentation on Comment Spam</a>' ) . '</p>' .
  175. '<p>' . __( '<a href="https://wordpress.org/support/article/keyboard-shortcuts/">Documentation on Keyboard Shortcuts</a>' ) . '</p>' .
  176. '<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'
  177. );
  178. get_current_screen()->set_screen_reader_content(
  179. array(
  180. 'heading_views' => __( 'Filter comments list' ),
  181. 'heading_pagination' => __( 'Comments list navigation' ),
  182. 'heading_list' => __( 'Comments list' ),
  183. )
  184. );
  185. require_once ABSPATH . 'wp-admin/admin-header.php';
  186. ?>
  187. <div class="wrap">
  188. <h1 class="wp-heading-inline">
  189. <?php
  190. if ( $post_id ) {
  191. printf(
  192. /* translators: %s: Link to post. */
  193. __( 'Comments on &#8220;%s&#8221;' ),
  194. sprintf(
  195. '<a href="%1$s">%2$s</a>',
  196. get_edit_post_link( $post_id ),
  197. wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' )
  198. )
  199. );
  200. } else {
  201. _e( 'Comments' );
  202. }
  203. ?>
  204. </h1>
  205. <?php
  206. if ( $post_id ) {
  207. $post_type_object = get_post_type_object( get_post_type( $post_id ) );
  208. if ( $post_type_object ) {
  209. printf(
  210. '<a href="%1$s" class="comments-view-item-link">%2$s</a>',
  211. get_permalink( $post_id ),
  212. $post_type_object->labels->view_item
  213. );
  214. }
  215. }
  216. if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
  217. echo '<span class="subtitle">';
  218. printf(
  219. /* translators: %s: Search query. */
  220. __( 'Search results for: %s' ),
  221. '<strong>' . wp_html_excerpt( esc_html( wp_unslash( $_REQUEST['s'] ) ), 50, '&hellip;' ) . '</strong>'
  222. );
  223. echo '</span>';
  224. }
  225. ?>
  226. <hr class="wp-header-end">
  227. <?php
  228. if ( isset( $_REQUEST['error'] ) ) {
  229. $error = (int) $_REQUEST['error'];
  230. $error_msg = '';
  231. switch ( $error ) {
  232. case 1:
  233. $error_msg = __( 'Invalid comment ID.' );
  234. break;
  235. case 2:
  236. $error_msg = __( 'Sorry, you are not allowed to edit comments on this post.' );
  237. break;
  238. }
  239. if ( $error_msg ) {
  240. echo '<div id="moderated" class="error"><p>' . $error_msg . '</p></div>';
  241. }
  242. }
  243. if ( isset( $_REQUEST['approved'] ) || isset( $_REQUEST['deleted'] ) || isset( $_REQUEST['trashed'] ) || isset( $_REQUEST['untrashed'] ) || isset( $_REQUEST['spammed'] ) || isset( $_REQUEST['unspammed'] ) || isset( $_REQUEST['same'] ) ) {
  244. $approved = isset( $_REQUEST['approved'] ) ? (int) $_REQUEST['approved'] : 0;
  245. $deleted = isset( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0;
  246. $trashed = isset( $_REQUEST['trashed'] ) ? (int) $_REQUEST['trashed'] : 0;
  247. $untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0;
  248. $spammed = isset( $_REQUEST['spammed'] ) ? (int) $_REQUEST['spammed'] : 0;
  249. $unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0;
  250. $same = isset( $_REQUEST['same'] ) ? (int) $_REQUEST['same'] : 0;
  251. if ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) {
  252. if ( $approved > 0 ) {
  253. /* translators: %s: Number of comments. */
  254. $messages[] = sprintf( _n( '%s comment approved.', '%s comments approved.', $approved ), $approved );
  255. }
  256. if ( $spammed > 0 ) {
  257. $ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0;
  258. /* translators: %s: Number of comments. */
  259. $messages[] = sprintf( _n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ), $spammed ) . ' <a href="' . esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=unspam&ids=$ids", 'bulk-comments' ) ) . '">' . __( 'Undo' ) . '</a><br />';
  260. }
  261. if ( $unspammed > 0 ) {
  262. /* translators: %s: Number of comments. */
  263. $messages[] = sprintf( _n( '%s comment restored from the spam.', '%s comments restored from the spam.', $unspammed ), $unspammed );
  264. }
  265. if ( $trashed > 0 ) {
  266. $ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0;
  267. /* translators: %s: Number of comments. */
  268. $messages[] = sprintf( _n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ), $trashed ) . ' <a href="' . esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=untrash&ids=$ids", 'bulk-comments' ) ) . '">' . __( 'Undo' ) . '</a><br />';
  269. }
  270. if ( $untrashed > 0 ) {
  271. /* translators: %s: Number of comments. */
  272. $messages[] = sprintf( _n( '%s comment restored from the Trash.', '%s comments restored from the Trash.', $untrashed ), $untrashed );
  273. }
  274. if ( $deleted > 0 ) {
  275. /* translators: %s: Number of comments. */
  276. $messages[] = sprintf( _n( '%s comment permanently deleted.', '%s comments permanently deleted.', $deleted ), $deleted );
  277. }
  278. if ( $same > 0 ) {
  279. $comment = get_comment( $same );
  280. if ( $comment ) {
  281. switch ( $comment->comment_approved ) {
  282. case '1':
  283. $messages[] = __( 'This comment is already approved.' ) . ' <a href="' . esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ) . '">' . __( 'Edit comment' ) . '</a>';
  284. break;
  285. case 'trash':
  286. $messages[] = __( 'This comment is already in the Trash.' ) . ' <a href="' . esc_url( admin_url( 'edit-comments.php?comment_status=trash' ) ) . '"> ' . __( 'View Trash' ) . '</a>';
  287. break;
  288. case 'spam':
  289. $messages[] = __( 'This comment is already marked as spam.' ) . ' <a href="' . esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ) . '">' . __( 'Edit comment' ) . '</a>';
  290. break;
  291. }
  292. }
  293. }
  294. echo '<div id="moderated" class="updated notice is-dismissible"><p>' . implode( "<br/>\n", $messages ) . '</p></div>';
  295. }
  296. }
  297. ?>
  298. <?php $wp_list_table->views(); ?>
  299. <form id="comments-form" method="get">
  300. <?php $wp_list_table->search_box( __( 'Search Comments' ), 'comment' ); ?>
  301. <?php if ( $post_id ) : ?>
  302. <input type="hidden" name="p" value="<?php echo esc_attr( (int) $post_id ); ?>" />
  303. <?php endif; ?>
  304. <input type="hidden" name="comment_status" value="<?php echo esc_attr( $comment_status ); ?>" />
  305. <input type="hidden" name="pagegen_timestamp" value="<?php echo esc_attr( current_time( 'mysql', 1 ) ); ?>" />
  306. <input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'total_items' ) ); ?>" />
  307. <input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'per_page' ) ); ?>" />
  308. <input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'page' ) ); ?>" />
  309. <?php if ( isset( $_REQUEST['paged'] ) ) { ?>
  310. <input type="hidden" name="paged" value="<?php echo esc_attr( absint( $_REQUEST['paged'] ) ); ?>" />
  311. <?php } ?>
  312. <?php $wp_list_table->display(); ?>
  313. </form>
  314. </div>
  315. <div id="ajax-response"></div>
  316. <?php
  317. wp_comment_reply( '-1', true, 'detail' );
  318. wp_comment_trashnotice();
  319. require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>